五、Hive
Hive是一个构建在Hadoop上的数据仓库框架,它起源于Facebook内部信息处理平台。Hive是一个构建在Hadoop上的数据仓库框架,它起源于Facebook内部信息处理平台。
(一)Hive简介
1、Hive基本框架
Hive包含Shell环境、元数据库、解析器和数据仓库等组件,其体系结构如图所示:
(1)用户接口:包括Hive Shell、Thrift客户端、Web接口。
(2)Thrift服务器:当Hive以服务器模式运行时,作为Thrift服务器,供客户端连接。
(3)元数据库:Hive元数据(如表信息)的集中存放地。
(4)解析器:将Hive语句翻译成MapReduce操作。
(5)Hadoop:底层分布式存储和计算引擎。
2、Hive语法
Hive的SQL称为HiveQL,它与大部分的SQL语法兼容,但是并不完全类似SQL。
(1)数据类型
基本类型:数值型、布尔型和字符串;
复杂类型:ARRAY、MAP和STRUCT。
(2)操作和函数
HiveQL操作符类似于SQL操作符,Hive提供了数理统计、字符串操作、条件操作等大量的内置函数,用户还可以自己编写函数。
(二)Hive入门
1、Hive部署
(1)内嵌模式
此模式是安装时的默认部署模式,此时元数据存储在一个内存数据库Derby中,并且所有组件(如数据库、元数据服务)都运行在同一个进程内。这种模式下,一段时间内只支持一个活动用户。但这种模式配置简单,所需机器较少,限于集群规模,本节Hive部署即采用这种模式。
(2)本地模式
此模式是Hive元数据服务依旧运行在Hive服务主进程中,但元数据存储在独立数据库中(可以是远程机器),当涉及元数据操作时,Hive服务中的元数据服务模块会通过JDBC和存储于DB里的元数据数据库交互。
(3)完全远程模式
元数据服务以独立进程运行,并且元数据存储在一个独立的数据库里。
下面讲解内嵌模式部署。
① 下载并安装Hive。
[root@iClient ~]# sudo yum install hive
② HDFS里新建Hive存储目录。
[root@iClient ~]# sudo –u hdfs hdfs dfs –mkdir /user/hive #HDFS里新建Hive存储目录
[root@iClient ~]# sudo –u hdfs hdfs dfs –chmod –R 1777 /user/hive #为目录设置适当权限
只需上述两步就可以直接使用Hive了,当然,也可以使用jps命令查看Hive进程。
2、Hive接口
Hive提供了强大的访问接口,从下图中即可看出Hive提供的诸多接口,此外也可以通过Hcatalog、Pig、BeeLine等访问Hive。
【例4】 按要求完成问题:
① 进入Hive命令行接口,获取Hive函数列表并单独查询count函数用法。
② 在Hive里新建member表,并将表6-6中的数据载入Hive里的member表中。
③ 查询member表中所有记录,查询member表中gender值为1的记录,查询member表中gender值为1且age为22的记录,统计member中男性和女性出现次数。
④ 试比较Pig中“单词计数”和“统计男女出现次数”的异同点。
解:
问题①较为简单,参考下面两条命令即可,注意本题所有操作都在iClient上执行,为方便载入数据,本次使用root用户。
[root@iClient ~]# Hive #进入Hive命令行
hive>show functions; #获取Hhive所有函数列表
hive>describe function count; #查看count函数用法
对于问题②,我们首先为表准备数据,即在iClient目录“/root”下新建文件memberData并写入如下内容,注意记录间为换行符,字段间以Tab键分割。
201401 aa 0 21 e0 p3 m
201402 bb 1 22 e1 p2 l
201403 cc 1 22 e2 p1 m
下面建表时将赋予各个字段合适的含义与类型,由于较为简单,请直接参考下面语句。
hive>show tables; #查看当前Hive仓库中所有表(以确定当前无member表)
hive>create table member(id int,name string,gender tinyint,age tinyint,edu string,prof string,income string)row format delimited fields terminated by '\t'; #使用合适字段与类型,新建member表
hive>show tables; #再次查看,将显示member表
hive>load data local inpath '/root/memberData' into table member; #将本地文件memberData载入HDFS
hive>select * from member; #查看表中所有记录
hive>select * from member where gender=1; #查看表中gender值为1的记录
hive>select * from member where gender=1 AND age=23; #查看表中gender值为1且age为23的记录
hive>select gender,count(*) from member group by gender; #统计男女出现总次数
hive>drop table member; #删除member表
hive>quit; #退出Hive命令行接口
统计表中“男女出现次数”是一个常见的SQL操作,统计“单词个数”更像是处理互联网的单词热度之类的操作,两个其实没有可比性,这里只是强调,Hive将Hadoop抽象成为SQL类型的数据仓库。
六、Oozie
Oozie起源于雅虎,主要用于管理与组织Hadoop工作流。Oozie的工作流必须是一个有向无环图,实际上Oozie就相当于Hadoop的一个客户端,当用户需要执行多个关联的MapReduce(MR)任务时,只需要将MR执行顺序写入workflow.xml,然后使用Oozie提交本次任务,Oozie会托管此任务流。
(一)Oozie简介
由于需要存储工作流信息,为提供高可靠性,确保任务配置不丢失,Oozie内部使用数据库来存储工作流相关信息,用户可以使用Oozie内嵌的Derby数据库,也可以使用MySQL、PostgreSQL、Oracle等数据库。
(二)Oozie入门
1、Oozie部署
Oozie相当于Hadoop的一个客户端,因此集群中只有一台机器部署Oozie server端即可,由于可以有任意多个客户端连接Oozie,故每个客户端上都须部署Oozie client,本节选择在cMaster上部署Oozie server,在iClient上部署Oozie client。
(1)部署Oozie服务端
[root@cMaster ~]# sudo yum install oozie #cMaster上以root权限执行,部署Oozie服务端
(2)部署Oozie客户端
[root@iClient ~]# sudo yum install oozie-client
(3)配置Oozie
修改/etc/oozie/conf/oozie-env.sh
中的CATALINA_BASE
属性值,注释原值并指定新值,当此值指向oozie-server-0.20表明Oozie支持MRv1,指向oozie-server表示支持Yarn。注意cMaster、iClient都要配置,并保持一致。
#export CATALINA_BASE=/usr/lib/oozie/oozie-server-0.20
export CATALINA_BASE=/usr/lib/oozie/oozie-server
在/etc/hadoop/conf/core-site.xml
文档里configuration
标签间加入如下内容。注意,6台机器都要更新这个配置,并且配置此属性后,一定要重启集群中所有Hadoop服务,此属性值才能生效。
<property><name>hadoop.proxyuser.oozie.groups</name><value>*</value></property>
<property><name>hadoop.proxyuser.oozie.hosts</name><value>*</value></property>
下面是重启Hadoop集群的命令:
$ for x in `cd /etc/init.d ; ls hadoop-*` ; do service $x restart; done; #除了iCleint外,其他机器都要执行
(4)创建Oozie数据库模式
[root@cMaster ~]#sudo -u oozie /usr/lib/oozie/bin/ooziedb.sh create –run #仅cMaster执行
(5)配置Oozie Web页面
Oozie的Web界面用到第三方包,但由于版权原因ext-2.2并未打包进Oozie,事实上开启Oozie server不需要开启Oozie Web界面,但如果想在开启Oozie server同时也开启Oozie Web界面,则必须下载ext-2.2.zip
并将其解压到目录/var/lib/oozie
下。
[root@cMaster ~]# cd /var/lib/oozie/
[root@cMaster oozie]# sudo -u oozie wget http://archive.cloudera.com/gplextras/misc/ext-2.2.zip
[root@cMaster oozie]# sudo -u oozie unzip ext-2.2.zip
(6)将Oozie常用Jar包导入HDFS
这一步也是可选的,如果工作流里包含Pig或Hive脚本,必须将这些jar包导入HDFS。
[root@cMaster ~]# sudo -u hdfs hdfs dfs -mkdir /user/oozie
[root@cMaster ~]# sudo -u hdfs hdfs dfs -chown oozie:oozie /user/oozie
[root@cMaster ~]# mkdir /tmp/ooziesharelib
[root@cMaster ~]# cd /tmp/ooziesharelib
[root@cMaster ~]# tar xzf /usr/lib/oozie/oozie-sharelib-yarn.tar.gz
[root@cMaster ~]# sudo -u oozie hdfs dfs -put share /user/oozie/share
(7)开启Oozie服务
[root@cMaster ~]# sudo service oozie start
(8)查看Oozie服务
当成功部署并在cMaster上开启Oozie服务后,如果配置了ext-2.2
,在iClient上的浏览器中打开“cmaster:11000”将显示Oozie Web界面,也可以使用下述命令查看Oozie工作状态。
[root@iClient ~]# oozie admin -oozie http://cMaster:11000/oozie -status
2、Oozie访问接口
Oozie最常用的是命令行接口,它的Web接口只可以看到Oozie托管的任务,不可以配置作业。
【例5】 按要求完成问题:
① 进入Oozie客户端,查看常用命令。
② 运行Oozie MR示例程序。
③ 运行Oozie Pig、Hive等示例。
④ 编写workflow.xml,完成一次WordCount。
⑤ 编写workflow.xml,完成两次WordCount,且第一个WC的输出为第二个WC的输入。
解:
对于问题①,在iClient上执行下述命令即可,用户可以是root或joe。
[root@iClient ~]# sudo -u joe oozie help #查看所有Oozie命令
对于问题②,首先解压Oozie示例jar包,接着修改示例配置中的地址信息,最后上传至集群执行即可,读者按下述流程执行即可。
[root@iClient ~]#cd /usr/share/doc/oozie-4.0.0+cdh5.0.0+54
[root@iClient oozie-4.0.0+cdh5.0.0+54 ~]# tar -zxvf oozie-examples.tar.gz
编辑examples/apps/map-reduce/job.properties
,将如下两行:
nameNode=hdfs://ocalhost:8020
jobTracker=localhost:8021
替换成集群现在配置的地址与端口:
nameNode=hdfs://cMaster:8020
jobTracker=cMaster:8032
接着将examples
上传至HDFS,使用Oozie命令执行即可:
[root@iClient oozie-4.0.0+cdh5.0.0+54]# sudo-u joe hdfs dfs -put examples examples
[root@iClient oozie-4.0.0+cdh5.0.0+54]# cd
[root@iClient ~]# sudo -u joe oozie job-oozie http://cMaster:11000/oozie -config /usr/share/doc/oozie-4.0.0+cdh5.0.0+54/examples/apps/map-reduce/job.properties -run
问题③其实和是一样的,读者可按上述过程使用oozie执行Pig或Hive等的示例脚本。切记修改相应配置(如examples/apps/pig/job.properties
)后,再上传至集群,执行时也要定位到相应路径(如sudo -u joe oozie ……/apps/pig/joe.properties -run
)。
对于问题④,可参考“examples/apps/map-reduce/workflow.xml
”,其对应jar包在“examples/apps/map-reduce/lib
”下,其下的DemoMapper.class
和DemoReducer.class
就是WordCount的代码,对应的源代码在“examples/src
”下,可按如下步骤完成此问题。
(1)编辑文件“examples/apps/map-reduce/workflow.xml
”,找到下述内容:
<property>
<name>mapred.mapper.class</name><value>org.apache.oozie.example.SampleMapper</value>
</property>
<property>
<name>mapred.reducer.class</name><value>org.apache.oozie.example.SampleReducer</value>
</property>
(2)将其替换成:
<property>
<name>mapred.mapper.classs</name><value>org.apache.oozie.example.DemoMapper</value>
</property>
<property>
<name>mapred.reducer.class</name><value>org.apache.oozie.example.DemoReducer</value>
</property>
<property><name>mapred.output.key.class</name><value>org.apache.hadoop.io.Text<value></property>
<property>
<name>mapred.output.value.class</name><value>org.apache.hadoop.io.IntWritable</value>
</property>
(3)接着将原来HDFS里examples
文件删除,按问题②的解答,上传执行即可,这里只给出删除原examples
的命令,上传和执行命令和问题②解答一样。
[root@iClient ~]# sudo -u joe hdfs dfs -rm -r-fexamples #删除HDFS原examples文件
问题⑤是业务逻辑中最常遇到的情形,比如你的数据处理流是:“M1”→“R1”→ “Java1”→“Pig1”→“Hive1”→“M2”→“R2”→“Java2”,单独写出各类或脚本后,写出此逻辑对应的workflow.xml
即可。限于篇幅,下面只给出workflow.xml
框架, 请读者自行解决问题。
<workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
<start to="mr-node"/>
<action name="mr-node">
<map-reduce>第一个wordcount配置</map-reduce>
<ok to="mr-wc2"/><error to="fail"/>
</action>
<action name="mr-wc2">
<map-reduce>第二个wordcount配置</map-reduce>
<ok to="end"/><error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
</kill>
<end name="end"/>
</workflow-app>