实战Hive和Hbase集成管理

2018-03-04 16:37
网络安全和信息化 2018年10期
关键词:字段命令语句

安装Hive和MySQL

Hive默认使用Derby数据库,因其允许同时有一个用户进行操作。为了便于使用,需要将其替换为MySQL等关系型数据库。这里使用 的 是 MySQL,在 Linux下执 行“sudo rpm -qa|grep mysql”命令,来检测是否安装了MySQL。如果没有安装,可以执行“sudo yum install mysql-server”命令安装。注意,这里只安装其服务端程序。为让安装顺利进行,可以执行“vim /etc/resolv.conf”命令,输入“nameserver x.x.x.x”,设置合适的DNS服务器地址。之后执行“service mysqld start”命令来启动MySQL。

执 行“mysqladmin -u root password 'adminpass'”命令,设置MySQL中的root账户密码。为在Linux命令行中顺利连接MySQl客户端,必须将MySQL数据库“user”表中“root”之外的用户删除。方法是执行“mysql-uroot -padminpass”命令,在MySQL控制台执行“use mysql;”,选择目标数据库,执行“update user set= '%'where user= 'root' and host= 'localhost';”、“flush privileges;”命令,对权限进行修改,让外界的主机可以进行连接。在外部主机上运行Navicat for MySQL工具,点击工具栏上的“连接”按钮,在打开窗口中的“常规”面板中输入其名称、MySQL主机名、账户名和密码,之后执行连接操作。

在左侧打开该连接项目,选择“MYSQL”、“表”项,在右侧双击“user”表,在编辑窗口中删除除了“root”之外的所有账户。在上述“mysql>”提示符下点击“Ctrl+C”键,退出MySQL控制台,执行“chkconfig mysqld on” 命令,可以让MySQL组件跟随系统自动运行。执行“wget http://archive.cloundera.com/cdh/5/hive-x.x.x.tar.gz”之类的命令,从指定的网址下载合适的Hive版本安装包,之后执行“tar -zxf ./hive-x.x.x.tar.gz -C ../hivesoft”命令,将Hive安装包解压到指定路径。在解压路径中进入“conf”目录,执行“cp hive-default.xml.template hive-site.xml”命令,复制得到Hive的配置文件。执行“vim hivesite.xml”命令,将其中的所有内容全部清除,只保存“<configuration>” 和“</configuration>”结构。

依次输入“<property>”、“<name>javax.jdo.option.ConnectionURL</name>”、“<value>jdbc:mysql://hbasesrv.xxx.com:3306/hive?reateDatabaseIfNot Exist=true</value>”、“</property>”、“<property>”、“<name>javax.jdo.option.ConnectionDriverName</name>”、“<value>com.mysql.jdbc.Driver</value>”、“</property>”、“<property>”、“<name>javax.jdo.option.ConnectionUserName</name>”、“<value>root</value>”、“</property>”、“ <property>”、“<name>javax.jdo.option.ConnectionPassword</name>”、“ <value>adminpass</value>”、“</property>”。

以“jdbc:mysql”开 头的内容为指定目标MySQL数

Hive配置

据库连接位置,“com.mysql.jdbc.Driver”指明驱动信息,并执行账户名和密码,这里为“root”和“adminpass”。因为Hive中没有MySQL的驱动,所以需手工导入,在Linux命令行下进入Hive解压路径中的“lib”目录,执行“cp /home/jars/mysqlconnector-java-x.x.xbin .”命令将驱动文件复制进来。因为Hive文件是存储在HDFS中的,所以需要进入Hadoop安装路径中的“sbin”目录,执行“startall.sh”文件启动 Hadoop。执 行“jps”命 令,发 现“Namenode”、“DataNode”、“ResourceManager”、“SecondaryNameNode”、“Jps”等进程都存在,说明启动成功。进入Hive解压路径中的“bin”目录,执行“Hive”命令来启动Hive。

如果启动失败,极有可能是连接问题,一般是由于主机名没有配置正确。执行“hostname”命令,将主机名和上述连接参数中的主机名比对,如有问题,需要将其设置为正确值。如果依然报错,执 行“service mysqld restart”命令重启 MySQL。启动Hive成功后,在“hive>”提示符下执行“create table yongh(id string,name string,age string) row format delimited fields terminated by ' '” 命令创建名为“user”的表。执 行“load data local inpath '/home/data/yongh'overwrite into table yongh”命令,将指定路径中的文件内容插入到上述“yongh”表中。执行“select* from yongh;”命令,查看“user”表中内容。如果以上操作顺利完成,说明Hive运行没有问题。

Hive和Hbase集成的实现原理

对于用户来说,如果想访问Hive,可以通过命令行来访问,这是最常用的方式。也可以编写相应代码,通过JDBC或ODBC的方式进行访问。当然,还可使用Hive提供的Web图形界面进行访问,但其界面简单,功能也不强大。为此可以使用HUE系统来增强其功能。Metastore元数据存储主要用来维护HDFS中的文件和Hive表的关系,包括Hive表的名称、所属的数据库、表的拥有者、列、分区的字段等。

其通常存储在MySQL等关系型数据库中,但MySQL依然存在单点故障问题,为此可以配置两台MySQL服务器来组成HA高可用结构,防止因为MySQL出现故障引发Hive运行异常。

Driver(Compiler、Optimizer、Executor)驱 动器是Hive的核心,例如想执行一条SQL语句,会通过解析处理,包括解释器、编译器、优化器、执行器等。解释器会将SQL语句解释为抽象语法树,一般使用第三方工具完成。例如使用Antlr对抽象语法树进行解析,判断表和字段是否存在以及语法是否正确等。如果语法格式存在问题,就会抛出异常信息。接下来编译器会将抽象语法树进行编译,并生成逻辑执行计划,可以将逻辑执行计划理解为MapReduce任务。

之后通过优化器对逻辑执行计划进行优化处理,最后才会进入执行器中执行相应的SQL语句。Hive的数据存储在HDFS中,查询的语法主要是通过MapReduce语法进行计算,Hive最主要的作用就是将SQL转化为MapReduce任务,并通过MapReduce任务返回用户所需的数据。

对于Hbase的架构来说,同样是通过客户端来操作Hbase数据库的,其数据存储在HDFS中,通过Zookeeper来管理Hbase集群。当实现了Hive和Hbase的整合后,会先通过命令行进行访问,之后通过Hive驱动器组件调用Hbase的Client组件,通过Hive提供的Jar包完成两者间的转换。

Hive中存在一种存储Handler,来维护两者之间的关系。在很多场景中可以发挥两者整合的功能,例如通过Hive将数据加载到Hbae中,其数据源可以是文件或表,Hive先通过Select语句来查询数据,之后通过Insert语句将数据插入到Hive表中,因为Hbase和Hive的表已经集成在一起,所以在Hive表增加数据的同时,Hbase表中的数据会同步增加。因为Hbase查询不支持Join和Group等操作语句,利用Hive和Hbase的集成,可以让Hbase支持这些操作。

首先将Hbase数据库或其他的数据源加载到Hive中,通过Hive的语法进行查询,因为Hive支持Group和Join等操作,可以将查询的数据返回到结果集中,通过这种方式可以让Hbase完美支持SQL语法。

当Hbase中实时的操作数据,或周期性的加载其他数据(例如源文件或表中的数据等),因为Hbase加载数据的速度极快,这样可以通过Hive直接查询数据,省去了Hive加载数据的环节。

实现Hive和Hbase的集成

在实现集成之前,需要注意两者的版本问题。对于Hive 0.9来说,整合的Hbase版本必须是0.92以上的。对于Hive 1.x版本来说,可以和Hbase 0.98x的版本保持兼容。对于Hive 2.x版本来说,只支持Hbase 1.x之后的版本。

如果想让Hive 1.x和Hbase 1.x集成,必须重新编译Hive的源代码,让两者保持兼容。Hive中的字段和Hbase中列都是通过Storage handler来维护的,所以在创建Hive表要将其存储格式指定为该存储Handler。

这个存储处理的Handler程序程序被编译 成 名 为“hive-hbasehandler-x.x.x.jar”的独立模块,在Java中其实就是一个Jar包。

注意,Hive的客户端必须对其进行识别,否则就会出错。利用Hive和Hbase的集成,可以有效利用HBase数据库的存储特性,例如行更新和列索引等。实现集成必须在Hive表和Hbase表之间建立映射关系,对于Hive表中每个域都必须存储在HBase中,但是Hive表中不需要包含Hbase表中的列,因为Hbase是NoSQL类型的数据库,其列都是动态指定的。

首先进入Hive的安装目录,执行“ls lib”命令,显示Hive的所有库文件。

然后执行“cp /home/dbsoft/hbase-x.x/lib/*lib/”命令,其中的’ /home/dbsoft/hbase-x.x将 为Hbase的安装路径,将Hbase安装路径下的的“lib”的所有内容复制到Hive的“lib”目录中,如果提示覆盖的话确认即可。这样做的好处在于不用繁琐的设置环境变量。

在Hive中映射Hbase表

执行“bin/hive”命令启动Hive,这里使用简单的例子来说明如何在Hive中映射Hbase的表。

在“Hive>”提示符下输入“CREATE TABLE hbtk1(key int,value string)”、“STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'”、“WITH SERDEPROPERTIES("hbase.columns.mapping"= ":key,cf1:val")”、“TBLPROPERTIES ("hbase.table.name" = "htb");”行来创建名为“hbtk1”的表,并指定Hbase的Handler模块路径,之后指定其映射关系,最后指定映射的Hbase的表名称。

进入Hbase的安装路径中的“bin”目录,执行“hbase shell”命令进入Hbase控制台,执行“list”命令,可以看到名为“htb”表已经加载,执 行“describe 'htb'”命令,查看其详细信息。因为该表已经和上述Hive中的表建立了映射关系,所以不能在Hive中直接导入数据,但是可以查询其他的表来加载数据。

在Hive控制台中执行“CREATE TABLE table1(fno int,chanpin string)row format delimited fields terminated by ' ';”命令,创建名为“table1”的表,其各字段需要和上述表对应,并使用制表符分隔。

然后执行“load data local inpath '/home/data/product.txt' overwrite into table table1;”命令,从指定的名为“product.txt”文件中加载数据。

当然,该文件必须事先创建好,其中输入对应的字段内容,并使用制表符分隔。 执 行“select * from table1;”命令,显示已经加载的数据。执行“insert overwrite table hbtk1 select * from table1;”命令,将该表中的数据加载到“hbtk1”表中。

然后,在上述的Hbase控制台中执行“scan 'htb'”命令,显示在名为“htb”的表中已经加载了上述的数据,这就说明已经在Hive和Hbase中成功的映射了表的关系。

在Hive控制台中如果执行“drop table hbtk1;”命令,将该表删除的话,那么在Hbase中也会自动删除与之映射的表,因为该Hbase表是通过Hive表管理的。

映射Hbase外部表

如果在Hive中创建的表创建了分区的话,使用“select * from 表名”语句可能无法查询到数据,可以执行“select 字段1,字段2,字段3 from 表名”之类的命令,通过指定具体的字段来实现查询。

值得说明的是,对于整合之后的表是无法进行修改的。对于Hbase中已经存在的表,也可以通过外部表的方式进行映射。

例如在Hbase控制台中执 行“create ' yongh1',' 'info” 命 令,创 建 名为“yongh1” 的 表,其 列族 为“info”。 在 Hive控制 台 中 执 行“CREATE EXTERNAL TABLE hbtk2(key int,value string)”、“STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'”、“WITH SERDEPROPERTIES("hbase.columns.mapping"= "info:value")”、“TBLPROPERTIES("hbase.table.name" = "yongh1");”命令,创建名为“hbtk2”的外部表,使其和Hbase中的“user”表建立映射关系。

在Hbase控制台中执行“put 'yonghu1', ' 1',' info:value', 'xiaoli '”之类的命令,在该表中插入数据。之后在Hive控制台中执行“select * from hbtk2;”命令,显示上述插入的数据,说明Hbase中该表的数据已经加载到Hive对应表中了。

注意,如果在Hive中删除 了“hbtk2”表,在Hbase中的对应表的内容是不会变化的,因为这是一张外部表,删除操作不会影响到Hbase中的数据。

顺便说一下,如果在Hive应用中使用了Thrift Server组件,则允许允许通过指定端口访问Hive。其默认启动命令为“hive --service hiveserver”,当实现了 Hive和Hnase的集成后,必须使用“hive --service hiveserver-hiveconf”命令启动。

注意,还需要指定Zookeeper的 地 址,例 如“hbase.zookeeper.quorum=node0,node1,node2”。如果启动出错,可以先 执 行“hive --service hiveserver -hiveconf””命令启动,之后在Hive控制台中 执 行“set hbase.zookeeper.quorum=node0,node1, node2”之类的命令可解决问题。

猜你喜欢
字段命令语句
图书馆中文图书编目外包数据质量控制分析
只听主人的命令
重点:语句衔接
移防命令下达后
这是人民的命令
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
我喜欢
关于CNMARC的3--字段改革的必要性与可行性研究
作文语句实录