Hadoop 2.0 大家族(三)


五、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.classDemoReducer.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>
  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Francek Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值