线上的zipkin的存储是利用的HBase0.94.6,一开始Dev想直接写MR来做离线分析,后来聊了下发现走Hive会提高开发的效率(当然,这里查询HBase的SQL接口还有phoenix,Impala等,只不过都还不够成熟,并且是离线分析不是adhocquery,BTW,前阶段和intel的聊过他们的Hive Over HBase是跳过MR的,效率非常赞,不过钱也略贵了=.=);
其实用Hive查询HBase非常简单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
//首先在HBase里建一张表并插入几条数据 hbase(main): 003 : 0 > create 'table_inhbase' , 'cf'
0 row(s) in 1.2060 seconds
=> Hbase::Table - table_inhbase hbase(main): 004 : 0 > list
TABLE table_inhbase 1 row(s) in 0.0350 seconds
hbase(main): 005 : 0 > put 'table_inhbase' , 'row1' , 'cf:a' , 'value1'
0 row(s) in 0.0830 seconds
hbase(main): 006 : 0 > put 'table_inhbase' , 'row2' , 'cf:a' , 'value2'
0 row(s) in 0.0200 seconds
hbase(main): 007 : 0 > put 'table_inhbase' , 'row3' , 'cf:b' , 'value3'
0 row(s) in 0.0180 seconds
hbase(main): 008 : 0 > scan 'table_inhbase'
ROW COLUMN+CELL row1 column=cf:a, timestamp= 1383736436773 ,value=value1
row2 column=cf:a, timestamp= 1383736462917 ,value=value2
row3 column=cf:b, timestamp= 1383736476017 ,value=value3
3 row(s) in 0.0660 seconds
//在Hive里创建一个外部表,注意要在hive-site.xml加入ZK,否则会hang住,一直去重试localhost:2181 CREATE EXTERNAL TABLE ext_table_inhbase(key string, avalue string,bvaluestring) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ( "hbase.columns.mapping" = "cf:a,cf:b" )
TBLPROPERTIES( "hbase.table.name" = "table_inhbase" );
hive> CREATE EXTERNAL TABLE ext_table_inhbase(key string, avaluestring,bvalue string) > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES( "hbase.columns.mapping" = "cf:a,cf:b" )
> TBLPROPERTIES( "hbase.table.name" = "table_inhbase" );
OK //注意,这里要加入这2个jar包:hbase-0.94.6-cdh4.4.0.jar,hive-hbase-handler-0.10.0-cdh4.4.0.jar否则会抛出异常 hive> select * from ext_table_inhbase; OK row1 value1 NULL row2 value2 NULL row3 NULL value3 Time taken: 0.609 seconds
hive> select key,avalue from ext_table_inhbase; java.io.IOException: Cannot create an instance of InputSplit.apache.hadoop.hive.hbase.HBaseSplit:Classorg.apache.hadoop.hive.hbase.HBaseSplit not found at org.apache.hadoop.hive.ql.io.HiveInputFormat$HiveInputSplit.readFields(HiveInputFormat.java: 146 )
atorg.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java: 73 )
atorg.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java: 44 )
atorg.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java: 356 )
atorg.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java: 388 )
at org.apache.hadoop.mapred.MapTask.run(MapTask.java: 332 )
atorg.apache.hadoop.mapred.Child$ 4 .run(Child.java: 268 )
atjava.security.AccessController.doPrivileged(Native Method)
atjavax.security.auth.Subject.doAs(Subject.java: 396 )
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java: 1408 )
hive> select key,avalue from ext_table_inhbase; Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Hadoop job information for Stage- 1 : number of mappers: 1 ; number ofreducers: 0
19 : 33 : 55 , 386 Stage- 1 map = 0 %, reduce = 0 %
19 : 34 : 01 , 472 Stage- 1 map = 100 %, reduce = 0 %, CumulativeCPU 2.73 sec
19 : 34 : 02 , 495 Stage- 1 map = 100 %, reduce = 0 %, CumulativeCPU 2.73 sec
19 : 34 : 03 , 512 Stage- 1 map = 100 %, reduce = 100 %,Cumulative CPU 2.73 sec
MapReduce Total cumulative CPU time: 2 seconds 730 msec
Ended Job = job_201311061424_0003 MapReduce Jobs Launched: Job 0 : Map: 1 Cumulative CPU: 2.73 sec HDFS Read: 255 HDFS Write: 39 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 730 msec
OK row1 value1 row2 value2 //尝试通过HiveServer去查询 beeline> !connect jdbc:hive2: //test-2:10000 hdfs hdfsorg.apache.hive.jdbc.HiveDriver
Connecting to jdbc:hive2: //test-2:10000
Connected to: Hive (version 0.10 . 0 )
Driver: Hive (version 0.10 . 0 -cdh4. 4.0 )
Transaction isolation: TRANSACTION_REPEATABLE_READ 0 : jdbc:hive2: //test-2:10000> show databases;
+----------------+ | database_name | +----------------+ | default |
+----------------+ 1 row selected ( 1.483 seconds)
0 : jdbc:hive2: //test-2:10000> show tables;
+--------------------+ | tab_name | +--------------------+ | ext_table_inhbase | |test | +--------------------+ 2 rows selected ( 0.657 seconds)
0 : jdbc:hive2: //test-2:10000> select count(*) from ext_table_inhbase;
+------+ | _c0 | +------+ | 3 |
+------+ |
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1320637,如需转载请自行联系原作者