版本说明:hive-0.13.1
第一步:在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 就是没问题的:
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组件里面的高版本的时候
拓展:编译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),也更方便点( 不容易出错)