版本说明: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日志

hive数据存入hbase hive表数据导入hbase_hive


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

 limit 10000; 

hive数据存入hbase hive表数据导入hbase_hive_02

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

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

hive数据存入hbase hive表数据导入hbase_hive_03

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


在解析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夜的奋战终于找到问题了!

hive数据存入hbase hive表数据导入hbase_apache_04

这个错误居然是在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数据存入hbase hive表数据导入hbase_hive_05

这个问题在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),也更方便点( 不容易出错)