hive与hbase整合过程

hive与hbase整合过程---coco


# by coco
# 2014-07-25


 本文主要实现一下目标:
   1. 在hive中创建的表能直接创建保存到hbase中。
   2. hive中的表插入数据,插入的数据会同步更新到hbase对应的表中。
   3. hbase对应的列簇值变更,也会在Hive中对应的表中变更。
   4. 实现了多列,多列簇的转化:(示例:hive中3列对应hbase中2列簇)
   


 hive与hbase的整合
 1. 创建hbase识别的表:
hive>  CREATE TABLE hbase_table_1(key int, value string)    
    > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
    > WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")   
    > TBLPROPERTIES ("hbase.table.name" = "xyz");
OK
Time taken: 1.833 seconds
hbase.table.name 定义在hbase的table名称 
hbase.columns.mapping 定义在hbase的列族 
hbase中看到的表:
hbase(main):007:0> list
TABLE                                                                                                                        
hivetest                                                                                                                     
student                                                                                                                      
test                                                                                                                         
xyz                                                                                                                          
4 row(s) in 0.1050 seconds


=> ["hivetest", "student", "test", "xyz"]


2.使用sql导入数据 
i.预先准备数据 
a)新建hive的数据表
hive> create table ccc(foo int,bar string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;
OK
Time taken: 2.563 seconds
[root@db96 ~]# cat kv1.txt 
1       val_1
2       val_2
这个文件位于root目录下,/root/kv1.txt
  
[root@db96 ~]# 
hive> load data local inpath '/root/kv1.txt' overwrite into table ccc;
Copying data from file:/root/kv1.txt
Copying file: file:/root/kv1.txt
Loading data to table default.ccc
rmr: DEPRECATED: Please use 'rm -r' instead.
Deleted hdfs://db96:9000/hive/warehousedir/ccc
[Warning] could not update stats.
OK
Time taken: 2.796 seconds
hive> select * from ccc;
OK
1       val_1
2       val_2
NULL    NULL
Time taken: 0.348 seconds, Fetched: 3 row(s)
hive>
使用sql导入hbase_table_1
hive> insert overwrite table hbase_table_1 select * from ccc where foo=1;
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1406161997851_0002, Tracking URL = http://db96:8088/proxy/application_1406161997851_0002/
Kill Command = /usr/local/hadoop//bin/hadoop job  -kill job_1406161997851_0002
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2014-07-24 16:04:48,938 Stage-0 map = 0%,  reduce = 0%
2014-07-24 16:04:57,571 Stage-0 map = 100%,  reduce = 0%, Cumulative CPU 2.54 sec
MapReduce Total cumulative CPU time: 2 seconds 540 msec
Ended Job = job_1406161997851_0002
MapReduce Jobs Launched: 
Job 0: Map: 1   Cumulative CPU: 2.54 sec   HDFS Read: 217 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 540 msec
OK
Time taken: 27.648 seconds


查看数据
会显示刚刚插入的数据 
1       val_1
hive> select * from hbase_table_1;
OK
1       val_1
Time taken: 1.143 seconds, Fetched: 1 row(s)


hbase 登录hbase
查看加载的数据
hbase(main):008:0> scan "xyz"
ROW                           COLUMN+CELL                                                                          
 1                            column=cf1:val, timestamp=1406189096793, value=val_1                                 
1 row(s) in 0.1090 seconds


hbase(main):009:0> 
可以看到,在hive中添加的数据86,已经在hbase中了.
添加数据:
hbase(main):009:0> put 'xyz','100','cf1:val','www.gongchang.com'
hbase(main):011:0> put 'xyz','200','cf1:val','hello,word!'
hbase(main):012:0> scan "xyz"
ROW                           COLUMN+CELL                                                                          
 1                            column=cf1:val, timestamp=1406189096793, value=val_1                                 
 100                          column=cf1:val, timestamp=1406189669476, value=www.gongchang.com                     
 200                          column=cf1:val, timestamp=1406189704742, value=hello,word!                           
3 row(s) in 0.0240 seconds


Hive 
参看hive中的数据
hive> select * from hbase_table_1;
OK
1       val_1
100     www.gongchang.com
200     hello,word!
Time taken: 1.097 seconds, Fetched: 3 row(s)
hive> 
刚刚在hbase中插入的数据,已经在hive里了.


hive访问已经存在的hbase
hbase中的元数据准备:
hbase(main):014:0> describe "student"
DESCRIPTION                                                                ENABLED                                 
 'student', {NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => true                                    
  'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE',                                         
  MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DELETED_CELLS => 'false',                                         
  BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}                                                
1 row(s) in 0.1380 seconds


hbase(main):015:0> put "student",'1','info:name','tom'
hbase(main):017:0> put "student",'2','info:name','lily'
hbase(main):018:0> put "student",'3','info:name','wwn'
hbase(main):019:0> scan "student"
ROW                           COLUMN+CELL                                                                          
 1                            column=info:name, timestamp=1406189948888, value=tom                                 
 2                            column=info:name, timestamp=1406190005724, value=lily                                
 3                            column=info:name, timestamp=1406190016967, value=wwn                                 
3 row(s) in 0.0420 seconds


hive访问已经存在的hbase 
使用CREATE EXTERNAL TABLE:
CREATE EXTERNAL TABLE hbase_table_3(key int, value string)    
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")   
TBLPROPERTIES("hbase.table.name" = "student"); 
hive> CREATE EXTERNAL TABLE hbase_table_3(key int, value string)    
    > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
    > WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")   
    > TBLPROPERTIES("hbase.table.name" = "student"); 
OK
Time taken: 1.21 seconds
hive> select * from hbase_table_3;
OK
1       tom
2       lily
3       wwn
Time taken: 0.107 seconds, Fetched: 3 row(s)
由上可以看出,hive已经能访问查看hbase中原有的数据了。
注意:如果hbase中列簇名name数据变更,那么hive中查询结果也会相应的变更,如果hbase中不是其他列簇
    内容更新则hive中查询结果不显示。
    
三、多列和多列族(Multiple Columns and Families) 
1.创建数据库


CREATE TABLE hbase_table_add1(key int, value1 string, value2 int, value3 int)    
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:col1,info:col2,city:nu")
TBLPROPERTIES("hbase.table.name" = "student_info");   
登陆hive操作:
hive> CREATE TABLE hbase_table_add1(key int, value1 string, value2 int, value3 int)    
    > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  
    > WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:col1,info:col2,city:nu")
    > TBLPROPERTIES("hbase.table.name" = "student_info"); 
OK
Time taken: 2.957 seconds
hive> select * from hbase_table_2;                   
OK
Time taken: 1.16 seconds
hive> select * from hbase_table_3;
OK
1       tom
2       lily
3       wwn
4       marry
Time taken: 0.117 seconds, Fetched: 4 row(s)
hive> set hive.cli.print.header=true;                
hive> select * from hbase_table_3;   
OK
hbase_table_3.key       hbase_table_3.value
1       tom
2       lily
3       wwn
4       marry
Time taken: 1.132 seconds, Fetched: 4 row(s)
hive> desc hbase_table_3;
OK
col_name        data_type       comment
key                     int                     from deserializer   
value                   string                  from deserializer   
Time taken: 0.19 seconds, Fetched: 2 row(s)
hive> insert overwrite table hbase_table_add1 select key,value,key+1,value from hbase_table_3;
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1406161997851_0003, Tracking URL = http://db96:8088/proxy/application_1406161997851_0003/
Kill Command = /usr/local/hadoop//bin/hadoop job  -kill job_1406161997851_0003
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2014-07-25 08:42:46,068 Stage-0 map = 0%,  reduce = 0%
2014-07-25 08:42:56,218 Stage-0 map = 100%,  reduce = 0%, Cumulative CPU 2.77 sec
MapReduce Total cumulative CPU time: 2 seconds 770 msec
Ended Job = job_1406161997851_0003
MapReduce Jobs Launched: 
Job 0: Map: 1   Cumulative CPU: 2.77 sec   HDFS Read: 239 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 770 msec
OK
_col0   _col1   _col2   _col3
Time taken: 28.01 seconds
hive> select * from  hbase_table_add1;
OK
hbase_table_add1.key    hbase_table_add1.value1 hbase_table_add1.value2 hbase_table_add1.value3
1       tom     2       NULL
2       lily    3       NULL
3       wwn     4       NULL
4       marry   5       NULL
Time taken: 1.105 seconds, Fetched: 4 row(s)
hive> insert overwrite table hbase_table_add1 select key,value,key+1,key+100 from hbase_table_3;
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1406161997851_0004, Tracking URL = http://db96:8088/proxy/application_1406161997851_0004/
Kill Command = /usr/local/hadoop//bin/hadoop job  -kill job_1406161997851_0004
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2014-07-25 08:45:15,164 Stage-0 map = 0%,  reduce = 0%
2014-07-25 08:45:25,609 Stage-0 map = 100%,  reduce = 0%, Cumulative CPU 2.69 sec
MapReduce Total cumulative CPU time: 2 seconds 690 msec
Ended Job = job_1406161997851_0004
MapReduce Jobs Launched: 
Job 0: Map: 1   Cumulative CPU: 2.69 sec   HDFS Read: 239 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 690 msec
OK
key     value   _c2     _c3
Time taken: 25.587 seconds
hive> select * from hbase_table_add1;
OK
hbase_table_add1.key    hbase_table_add1.value1 hbase_table_add1.value2 hbase_table_add1.value3
1       tom     2       101
2       lily    3       102
3       wwn     4       103
4       marry   5       104
Time taken: 1.122 seconds, Fetched: 4 row(s)


登陆hbase中查看:
hbase(main):001:0> list
TABLE                                                                                                              
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase-0.96.2-hadoop2/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop2/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
shivetest                                                                                                           
student                                                                                                            
student_info                                                                                                       
test                                                                                                               
xyz                                                                                                                
5 row(s) in 2.4090 seconds


=> ["hivetest", "student", "student_info", "test", "xyz"]
hbase(main):002:0> scan "student_info"
ROW                           COLUMN+CELL                                                                          
 1                            column=city:nu, timestamp=1406249125147, value=101                                   
 1                            column=info:col1, timestamp=1406249125147, value=tom                                 
 1                            column=info:col2, timestamp=1406249125147, value=2                                   
 2                            column=city:nu, timestamp=1406249125147, value=102                                   
 2                            column=info:col1, timestamp=1406249125147, value=lily                                
 2                            column=info:col2, timestamp=1406249125147, value=3                                   
 3                            column=city:nu, timestamp=1406249125147, value=103                                   
 3                            column=info:col1, timestamp=1406249125147, value=wwn                                 
 3                            column=info:col2, timestamp=1406249125147, value=4                                   
 4                            column=city:nu, timestamp=1406249125147, value=104                                   
 4                            column=info:col1, timestamp=1406249125147, value=marry                               
 4                            column=info:col2, timestamp=1406249125147, value=5                                   
4 row(s) in 0.1110 seconds


hbase(main):003:0> 


这里有3个hive的列,(value1和value2,value3),2个hbase的列簇(info,city)
hive的2列(value,和value2)对应1个hbase的列簇(info,在hbase的列名称col1,col2),
hive的另外1列(value3)对应列nu位于city列簇。
这里实现了hive中表,多列存放到hbase少量固定的列簇中。
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在Hadoop生态系统中,Hive是一个用于数据仓库和数据分析的开源工具,而HBase是一个开源的、分布式的、非关系型数据库。在某些情况下,因为版本不兼容或者依赖关系错误,可能会发生Hive整合HBase时出现IncompatibleClassChangeError(不兼容的类变更错误)。 IncompatibleClassChangeError是Java虚拟机(JVM)在运行期间抛出的错误,它表示在编译时使用的类与运行时使用的类发生了不兼容的变化。当Hive试图整合HBase时,如果Hive代码使用了HBase中的类,但实际运行时使用的HBase库与Hive编译时使用的库不兼容,就会出现这个错误。 解决这个问题的步骤如下: 1. 检查HBaseHive的版本是否兼容。在整合HiveHBase之前,确保使用的HBase版本与Hive版本兼容,并遵循它们之间的兼容性要求。 2. 检查依赖关系。在使用Hive整合HBase时,确保在Hive配置文件(hive-site.xml)中正确地设置了HBase相关的依赖。这包括指定HBase的主机名、端口号和表名等。 3. 检查类路径。确保在Hive运行期间正确配置了HBase的类路径,以便可以找到所需的HBase类。这可以通过检查HiveHBase的环境变量设置或者Hive的启动脚本来完成。 4. 更新HiveHBase的库。如果以上步骤都没有解决问题,可能需要升级HiveHBase的库版本,以确保它们之间的兼容性。 综上所述,Hive整合HBase时出现IncompatibleClassChangeError错误可能是由于版本不兼容或者依赖关系错误导致的。通过检查版本兼容性、依赖关系、类路径和库更新等措施,可以解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wulantian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值