首页 > 代码库 > hive导入数据到hbase

hive导入数据到hbase

  版本说明:hive-0.13.1

        hbase-0.96.0/hbase-0.98.2

 第一步:在hive客户端执行hive关联hbase建表语句

   hive中对应的表hive_user_info
   hbase中对应的表user_info

CREATE TABLE hive_user_info(
a string,b string,c string,
d string,e string,
f string,g string)
PARTITIONED BY(dt string)
STORED BY‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘ WITH SERDEPROPERTIES
("hbase.columns.mapping"=":key,info:b,info:c,info:d,info:e,info:e,info:f ")
TBLPROPERTIES("hbase.table.name" = "user_info");   好像这个版本默认的version=1 

所以在hbase shell 端设置一下version
alter ‘user_info‘,{NAME=>‘info‘,‘VERSIONS‘=>3}

第二步:通过hive已存在的表查询数据并插入到hive_user_info表里面

            insert into table hive_user_info PARTITION(dt=1) select udid,if(jailbreak=0,1,0),concat(dt,‘ ‘,hour,‘:‘,time_minute),0,device_id,‘2‘,null from click_log; 

   

这个坑爹的问题:debug调试,还是没发现问题,hive执行计划也没问题,去查看-ext-10000日志


但是加上limit 就是没问题的:

 insert into table hive_user_info PARTITION(dt=1) select udid,if(jailbreak=0,1,0),concat(dt,‘ ‘,hour,‘:‘,time_minute),0,device_id,‘2‘,null from click_log limit 10000; 

添加limit 查看explain sql  也就是说明hive查出来的数据是用一个reduce写入到hive和hbase关联表的,这个常识不符合分布式的hadoop理论,继续找原因:

hive -hiveconf hive.root.logger=DEBUG,console

是找不到这个类,继续编译这个类测试,发现也不是这个类的问题,原因是这个:

在解析sql就已经出错了
有reduce的sql会解析成
org.apache.hadoop.hive.ql.plan.TableScanDesc
org.apache.hadoop.hive.ql.plan.ReduceSinkDesc
org.apache.hadoop.hive.ql.plan.ExtractDesc
org.apache.hadoop.hive.ql.plan.PTFDesc
org.apache.hadoop.hive.ql.plan.SelectDesc
org.apache.hadoop.hive.ql.plan.FileSinkDesc
没有reduce的sql会解析成
org.apache.hadoop.hive.ql.plan.TableScanDesc
org.apache.hadoop.hive.ql.plan.SelectDesc
org.apache.hadoop.hive.ql.plan.FileSinkDesc

落地表信息都在org.apache.hadoop.hive.ql.plan.FileSinkDesc里面,但是没有reduce的sql解析出来之后,不会带上hbase包的信息
如果不用第三方包,是不会解析成org.apache.hadoop.hive.ql.plan.FileSinkDesc,这个主要是给第三方包用的
所以用hive是没问题得,继续找hbase的问题

经过2天2夜的奋战终于找到问题了!


这个错误居然是在info里面找到的!!!

如果map-only的任务,会触发一个合并小文件的任务,叫做conditional task,这个task会分成n个小任务,判断合并否,
在检查这个合并小文件的任务时,要去检查分区,这时候输出表换成了一个输入表,而输入表是没有带表自定义信息的
所以把输出表的class给冲掉了。。。给冲掉了!!!!
解决的方法:关掉merge。。。

set hive.merge.mapfiles=false

set hive.merge.mapfiles=false;insert into table hive_user_info PARTITION(dt=‘${date}‘) select udid,if(jailbreak=0,1,0),concat(dt,‘ ‘,hour,‘:‘,time_minute),0,device_id,‘2‘,null from show_log where dt=‘${date}‘ and udid !=‘null‘ and udid !="";


这个问题在hive-0.13.0和hbase-0.96.0/hbase-0.98.2版本集成测试发现这个问题的

但是在hive-0.11.0和hbase-0.94.0之前版本是没问题的

经验分析:在使用hadoop组件里面的高版本的时候

    首先:要查看官方的更新文档,了解新特性,并对比低版本做了哪些改动

  其次: 在使用hadoop组件的时候一点要学会debug查看日志,如果error和warning看不出问题,那就继续看info的信息,

  最后学会编译源码包,对错误逐一排查……(待续)

拓展:编译hive jar包命令:mvn clean compile -Phadoop-2

hive集成hbase成功于否的关键配置文件hive/cong/

方法一:(hadoop启动的时候把需要的jar包加载到hdfs上)

1、先把hive-site.xml里面那个HIVE_AUX_JARS_PATH去掉
2、在hive-env.sh加上export HIVE_AUX_JARS_PATH=/home/yudaer/hbase-0.98.6.1-hadoop2/lib/   后面是hbase的lib的地址

方法二:在hive启动的时候直接读取hive/lib和这个陪着文件里面的jar包

<property>
  <name>hive.aux.jars.path</name>
 <value>file:///usr/local/hive-0.13.0/lib/hive-hbase-handler-0.13.1.jar,file:///usr/local/hive-0.13.0/lib/protobuf-java-2.5.0.jar,file:///usr/local/hive-0.13.0/lib/hbase-client-0.96.2-hadoop2.jar,file:///usr/local/hive-0.13.0/lib/hbase-common-0.96.2-hadoop2.jar,file:///usr/local/hive-0.13.0/lib/hbase-common-0.96.2-hadoop2-tests.jar,file:///usr/local/hive-0.13.0/lib/hbase-protocol-0.96.2-hadoop2,file:///usr/local/hive-0.13.0/lib/hbase-server-0.96.2-hadoop2,file:///usr/local/hive-0.13.0/lib/htrace-core-2.04,file:///usr/local/hive-0.13.0/lib/zookeeper-3.4.5.jar,file:///usr/local/hive-0.13.0/lib/guava-12.0.1.jar</value>
</property>

注意:<value>中间的值要写在一行</value>

本人感觉方法一更专业(:-D),也更方便点( 不容易出错)


hive导入数据到hbase