Hive安装前扫盲之Derby和Metastore

大数据总是有很多英文单词,你不了解一下根本就没法推进。

比如Hive要涉及到的:derby metastore hiveServer2

后面内容都是转载的,大致内容简单来说就是:

Derby是一个数据库,非常轻量,而Hive只会把元数据存放在关系型数据库中。这是因为这样可以易于共享这些元数据。

Hive 将元数据存储在 RDBMS 中,一般常用 MySQL 和 Derby。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。

内置的derby主要问题是并发性能很差,可以理解为单线程操作。

Derby还有一个特性。更换目录执行操作,会找不到相关表等
比如在/usr下执行创建表,在/usr下可以找到这个表。在/etc下执行查找这个表,就会找不到 。

内嵌的意思就是把Derby嵌入到一个程序里,开启和关闭都由该程序来管理,并不是Derby自己来管理。

metastore呢,metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获取元数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。

thrift服务的意思就是,一些牛逼人把RPC(函数远程调用,这里面涉及到两台服务器之间网络传输的过程,比较复杂)过程封装好,然后这些细节对我们这些菜鸟来说完全透明,只留出接口写道.thrift文件里,然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,比如java开发者,就可以生成java代码,c++开发者可以生成c++代码,生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.挺起来真酷。。。。

hiveserver2,你可能又想了这tmd又是个什么东西。其实他就是提供给客户端执行查询结果的接口。

HiveServer2(HS2)是一个服务端接口使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证

————————————————————————————

derby数据库

一、简介

  Derby 易于管理。当嵌入到客户机应用程序中时, Derby 系统不需要任何管理干预。

  Derby 是可嵌入的。应用程序可以将数据库管理系统( Database Management System , DBMS )引擎嵌入应用程序进程中,从而无需管理单独的数据库进程或服务。通过网络服务器( Network Server )架构或您选择的服务器架构,可以将 Derby 作为单独的进程来运行。

  Derby 是Java 编写的内存数据库,属于 Apache 的一个开源项目,是一个纯 Java 的类库:对于 Java 开发人员,这点十分重要,因为他们正试图维护 Java 技术的优点,例如平台无关性、易于配置以及易于安装。

  Derby 不需要专有的 Java 虚拟机( Java Virtual Machine , JVM )。因为完全是用 Java 语言编写的,所以它适应所有合格的 JVM 。

  DerbyDBMS 引擎是轻量级的。类文件大小大约是 2MB ,并且只使用了 4MB 的 Java 堆。

  Derby 支持使用 Java 编写存储过程和函数,这些存储过程和函数可以在应用程序的任何层上运行。 Derby 没有专用的存储过程语言,它使用JDBC 。

二、两种运行模式

  1.内嵌模式。Derby数据库与应用程序共享同一个JVM,通常由应用程序负责启动和停止,对除启动它的应用程序外的其它应用程序不可见,即其它应用程序不可访问它;

  2.网络模式。Derby数据库独占一个JVM,做为服务器上的一个独立进程运行。在这种模式下,允许有多个应用程序来访问同一个Derby数据库。

三、安装derby

  1.在derby官网下载derby的包,然后解压。

  1. 建立DERBY_HOME,值:D:\db-derby-10.10.2.0-bin  
  2. 在Path加入:%DERBY_HOME%\bin  
  3. 在CLASSPATH加入:  
  4. %DERBY_HOME%\lib \derby.jar;%DERBY_HOME%\lib\derbyclient.jar;%DERBY_HOME%\lib\derbytools.jar;%DERBY_HOME%\lib\derbynet.jar 

  2.运行(使用ij脚本)

    (1)内嵌模式

      在命令行中找到bin目录,使用输入ij使用ij工具(或单击ij.bat后启动ij工具)。然后通过如下命令创建数据库,并与数据库创建连接:

        connect ‘jdbc:derby:mydb;create=true';

      (通过connect命令可以与指定数据库创建连接,通过一个JDBC URL来指定与哪个数据库创建连接。ij命令是不区分大小写的。参数中jdbc:derby是Derby数据库的驱动协议;firstdb是数据库名称,由于没有指定路径,数据库将会被创建在当前你命令行下所在的目录下;create=true表示如果数据库不存在,则创建该数据库;";"是ij命令的终止符。当数据库创建成功时,Derby会在当前你命令行下所在的目录下创建一个与数据库命一致(这里是mydb)的目录,其中存放了数据库的文件。)

      连接之后便可使用SQL语句操作数据库,或通过run命令运行sql文件:run 'E:/derby/demo/ToursDB_schema.sql';

      最后通过exit;来退出ij工具。

      在当前你命令行下所在的目录中有一个derby.log的日志文件,derby在其中记录的数据库启动、关闭的信息。

      连接驱动及URL:

        driver: org.apache.derby.jdbc.EmbeddedDriver

        url: jdbc:derby:E:/shiny/DdlUtils-test/mydb

    (2)网络模式

      网络模式下,需要使用两个控制台窗口,一个用于启动Derby数据库服务端,另一个做为访问Derby数据库的客户端。

      1.在命令行进入bin目录,运行startNetworkServer.bat启动数据库服务器;

      2.另一个端口跟运行内嵌模式的Derby数据库类似,只是连接的命令不同:

         connect 'jdbc:derby://localhost:1527/E:/my/derby/mydb;create=true';

      (其中localhost:1527是本地和端口号,后面的是G盘的某个数据库,也可以是网上的)

      连接驱动及URL:

        driver: org.apache.derby.jdbc.ClientDriver

        url: jdbc:derby://localhost:1527/E:/my/derby/mydb

    注意:两种模式连接数据库时使用的驱动包不同

四、jar包说明

  1.引擎库

    derby.jar是引擎库(必须的) 
    For embedded databases. 
    You always need this library for embedded environments. For client/server environments, you only need this library on the server.

  2.工具库

    1. derbytools.jar: Required for running all the Derby tools (such as ij, dblook, and import/export).
    2. derbyrun.jar: Executable jar file that can be used to start the Derby tools.

  3.网络服务端库

    如果是通过网络连接Derby(非嵌入方式),那么需要这个jar。 
    derbynet.jar: Required to start the Derby Network Server.

  4.网络客户端库

    derbyclient.jar: Required to use the Derby network client driver.

  5.本地语言库

    1. derbyLocale_cs.jar Required to provide translated messages for the Czech locale.
    2. derbyLocale_de_DE.jar Required to provide translated messages for the German locale.
    3. derbyLocale_es.jar Required to provide translated messages for the Spanish locale.
    4. derbyLocale_fr.jar Required to provide translated messages for the French locale.
    5. derbyLocale_hu.jar Required to provide translated messages for the Hungarian locale.
    6. derbyLocale_it.jar Required to provide translated messages for the Italian locale.
    7. derbyLocale_ja_JP.jar Required to provide translated messages for the Japanese locale.
    8. derbyLocale_ko_KR.jar Required to provide translated messages for the Korean locale.
    9. derbyLocale_pl.jar Required to provide translated messages for the Polish locale.
    10. derbyLocale_pt_BR.jar Required to provide translated messages for the Brazilian Portuguese locale.
    11. derbyLocale_ru.jar Required to provide translated messages for the Russian locale.
    12. derbyLocale_zh_CN.jar Required to provide translated messages for the Simplified Chinese locale.
    13. derbyLocale_zh_TW.jar Required to provide translated messages for the Traditional Chinese locale.

hiveServer2 和 metastore的一点解读。

  刚看了hive官网的文档,对于一些概念结合自己的经验,似乎又多了一些理解,想一想还是记下来的好,一来我是个有些健忘的人,过一段时间即便忘了,循着这个帖子,也能快速把知识点抓起来;二来或许对别人也有些启发。不过首先声明,只是我自己的理解,或许也有错误的地方。。

  1. 先吐个槽,hive的官方文档页面导航就是坨翔,当然,内容还是比较充实的。文档并没有分版本,只是在具体某些内容中对不同版本区别介绍;自己菜单的链接点击后,是一个全新的页面,导航实在太不友好了。

  2. metastore

  hive在部署时,要配置hive-site.xml,这里面的配置很重要的一部分是针对metastore的。什么是metastore?官方解释:"All the metadata for Hive tables and partitions are accessed through the Hive Metastore. ",简单翻一下“对所有hive原数据和分区的访问都要通过Hive Metastore”。

另有一段,附我的翻译:

复制代码

 1 Remote Metastore Server
 2 In remote metastore setup, all Hive Clients will make a connection to a metastore server which in turn queries the datastore (MySQL in this example) 
 3 for metadata. Metastore server and client communicate using Thrift Protocol. Starting with Hive 0.5.0, you can start a Thrift server by executing 
 4 the following command:
 5 
 6 远程metastore服务:
 7 启动远程metastore后,hive客户端连接metastore服务,从而可以从数据库(本例中位mysql)查询到原数据信息。metastore服务端和客户端通信是通过thrift协议。从hive 0.5.0版本开始,你可以通过执行
 8 以下命令来启动thrift服务。
 9 
10 hive --service metastore

复制代码

  所以,metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive原数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。

另外需要说明,以上说的是metastore服务(metastore server)的概念。我们后面还会提到metastore数据库(metastore database),metastore 客户端(metastore client)的概念,但其实metastore服务(metastore server)是理解metastore最重要的概念,所以在这里提前单独提到了。

hive中对metastore的配置包含3部分,metastore database,metastore server,metastore client。

其中,metastore database分为Local/Embedded Metastore Database (Derby)和Remote Metastore Database,metastore server也分为Local/Embedded Metastore Server和Remote Metastore Server,本地配置既无太大意义,又要占不少篇幅,我就不讲了,后面的例子都是远程相关配置。

需要注意的几点:

  1)Remote metastore server并不需要额外配置,只要Remote Metastore Database配置好了,"hive --service metastore" 启动metastore会寻找database相关配置。

  2)通常我配置了database,就不配置client了。一般我们的hive都是做服务端的情况较多,不用作为客户端,当然不用客户端的配置了。但是如果仅作为客户端,database配置就不需要了,服务端连元数据库,和客户端没半毛钱直接关系,当然就不需要配置了,但如果作为客户端,而且还要启动hiveServer2服务(该服务也需要访问元数据),那database也是必须配置的。还有一种情况,既是服务端又是客户端,不用说了,都配置上吧。 废话了一大堆,总结一句话,配置多了,一般不会出问题,配少了,就呵呵呵了。。

  3)metastore服务端,客户端的应用场景。spark sql,spark shell终端连接应该就是以客户端的形式连接 hive的metastore服务的。难怪看到官方文档中说准备在3.0版本将metastore独立出去。本来嘛,获取元数据的小活,为什么非得要整合在hive中。

Remote Metastore Database:

Config Param

Config Value

Comment

javax.jdo.option.ConnectionURL

jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true

metadata is stored in a MySQL server

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

MySQL JDBC driver class

javax.jdo.option.ConnectionUserName

<user name>

user name for connecting to MySQL server

javax.jdo.option.ConnectionPassword

<password>

password for connecting to MySQL server

metastore client Parameters

Config Param

Config Value

Comment

hive.metastore.uris

thrift://<host_name>:<port>

host and port for the Thrift metastore server

hive.metastore.local

false

Metastore is remote.  Note: This is no longer needed as of Hive 0.10.  Setting hive.metastore.uri is sufficient.

hive.metastore.warehouse.dir

<base hdfs path>

Points to default location of non-external Hive tables in HDFS.

  3. hiveServer2 

  同样,看一段官方解释:

HiveServer2 (HS2) is a server interface that enables remote clients to execute queries against Hive and retrieve the results (a more detailed intro here). 
The current implementation, based on Thrift RPC, is an improved version of HiveServer and supports multi-client concurrency and authentication.

HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证

  hiveServer2的启动方式有2种:

1 $HIVE_HOME/bin/hiveserver2
2 或者
3 $HIVE_HOME/bin/hive --service hiveserver2

 启动hiveServer2服务后,就可以使用jdbc,odbc,或者thrift的方式连接。 用java编码jdbc或则beeline连接使用jdbc的方式,据说hue是用thrift的方式连接的hive服务。

我的一点疑问,hiveServer2和metastore都会访问元数据,他们的访问方式是怎样的?是相同的,还是相似的。元数据的访问有没有可能仅需要一个服务?我现在访问hive服务需要启动hiveServer2,访问sparksql需要启动metastore,如果两个都会启动metastore,我觉得有些奇怪。

猜你喜欢

转载自blog.csdn.net/u011495642/article/details/83655847