hbase 与 hive 结合

本文详细介绍如何在Hadoop环境中集成Hive与HBase,包括配置步骤、常见错误解决方法及示例。通过具体操作指引,帮助读者实现数据在Hive表与HBase表之间的映射。

转载自:http://lookqlp.iteye.com/blog/1738357


前置条件 
hadoop hive hbase环境搭建完成。 
搭建版本 
hadoop-1.0.3 
hive-0.9.0 
hbase-0.94.2 
zookeeper-3.3.5 
步骤 
配置hive xml,配置hbase与hive结合包 

Xml代码   收藏代码
  1. <property>   
  2. <name>hive.aux.jars.path</name>   
  3. <value>file:///usr/local/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,file:///usr/local/hive-0.9.0/lib/hbase-0.94.2.jar,file:///usr/local/hive-0.9.0/lib/zookeeper-3.3.5.jar</value>  
  4. </property>  

将hbase-0.94.2.jar 、zookeeper-3.3.5.jar包copy至所有节点$HDOOP_HOME/lib及$HIVE_HOME/lib下。注意$HIVE_HOME/lib含有hbase包需要删除。 
将hbase-site.xml文件copy至所有节点$HDOOP_HOME/conf下。 
测试,启动hive,创建表 
Sql代码   收藏代码
  1. CREATE TABLE qq(key string, value string)   
  2. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
  3. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:value")  
  4. TBLPROPERTIES ("hbase.table.name" = "xx");  
  5. --数据表  
  6. create table test(a string,b string);  
  7. --含有数据:  
  8. --1  a  
  9. --2  b  
  10. --3  c  

若创建表不成功,查看hive日志提示如下异常: 

Html代码   收藏代码
  1. 2012-11-29 12:33:02,191 FATAL ExecMapper: java.lang.NoClassDefFoundError: com/google/protobuf/Message  
  2.     at org.apache.hadoop.hbase.io.HbaseObjectWritable.<clinit>(HbaseObjectWritable.java:263)  
  3.     at org.apache.hadoop.hbase.ipc.Invocation.write(Invocation.java:139)  
  4.     at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.sendParam(HBaseClient.java:638)  
  5.     at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:1001)  
  6.     at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:150)  
  7.     at $Proxy8.getProtocolVersion(Unknown Source)  
  8. ......  
  9. 2012-11-29 12:33:02,282 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/io/HbaseObjectWritable  
  10.     at org.apache.hadoop.hbase.ipc.Invocation.write(Invocation.java:139)  
  11.     at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.sendParam(HBaseClient.java:638)  
  12.     at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:1001)  
  13.     at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:150)  
  14.     at $Proxy8.getProtocolVersion(Unknown Source)  

表明hbase中protobuf-java-2.4.0a.jar包没有在集群的classpath中,查看该job的syslog logs "conf classpath =..."确实不存在该包,需要将protobuf-java-2.4.0a.jar包copy至所有节点$HADOOP_HOME/lib下,并需要重启集群(不重启该包不会被加载进classpath) 

qq表创建表成功后,打开hbase shell窗口,list查看xx表已经存在。 
hive表中插入数据: 
Sql代码   收藏代码
  1. insert into table qq select a as key,b as value from test;  

分别查看hive中qq表,hbase中xx表数据,都有数据。----表示结合成功。 

很多资料包括官网使用insert into table qq select * from test即可导入,但实践证明不成功,可能是hbase及hive版本导致的。 

注意:如上sql中test表字段类型必须与qq表字段类型一致,若不一致会报如下异常: 

Html代码   收藏代码
  1. Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"a":"a","b":"1"}  
  2.     at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:548)  
  3.     at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:143)  
  4.     ... 7 more  
  5. Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.hive.serde2.SerDeException: HBase row key cannot be NULL  
  6.     at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:604)  
  7.     at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)  
  8.     at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)  
  9.     at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)  
  10.     at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)  

hive创建hbase已经存在的表: 
Sql代码   收藏代码
  1. CREATE EXTERNAL TABLE te(key string, value1 string,value2 string)     
  2. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    
  3. WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name,info:age")     
  4. TBLPROPERTIES("hbase.table.name" = "test");  

info表示列族,name和age为列族下的两个列。若hbase中还有info:class列,但创建hive关联表使用如上语句,执行select * from te只可得到key,value1、value2的值,即rowkey、name、age,没有class的值。

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化数据处理的自动化,以提升日常教学管理工作的效率准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值