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

时间: 2024-08-09 22:01:32

hive导入数据到hbase的相关文章

hive-hbase-handler方式导入hive表数据到hbase表中

Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler.jar工具类 : hive-hbase-handler.jar在hive的lib包中而不是在hbase的lib中,hive0.6版本以后: 创建hive表的同时创建hbase表,删除 hive表的同时也会删除对应的hbase表. 参见官方文档:https://cwiki.apache.org/confluence/display/Hive/HBaseIntegr

hive 导入数据的四种方式

Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中. 一.从本地文件系统中导入数据到Hive表 先在Hive里面创建好表,如下: hive> create table wyp > (id int, name string, > age int, tel string) >

【转】hive导入数据出现NULL

在把hdfs上数据迁移到hive中的表时,若出现数据位NULL,是因为没有指定列分隔符. 由于hive默认的分隔符是/u0001(Ctrl+A),为了平滑迁移,需要在创建表格时指定数据的分割符号,语法如下: [sql] view plaincopyprint? hive (default)> create external table et (time BIGINT, userid string, content string, urlrank int, urlnum int, url stri

Hive导入数据

1.导入数据 除了前面使用的LOAD DATA方式把文件复制或移动到表的目录外,还有以下几种方式: 1). Insert Overwrite Table hive> insert overwrite table school > select age,name from student; 2). 对于分区的表,可以使用PARTITION子句来指明数据要插入哪个分区: 注意:对于查询出的值不满足分区表列的类型,则会插入NULL insert overwrite table logs partit

从Hive导入数据到ES

大数据方兴未艾,Hive在业界,是大数据的标配了.因此hive数据添加到ES的应用场景还是比较常见的.学习ES官方的es-hadoop, 有从hive导数据到ES. 实验可行.hive的版本: hive-1.1.0-cdh5.9.0 具体的步骤如下:step1 将elasticsearch-hadoop-hive-version.jar添加到hive wget https://artifacts.elastic.co/downloads/elasticsearch-hadoop/elastics

使用BulkLoad从HDFS批量导入数据到HBase

在向Hbase中写入数据时,常见的写入方法有使用HBase API,Mapreduce批量导入数据,使用这些方式带入数据时,一条数据写入到HBase数据库中的大致流程如图. 数据发出后首先写入到雨鞋日志WAl中,写入到预写日志中之后,随后写入到内存MemStore中,最后在Flush到Hfile中.这样写数据的方式不会导致数据的丢失,并且道正数据的有序性,但是当遇到大量的数据写入时,写入的速度就难以保证.所以,介绍一种性能更高的写入方式BulkLoad. 使用BulkLoad批量写入数据主要分为

importTSV工具导入数据到hbase

1.建立目标表test,确定好列族信息. create'test','info','address' 2.建立文件编写要导入的数据并上传到hdfs上 touch a.csv vi a.csv 数据内容: 2018-09-29,value1,value2 将文件上传到hdfs目录下. 3.在linux命令行执行命令 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv

导入数据到HBase的方式选择

Choosing the Right Import Method If the data is already in an HBase table: To move the data from one HBase cluster to another, use snapshot and either the clone_snapshot or ExportSnapshot utility; or, use the CopyTable utility. To move the data from

教程 | 使用Sqoop从MySQL导入数据到Hive和HBase

基础环境 sqoop:sqoop-1.4.5+cdh5.3.6+78, hive:hive-0.13.1+cdh5.3.6+397, hbase:hbase-0.98.6+cdh5.3.6+115 Sqool和Hive.HBase简介 Sqoop Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的开源工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. Hiv