Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)

Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件、关系型数据库,非关系行数据库。

各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使用HBase作为存储的介质是非常不错的选择。

现需求是:Spark对Hive、mysql数据源进行处理,然后将resultDataFrame写入HBase,但是HBase和Spark不在用一个环境,即结果需要通过网络IO进行二次操作。所以此篇文章会采取某些手段来实现上述要求。

将DataFrame写入Hbase的两种方式:

通过关联Hive-HBase将结果数据导入HBase

通过生成HFile导入HBase

通过关联Hive-HBase将结果数据导入HBase

通过Hive-HBase将结果导入HBase也分两种情况

1.Hive为管理表

 1.1 创建的hive管理表关联HBase 

  1 drop table table_hive_mange;
  2 create table table_hive_mange
  3 (key String,
  4 dict_id String,
  5 city_id String,
  6 city_name String,
  7 city_code String,
  8 group_id String,
  9 group_name String,
 10 area_code String,
 11 bureau_id String,
 12 sort String,
 13 bureau_name String)
 14 row format delimited
 15 fields terminated by '|'
 16 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
 17 WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
 18 info:dict_id,
 19 info:city_id,
 20 info:city_name,
 21 info:city_code,
 22 info:group_id,
 23 info:group_name,
 24 info:area_code,
 25 info:bureau_id, info:sort,
 26 info:bureau_name")
 27 TBLPROPERTIES("hbase.table.name" = "table_hive_mange");
 28 
 29 hive> drop table table_hive_mange;
 30 OK
 31 Time taken: 1.554 seconds
 32 hive> create table table_hive_mange
 33     > (key String,
 34     > dict_id String,
 35     > city_id String,
 36     > city_name String,
 37     > city_code String,
 38     > group_id String,
 39     > group_name String,
 40     > area_code String,
 41     > bureau_id String,
 42     > sort String,
 43     > bureau_name String)
 44     > row format delimited
 45     > fields terminated by '|'
 46     > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
 47     > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
 48     > info:dict_id,
 49     > info:city_id,
 50     > info:city_name,
 51     > info:city_code,
 52     > info:group_id,
 53     > info:group_name,
 54     > info:area_code,
 55     > info:bureau_id, info:sort,
 56     > info:bureau_name")
 57     > TBLPROPERTIES("hbase.table.name" = "table_hive_mange");
 58 OK
 59 Time taken: 6.884 seconds
 60 
 61 hive> desc formatted table_hive_mange;
 62 OK
 63 # col_name              data_type               comment             
 64                  
 65 key                     string                  from deserializer   
 66 dict_id                 string                  from deserializer   
 67 city_id                 string                  from deserializer   
 68 city_name               string                  from deserializer   
 69 city_code               string                  from deserializer   
 70 group_id                string                  from deserializer   
 71 group_name              string                  from deserializer   
 72 area_code               string                  from deserializer   
 73 bureau_id               string                  from deserializer   
 74 sort                    string                  from deserializer   
 75 bureau_name             string                  from deserializer   
 76                  
 77 # Detailed Table Information             
 78 Database:               default                  
 79 Owner:                  hdfs                     
 80 CreateTime:             Tue Oct 16 16:23:22 CST 2018     
 81 LastAccessTime:         UNKNOWN                  
 82 Protect Mode:           None                     
 83 Retention:              0                        
 84 Location:               hdfs://ns1/user/hive/warehouse/table_hive_mange  
 85 Table Type:             MANAGED_TABLE            
 86 Table Parameters:                
 87         hbase.table.name        table_hive_mange    
 88         storage_handler         org.apache.hadoop.hive.hbase.HBaseStorageHandler
 89         transient_lastDdlTime   1539678202          
 90                  
 91 # Storage Information            
 92 SerDe Library:          org.apache.hadoop.hive.hbase.HBaseSerDe  
 93 InputFormat:            null                     
 94 OutputFormat:           null                     
 95 Compressed:             No                       
 96 Num Buckets:            -1                       
 97 Bucket Columns:         []                       
 98 Sort Columns:           []                       
 99 Storage Desc Params:             
100         field.delim             |                   
101         hbase.columns.mapping   :key,\ninfo:dict_id,\ninfo:city_id,\ninfo:city_name,\ninfo:city_code,\ninfo:group_id,\ninfo:group_name,\ninfo:area_code,\ninfo:bureau_id, info:sort,\ninfo:bureau_name
102         serialization.format    |                   
103 Time taken: 2.098 seconds, Fetched: 40 row(s)
104 
105 //此时HBase表已经生成
106 hbase(main):001:0> desc 'table_hive_mange'
107 Table table_hive_mange is ENABLED                                                                                                                                                                                                            
108 table_hive_mange                                                                                                                                                                                                                             
109 COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                                                  
110 {NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => 
111 '65536', REPLICATION_SCOPE => '0'}                                                                                                                                                                                                           
112 1 row(s) in 0.3910 seconds
113 
114 hbase(main):002:0>  

 1.2 创建普通的hive管理表

 1 drop table table_hive_mange1;
 2 create table table_hive_mange1
 3 (key String,
 4 dict_id String,
 5 city_id String,
 6 city_name String,
 7 city_code String,
 8 group_id String,
 9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED AS TEXTFILE;
17 
18 hive> drop table table_hive_mange1;
19 OK
20 Time taken: 0.027 seconds
21 hive> create table table_hive_mange1
22     > (key String,
23     > dict_id String,
24     > city_id String,
25     > city_name String,
26     > city_code String,
27     > group_id String,
28     > group_name String,
29     > area_code String,
30     > bureau_id String,
31     > sort String,
32     > bureau_name String)
33     > row format delimited
34     > fields terminated by '|'
35     > STORED AS TEXTFILE;
36 OK
37 Time taken: 0.188 seconds
38 hive> desc formatted 
39     > table_hive_mange1;
40 OK
41 # col_name              data_type               comment             
42                  
43 key                     string                                      
44 dict_id                 string                                      
45 city_id                 string                                      
46 city_name               string                                      
47 city_code               string                                      
48 group_id                string                                      
49 group_name              string                                      
50 area_code               string                                      
51 bureau_id               string                                      
52 sort                    string                                      
53 bureau_name             string                                      
54                  
55 # Detailed Table Information             
56 Database:               default                  
57 Owner:                  hdfs                     
58 CreateTime:             Tue Oct 16 16:24:41 CST 2018     
59 LastAccessTime:         UNKNOWN                  
60 Protect Mode:           None                     
61 Retention:              0                        
62 Location:               hdfs://ns1/user/hive/warehouse/table_hive_mange1         
63 Table Type:             MANAGED_TABLE            
64 Table Parameters:                
65         transient_lastDdlTime   1539678281          
66                  
67 # Storage Information            
68 SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe       
69 InputFormat:            org.apache.hadoop.mapred.TextInputFormat         
70 OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
71 Compressed:             No                       
72 Num Buckets:            -1                       
73 Bucket Columns:         []                       
74 Sort Columns:           []                       
75 Storage Desc Params:             
76         field.delim             |                   
77         serialization.format    |                   
78 Time taken: 4.3 seconds, Fetched: 37 row(s) 

 1.3 准备一份数据

 1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse//hive-hbase
 2 736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
 3 475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
 4 765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
 5 667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
 6 758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
 7 796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
 8 754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
 9 706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
10 754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
11 626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
12 754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
13 755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
14 661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
15 765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
16 754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
17 375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
18 626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
19 458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
20 715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
21 723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
22 221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司 

1.4 向 table_hive_mange1 中添加数据

1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange1;
3 Loading data to table default.table_hive_mange1
4 Table default.table_hive_mange1 stats: [numFiles=1, totalSize=1947]
5 OK
6 Time taken: 0.402 seconds
7 hive> 

1.5 查看 table_hive_mange1 中的数据

 1 hive> select * from table_hive_mange1;
 2 OK
 3 736_9铜锣湾1    1       73629   铜锣湾1 啥子字段        110     艾欧尼亚大区    weq     76D5A3D3EA4     1       汉东省东中猴姑米西翻公司
 4 475_铜锣湾2     13      4750    铜锣湾2 啥子字段        110     艾欧尼亚大区    weq     5F4E9不知C5     1       汉东省江中猴姑米西翻公司
 5 765_铜锣湾3     3       7650    铜锣湾3 啥子字段        110     艾欧尼亚大区    weq     59B4B不知92     1       汉东省中中猴姑米西翻公司
 6 667_铜锣湾4     14      6672    铜锣湾4 啥子字段        110     艾欧尼亚大区    weq     CF19F不知名B    21      汉东省阳中猴姑米西翻公司
 7 758_铜锣湾5     4       7586    铜锣湾5 啥子字段        110     黑莓尼亚大区    weq     507EB不知78     1       汉东省珠中猴姑米西翻公司
 8 796_铜锣湾6     15      7966    铜锣湾6 啥子字段        110     艾欧尼亚大区    weq     9C9C0不知名4    21      汉东省云中猴姑米西翻公司
 9 754_8铜锣湾7    5       75468   铜锣湾7 啥子字段        110     艾欧尼亚大区    weq     5B736不知名F    11      汉东省潮中猴姑米西翻公司
10 706_铜锣湾8     16      7062    铜锣湾8 啥子字段        110     艾欧尼亚大区    weq     51A88不知名8    11      汉东省河中猴姑米西翻公司
11 754_铜锣湾9     6       7547    铜锣湾9 啥子字段        110     艾欧尼亚大区    weq     EEA9F不知59     1       汉东省佛中猴姑米西翻公司
12 626_铜锣湾0     17      6263    铜锣湾0 啥子字段        110     瑞本大区        weq     9FF783FEE9      11      汉东省揭中猴姑米西翻公司
13 754_铜锣湾-     7       7542    铜锣湾- 啥子字段        110     艾欧尼亚大区    weq     246A1不知FC     1       汉东省惠中猴姑米西翻公司
14 755_铜锣湾12    18      7553    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     E9BE9不知名9    11      汉东省梅中猴姑米西翻公司
15 661_铜锣湾12    8       6618    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     5D0A9不知名E    11      汉东省茂中猴姑米西翻公司
16 765_铜锣湾3     19      7651    铜锣湾3 啥子字段        110     德玛西亚尼亚大区        weq     BD6F不6379      11      汉东省韶中猴姑米西翻公司
17 754_铜锣湾32    9       7544    铜锣湾32        啥子字段        110     艾欧尼亚大区    weq     18D7A不知1E     1       汉东省汕中猴姑米西翻公司
18 375_铜锣湾234   20      3755    铜锣湾234       啥子字段        110     艾欧尼亚大区    weq     31E2F不知82     1       汉东省深中猴姑米西翻公司
19 626_0铜锣湾45   10      62630   铜锣湾45        啥子字段        110     艾欧尼亚大区    weq     1BA07不知名B    11      汉东省汕中猴姑米西翻公司
20 458铜锣湾99     21      458     铜锣湾99        啥子字段        110     艾欧尼亚大区    weq     3C09D不知名B    11      汉东省肇中猴姑米西翻公司
21 715铜锣湾12     11      715     铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     3A49A不知名7    11      汉东省湛中猴姑米西翻公司
22 723_铜锣湾3     2       7231    铜锣湾3 啥子字段        110     台湾大区        weq     F8E9FCB7B1      11      汉东省清中猴姑米西翻公司
23 221_铜锣湾2     12      2210    铜锣湾2 啥子字段        110     韩国大区        weq     13F1D05894      1       汉东省广中猴姑米西翻公司
24 Time taken: 0.035 seconds, Fetched: 21 row(s)
25 hive>  

1.6 将 table_hive_mange1 的数据插入 table_hive_mange

 1 insert into table  table_hive_mange  select * from table_hive_mange1;
 2 
 3 hive> insert into table  table_hive_mange  select * from table_hive_mange1;
 4 Query ID = hdfs_20181016165252_4e5b605f-0351-4bd0-aa2e-0d9829694f6d
 5 Total jobs = 1
 6 Launching Job 1 out of 1
 7 Number of reduce tasks is set to 0 since there s no reduce operator
 8 Starting Job = job_1519375199907_258533, Tracking URL = http://iptve2e01:8088/proxy/application_1519375199907_258533/
 9 Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job  -kill job_1519375199907_258533
10 Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
11 2018-10-16 16:53:46,259 Stage-0 map = 0%,  reduce = 0%
12 2018-10-16 16:54:06,773 Stage-0 map = 100%,  reduce = 0%, Cumulative CPU 6.65 sec
13 MapReduce Total cumulative CPU time: 6 seconds 650 msec
14 Ended Job = job_1519375199907_258533
15 MapReduce Jobs Launched: 
16 Stage-Stage-0: Map: 1   Cumulative CPU: 6.65 sec   HDFS Read: 7381 HDFS Write: 0 SUCCESS
17 Total MapReduce CPU Time Spent: 6 seconds 650 msec
18 OK
19 Time taken: 89.331 seconds 

1.7 查看table_hive_mange 中的数据

 1 hive> select * from table_hive_mange 中的数据;
 2 OK
 3 221_铜锣湾2     12      2210    铜锣湾2 啥子字段        110     韩国大区        weq     13F1D05894      1       汉东省广中猴姑米西翻公司
 4 375_铜锣湾234   20      3755    铜锣湾234       啥子字段        110     艾欧尼亚大区    weq     31E2F不知82     1       汉东省深中猴姑米西翻公司
 5 458铜锣湾99     21      458     铜锣湾99        啥子字段        110     艾欧尼亚大区    weq     3C09D不知名B    11      汉东省肇中猴姑米西翻公司
 6 475_铜锣湾2     13      4750    铜锣湾2 啥子字段        110     艾欧尼亚大区    weq     5F4E9不知C5     1       汉东省江中猴姑米西翻公司
 7 626_0铜锣湾45   10      62630   铜锣湾45        啥子字段        110     艾欧尼亚大区    weq     1BA07不知名B    11      汉东省汕中猴姑米西翻公司
 8 626_铜锣湾0     17      6263    铜锣湾0 啥子字段        110     瑞本大区        weq     9FF783FEE9      11      汉东省揭中猴姑米西翻公司
 9 661_铜锣湾12    8       6618    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     5D0A9不知名E    11      汉东省茂中猴姑米西翻公司
10 667_铜锣湾4     14      6672    铜锣湾4 啥子字段        110     艾欧尼亚大区    weq     CF19F不知名B    21      汉东省阳中猴姑米西翻公司
11 706_铜锣湾8     16      7062    铜锣湾8 啥子字段        110     艾欧尼亚大区    weq     51A88不知名8    11      汉东省河中猴姑米西翻公司
12 715铜锣湾12     11      715     铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     3A49A不知名7    11      汉东省湛中猴姑米西翻公司
13 723_铜锣湾3     2       7231    铜锣湾3 啥子字段        110     台湾大区        weq     F8E9FCB7B1      11      汉东省清中猴姑米西翻公司
14 736_9铜锣湾1    1       73629   铜锣湾1 啥子字段        110     艾欧尼亚大区    weq     76D5A3D3EA4     1       汉东省东中猴姑米西翻公司
15 754_8铜锣湾7    5       75468   铜锣湾7 啥子字段        110     艾欧尼亚大区    weq     5B736不知名F    11      汉东省潮中猴姑米西翻公司
16 754_铜锣湾-     7       7542    铜锣湾- 啥子字段        110     艾欧尼亚大区    weq     246A1不知FC     1       汉东省惠中猴姑米西翻公司
17 754_铜锣湾32    9       7544    铜锣湾32        啥子字段        110     艾欧尼亚大区    weq     18D7A不知1E     1       汉东省汕中猴姑米西翻公司
18 754_铜锣湾9     6       7547    铜锣湾9 啥子字段        110     艾欧尼亚大区    weq     EEA9F不知59     1       汉东省佛中猴姑米西翻公司
19 755_铜锣湾12    18      7553    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     E9BE9不知名9    11      汉东省梅中猴姑米西翻公司
20 758_铜锣湾5     4       7586    铜锣湾5 啥子字段        110     黑莓尼亚大区    weq     507EB不知78     1       汉东省珠中猴姑米西翻公司
21 765_铜锣湾3     19      7651    铜锣湾3 啥子字段        110     德玛西亚尼亚大区        weq     BD6F不6379      11      汉东省韶中猴姑米西翻公司
22 796_铜锣湾6     15      7966    铜锣湾6 啥子字段        110     艾欧尼亚大区    weq     9C9C0不知名4    21      汉东省云中猴姑米西翻公司
23 Time taken: 0.29 seconds, Fetched: 20 row(s)
24 hive>      

1.8 查看HBase中 table_hive_mange 的数据

 1 hbase(main):008:0> scan 'table_hive_mange',{LIMIT=>2}
 2 ROW                                                          COLUMN+CELL                                                                                                                                                                     
 3  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:area_code, timestamp=1539680045751, value=weq                                                                                                                       
 4  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_id, timestamp=1539680045751, value=13F1D05894                                                                                                                
 5  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_name, timestamp=1539680045751, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
 6                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
 7  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_code, timestamp=1539680045751, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
 8  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_id, timestamp=1539680045751, value=2210                                                                                                                        
 9  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_name, timestamp=1539680045751, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                                                                                     
10  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:dict_id, timestamp=1539680045751, value=12                                                                                                                          
11  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_id, timestamp=1539680045751, value=110                                                                                                                        
12  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_name, timestamp=1539680045751, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA                                                                         
13  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:sort, timestamp=1539680045751, value=1                                                                                                                              
14  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:area_code, timestamp=1539680045751, value=weq                                                                                                                       
15  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_id, timestamp=1539680045751, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582                                                                                           
16  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_name, timestamp=1539680045751, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
17                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
18  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_code, timestamp=1539680045751, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
19  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_id, timestamp=1539680045751, value=3755                                                                                                                        
20  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_name, timestamp=1539680045751, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                                                                                   
21  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:dict_id, timestamp=1539680045751, value=20                                                                                                                          
22  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_id, timestamp=1539680045751, value=110                                                                                                                        
23  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_name, timestamp=1539680045751, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA                                                 
24  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:sort, timestamp=1539680045751, value=1                                                                                                                              
25 2 row(s) in 0.0140 seconds
26 
27 hbase(main):009:0> 

1.9 删除表 

 1 先删除hbase(disabled->drop)
 2 
 3 hbase(main):009:0> disable 'table_hive_mange'
 4 0 row(s) in 2.2700 seconds
 5 
 6 hbase(main):010:0> drop  'table_hive_mange'
 7 0 row(s) in 1.2290 seconds
 8 
 9 hive> show tables;
10 OK
11 frt_user_auth_log1
12 table_hive_mange
13 table_hive_mange1
14 Time taken: 0.116 seconds, Fetched: 8 row(s)
15 hive> select * from table_hive_mange; 16 OK 17 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange 18 Time taken: 0.245 seconds
19 hive> select * from table_hive_mange; 20 OK 21 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange 22 Time taken: 0.148 seconds
23 hive> show tables; 24 OK 25 table_hive_mange 26 table_hive_mange1 27 Time taken: 0.01 seconds, Fetched: 8 row(s)
28 hive> select * from table_hive_mange; 29 OK 30 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange 31 Time taken: 0.09 seconds 32 hive> drop table table_hive_mange; 33 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:org.apache.hadoop.hbase.TableNotFoundException: table_hive_mange 34 at org.apache.hadoop.hbase.client.HBaseAdmin.checkTableExistence(HBaseAdmin.java:1466) 35 at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1477) 36 at org.apache.hadoop.hbase.client.HBaseAdmin.isTableEnabled(HBaseAdmin.java:1486) 37 ... 38 ) 39 hive> show tables; 40 OK 41 table_hive_mange1 42 Time taken: 0.009 seconds, Fetched: 7 row(s) 43 44 //先删除Hive表 45 hive> drop table table_hive_mange; 46 OK 47 Time taken: 6.604 seconds 48 49 hbase(main):032:0> scan 'table_hive_mange',{LIMIT=>2} 50 ROW COLUMN+CELL 51 52 ERROR: Unknown table table_hive_mange! 53 54 hbase(main):033:0> list 

2.Hive为外部表

2.1 创建 Hbase 表 table_hive_xternal 

1 create  'table_hive_xternal','info'
2 
3 hbase(main):012:0> create  'table_hive_xternal','info'
4 0 row(s) in 1.2450 seconds
5 
6 => Hbase::Table - table_hive_xternal
7 hbase(main):013:0>  

2.2 建立外部表(hive),关联存在hbase表

 1 drop table table_hive_xternal;
 2 create external table table_hive_xternal
 3 (key String,
 4 dict_id String,
 5 city_id String,
 6 city_name String,
 7 city_code String,
 8 group_id String,
 9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
17 WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
18     info:dict_id,
19     info:city_id,
20     info:city_name,
21     info:city_code,
22     info:group_id,
23     info:group_name,
24     info:area_code,
25     info:bureau_id,
26     info:sort,
27     info:bureau_name")
28 TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");

 1 hive> create external table table_hive_xternal
 2     > (key String,
 3     > dict_id String,
 4     > city_id String,
 5     > city_name String,
 6     > city_code String,
 7     > group_id String,
 8     > group_name String,
 9     > area_code String,
10     > bureau_id String,
11     > sort String,
12     > bureau_name String)
13     > row format delimited
14     > fields terminated by '|'
15     > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
16     > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
17     >     info:dict_id,
18     >     info:city_id,
19     >     info:city_name,
20     >     info:city_code,
21     >     info:group_id,
22     >     info:group_name,
23     >     info:area_code,
24     >     info:bureau_id,
25     >     info:sort,
26     >     info:bureau_name")
27     > TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
28 OK
29 Time taken: 0.092 seconds
30 
31 hive> desc formatted table_hive_xternal;
32 OK
33 # col_name              data_type               comment             
34                  
35 key                     string                  from deserializer   
36 dict_id                 string                  from deserializer   
37 city_id                 string                  from deserializer   
38 city_name               string                  from deserializer   
39 city_code               string                  from deserializer   
40 group_id                string                  from deserializer   
41 group_name              string                  from deserializer   
42 area_code               string                  from deserializer   
43 bureau_id               string                  from deserializer   
44 sort                    string                  from deserializer   
45 bureau_name             string                  from deserializer   
46                  
47 # Detailed Table Information             
48 Database:               default                  
49 Owner:                  hdfs                     
50 CreateTime:             Tue Oct 16 17:20:26 CST 2018     
51 LastAccessTime:         UNKNOWN                  
52 Protect Mode:           None                     
53 Retention:              0                        
54 Location:               hdfs://ns1/user/hive/warehouse/table_hive_xternal        
55 Table Type:             EXTERNAL_TABLE           
56 Table Parameters:                
57         EXTERNAL                TRUE                
58         hbase.table.name        table_hive_xternal  
59         storage_handler         org.apache.hadoop.hive.hbase.HBaseStorageHandler
60         transient_lastDdlTime   1539681626          
61                  
62 # Storage Information            
63 SerDe Library:          org.apache.hadoop.hive.hbase.HBaseSerDe  
64 InputFormat:            null                     
65 OutputFormat:           null                     
66 Compressed:             No                       
67 Num Buckets:            -1                       
68 Bucket Columns:         []                       
69 Sort Columns:           []                       
70 Storage Desc Params:             
71         field.delim             |                   
72         hbase.columns.mapping   :key,\n    info:dict_id,\n    info:city_id,\n    info:city_name,\n    info:city_code,\n    info:group_id,\n    info:group_name,\n    info:area_code,\n    info:bureau_id,\n    info:sort,\n    info:bureau_name
73         serialization.format    |                   
74 Time taken: 0.882 seconds, Fetched: 41 row(s) 

2.3创建普通的 hive 管理表

 1 drop table table_hive_xternal_1;
 2 create table table_hive_xternal_1
 3 (key String,
 4 dict_id String,
 5 city_id String,
 6 city_name String,
 7 city_code String,
 8 group_id String,
 9 group_name String,
10 area_code String,
11 bureau_id String,
12 sort String,
13 bureau_name String)
14 row format delimited
15 fields terminated by '|'
16 STORED AS TEXTFILE;
 1 hive> desc formatted table_hive_xternal_1;
 2 OK
 3 # col_name              data_type               comment             
 4                  
 5 key                     string                                      
 6 dict_id                 string                                      
 7 city_id                 string                                      
 8 city_name               string                                      
 9 city_code               string                                      
10 group_id                string                                      
11 group_name              string                                      
12 area_code               string                                      
13 bureau_id               string                                      
14 sort                    string                                      
15 bureau_name             string                                      
16                  
17 # Detailed Table Information             
18 Database:               default                  
19 Owner:                  hdfs                     
20 CreateTime:             Tue Oct 16 17:21:05 CST 2018     
21 LastAccessTime:         UNKNOWN                  
22 Protect Mode:           None                     
23 Retention:              0                        
24 Location:               hdfs://ns1/user/hive/warehouse/table_hive_xternal_1      
25 Table Type:             MANAGED_TABLE            
26 Table Parameters:                
27         transient_lastDdlTime   1539681665          
28                  
29 # Storage Information            
30 SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe       
31 InputFormat:            org.apache.hadoop.mapred.TextInputFormat         
32 OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
33 Compressed:             No                       
34 Num Buckets:            -1                       
35 Bucket Columns:         []                       
36 Sort Columns:           []                       
37 Storage Desc Params:             
38         field.delim             |                   
39         serialization.format    |                   
40 Time taken: 0.033 seconds, Fetched: 37 row(s) 

2.4 准备一份数据

 1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -cat hdfs://ns1/user/hive/warehouse/hive-hbase
 2 736_9铜锣湾1|1|73629|铜锣湾1|啥子字段|110|艾欧尼亚大区|weq|76D5A3D3EA4|1|汉东省东中猴姑米西翻公司
 3 475_铜锣湾2|13|4750|铜锣湾2|啥子字段|110|艾欧尼亚大区|weq|5F4E9不知C5|1|汉东省江中猴姑米西翻公司
 4 765_铜锣湾3|3|7650|铜锣湾3|啥子字段|110|艾欧尼亚大区|weq|59B4B不知92|1|汉东省中中猴姑米西翻公司
 5 667_铜锣湾4|14|6672|铜锣湾4|啥子字段|110|艾欧尼亚大区|weq|CF19F不知名B|21|汉东省阳中猴姑米西翻公司
 6 758_铜锣湾5|4|7586|铜锣湾5|啥子字段|110|黑莓尼亚大区|weq|507EB不知78|1|汉东省珠中猴姑米西翻公司
 7 796_铜锣湾6|15|7966|铜锣湾6|啥子字段|110|艾欧尼亚大区|weq|9C9C0不知名4|21|汉东省云中猴姑米西翻公司
 8 754_8铜锣湾7|5|75468|铜锣湾7|啥子字段|110|艾欧尼亚大区|weq|5B736不知名F|11|汉东省潮中猴姑米西翻公司
 9 706_铜锣湾8|16|7062|铜锣湾8|啥子字段|110|艾欧尼亚大区|weq|51A88不知名8|11|汉东省河中猴姑米西翻公司
10 754_铜锣湾9|6|7547|铜锣湾9|啥子字段|110|艾欧尼亚大区|weq|EEA9F不知59|1|汉东省佛中猴姑米西翻公司
11 626_铜锣湾0|17|6263|铜锣湾0|啥子字段|110|瑞本大区|weq|9FF783FEE9|11|汉东省揭中猴姑米西翻公司
12 754_铜锣湾-|7|7542|铜锣湾-|啥子字段|110|艾欧尼亚大区|weq|246A1不知FC|1|汉东省惠中猴姑米西翻公司
13 755_铜锣湾12|18|7553|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|E9BE9不知名9|11|汉东省梅中猴姑米西翻公司
14 661_铜锣湾12|8|6618|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|5D0A9不知名E|11|汉东省茂中猴姑米西翻公司
15 765_铜锣湾3|19|7651|铜锣湾3|啥子字段|110|德玛西亚尼亚大区|weq|BD6F不6379|11|汉东省韶中猴姑米西翻公司
16 754_铜锣湾32|9|7544|铜锣湾32|啥子字段|110|艾欧尼亚大区|weq|18D7A不知1E|1|汉东省汕中猴姑米西翻公司
17 375_铜锣湾234|20|3755|铜锣湾234|啥子字段|110|艾欧尼亚大区|weq|31E2F不知82|1|汉东省深中猴姑米西翻公司
18 626_0铜锣湾45|10|62630|铜锣湾45|啥子字段|110|艾欧尼亚大区|weq|1BA07不知名B|11|汉东省汕中猴姑米西翻公司
19 458铜锣湾99|21|458|铜锣湾99|啥子字段|110|艾欧尼亚大区|weq|3C09D不知名B|11|汉东省肇中猴姑米西翻公司
20 715铜锣湾12|11|715|铜锣湾12|啥子字段|110|艾欧尼亚大区|weq|3A49A不知名7|11|汉东省湛中猴姑米西翻公司
21 723_铜锣湾3|2|7231|铜锣湾3|啥子字段|110|台湾大区|weq|F8E9FCB7B1|11|汉东省清中猴姑米西翻公司
22 221_铜锣湾2|12|2210|铜锣湾2|啥子字段|110|韩国大区|weq|13F1D05894|1|汉东省广中猴姑米西翻公司 

2.5 向 table_hive_xternal_1 中添加数据

1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal_1; 3 Loading data to table default.table_hive_xternal_1 4 Table default.table_hive_xternal_1 stats: [numFiles=1, totalSize=2681] 5 OK 6 Time taken: 0.534 seconds 

2.6 查看 table_hive_xternal_1 中的数据

 1 hive> select * from table_hive_xternal_1;
 2 OK
 3 736_9铜锣湾1    1       73629   铜锣湾1 啥子字段        110     艾欧尼亚大区    weq     76D5A3D3EA4     1       汉东省东中猴姑米西翻公司
 4 475_铜锣湾2     13      4750    铜锣湾2 啥子字段        110     艾欧尼亚大区    weq     5F4E9不知C5     1       汉东省江中猴姑米西翻公司
 5 765_铜锣湾3     3       7650    铜锣湾3 啥子字段        110     艾欧尼亚大区    weq     59B4B不知92     1       汉东省中中猴姑米西翻公司
 6 667_铜锣湾4     14      6672    铜锣湾4 啥子字段        110     艾欧尼亚大区    weq     CF19F不知名B    21      汉东省阳中猴姑米西翻公司
 7 758_铜锣湾5     4       7586    铜锣湾5 啥子字段        110     黑莓尼亚大区    weq     507EB不知78     1       汉东省珠中猴姑米西翻公司
 8 796_铜锣湾6     15      7966    铜锣湾6 啥子字段        110     艾欧尼亚大区    weq     9C9C0不知名4    21      汉东省云中猴姑米西翻公司
 9 754_8铜锣湾7    5       75468   铜锣湾7 啥子字段        110     艾欧尼亚大区    weq     5B736不知名F    11      汉东省潮中猴姑米西翻公司
10 706_铜锣湾8     16      7062    铜锣湾8 啥子字段        110     艾欧尼亚大区    weq     51A88不知名8    11      汉东省河中猴姑米西翻公司
11 754_铜锣湾9     6       7547    铜锣湾9 啥子字段        110     艾欧尼亚大区    weq     EEA9F不知59     1       汉东省佛中猴姑米西翻公司
12 626_铜锣湾0     17      6263    铜锣湾0 啥子字段        110     瑞本大区        weq     9FF783FEE9      11      汉东省揭中猴姑米西翻公司
13 754_铜锣湾-     7       7542    铜锣湾- 啥子字段        110     艾欧尼亚大区    weq     246A1不知FC     1       汉东省惠中猴姑米西翻公司
14 755_铜锣湾12    18      7553    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     E9BE9不知名9    11      汉东省梅中猴姑米西翻公司
15 661_铜锣湾12    8       6618    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     5D0A9不知名E    11      汉东省茂中猴姑米西翻公司
16 765_铜锣湾3     19      7651    铜锣湾3 啥子字段        110     德玛西亚尼亚大区        weq     BD6F不6379      11      汉东省韶中猴姑米西翻公司
17 754_铜锣湾32    9       7544    铜锣湾32        啥子字段        110     艾欧尼亚大区    weq     18D7A不知1E     1       汉东省汕中猴姑米西翻公司
18 375_铜锣湾234   20      3755    铜锣湾234       啥子字段        110     艾欧尼亚大区    weq     31E2F不知82     1       汉东省深中猴姑米西翻公司
19 626_0铜锣湾45   10      62630   铜锣湾45        啥子字段        110     艾欧尼亚大区    weq     1BA07不知名B    11      汉东省汕中猴姑米西翻公司
20 458铜锣湾99     21      458     铜锣湾99        啥子字段        110     艾欧尼亚大区    weq     3C09D不知名B    11      汉东省肇中猴姑米西翻公司
21 715铜锣湾12     11      715     铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     3A49A不知名7    11      汉东省湛中猴姑米西翻公司
22 723_铜锣湾3     2       7231    铜锣湾3 啥子字段        110     台湾大区        weq     F8E9FCB7B1      11      汉东省清中猴姑米西翻公司
23 221_铜锣湾2     12      2210    铜锣湾2 啥子字段        110     韩国大区        weq     13F1D05894      1       汉东省广中猴姑米西翻公司
24 Time taken: 0.036 seconds, Fetched: 21 row(s) 

2.7 将table_hive_xternal_1 的数据插入 table_hive_xternal

 1 insert into table table_hive_xternal select * from table_hive_xternal_1;
2 hive> insert into table table_hive_xternal select * from table_hive_xternal_1; 3 Query ID = hdfs_20181016172323_aad773d7-444f-431c-b0a2-917756ec965f 4 Total jobs = 1 5 Launching Job 1 out of 1 6 Number of reduce tasks is set to 0 since there's no reduce operator 7 Starting Job = job_1519375199907_258597, Tracking URL = http://127.0.0.1:8088/proxy/application_1519375199907_258597/ 8 Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job -kill job_1519375199907_258597 9 Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0 10 2018-10-16 17:23:57,040 Stage-0 map = 0%, reduce = 0% 11 2018-10-16 17:24:03,215 Stage-0 map = 100%, reduce = 0%, Cumulative CPU 4.31 sec 12 MapReduce Total cumulative CPU time: 4 seconds 310 msec 13 Ended Job = job_1519375199907_258597 14 MapReduce Jobs Launched: 15 Stage-Stage-0: Map: 1 Cumulative CPU: 4.31 sec HDFS Read: 7472 HDFS Write: 0 SUCCESS 16 Total MapReduce CPU Time Spent: 4 seconds 310 msec 17 OK 18 Time taken: 13.523 seconds 

2.8 查看 table_hive_xternal 的数据

 1 select * from table_hive_xternal;
 2 
 3 hive> select * from table_hive_xternal;
 4 OK
 5 221_铜锣湾2     12      2210    铜锣湾2 啥子字段        110     韩国大区        weq     13F1D05894      1       汉东省广中猴姑米西翻公司
 6 375_铜锣湾234   20      3755    铜锣湾234       啥子字段        110     艾欧尼亚大区    weq     31E2F不知82     1       汉东省深中猴姑米西翻公司
 7 458铜锣湾99     21      458     铜锣湾99        啥子字段        110     艾欧尼亚大区    weq     3C09D不知名B    11      汉东省肇中猴姑米西翻公司
 8 475_铜锣湾2     13      4750    铜锣湾2 啥子字段        110     艾欧尼亚大区    weq     5F4E9不知C5     1       汉东省江中猴姑米西翻公司
 9 626_0铜锣湾45   10      62630   铜锣湾45        啥子字段        110     艾欧尼亚大区    weq     1BA07不知名B    11      汉东省汕中猴姑米西翻公司
10 626_铜锣湾0     17      6263    铜锣湾0 啥子字段        110     瑞本大区        weq     9FF783FEE9      11      汉东省揭中猴姑米西翻公司
11 661_铜锣湾12    8       6618    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     5D0A9不知名E    11      汉东省茂中猴姑米西翻公司
12 667_铜锣湾4     14      6672    铜锣湾4 啥子字段        110     艾欧尼亚大区    weq     CF19F不知名B    21      汉东省阳中猴姑米西翻公司
13 706_铜锣湾8     16      7062    铜锣湾8 啥子字段        110     艾欧尼亚大区    weq     51A88不知名8    11      汉东省河中猴姑米西翻公司
14 715铜锣湾12     11      715     铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     3A49A不知名7    11      汉东省湛中猴姑米西翻公司
15 723_铜锣湾3     2       7231    铜锣湾3 啥子字段        110     台湾大区        weq     F8E9FCB7B1      11      汉东省清中猴姑米西翻公司
16 736_9铜锣湾1    1       73629   铜锣湾1 啥子字段        110     艾欧尼亚大区    weq     76D5A3D3EA4     1       汉东省东中猴姑米西翻公司
17 754_8铜锣湾7    5       75468   铜锣湾7 啥子字段        110     艾欧尼亚大区    weq     5B736不知名F    11      汉东省潮中猴姑米西翻公司
18 754_铜锣湾-     7       7542    铜锣湾- 啥子字段        110     艾欧尼亚大区    weq     246A1不知FC     1       汉东省惠中猴姑米西翻公司
19 754_铜锣湾32    9       7544    铜锣湾32        啥子字段        110     艾欧尼亚大区    weq     18D7A不知1E     1       汉东省汕中猴姑米西翻公司
20 754_铜锣湾9     6       7547    铜锣湾9 啥子字段        110     艾欧尼亚大区    weq     EEA9F不知59     1       汉东省佛中猴姑米西翻公司
21 755_铜锣湾12    18      7553    铜锣湾12        啥子字段        110     艾欧尼亚大区    weq     E9BE9不知名9    11      汉东省梅中猴姑米西翻公司
22 758_铜锣湾5     4       7586    铜锣湾5 啥子字段        110     黑莓尼亚大区    weq     507EB不知78     1       汉东省珠中猴姑米西翻公司
23 765_铜锣湾3     19      7651    铜锣湾3 啥子字段        110     德玛西亚尼亚大区        weq     BD6F不6379      11      汉东省韶中猴姑米西翻公司
24 796_铜锣湾6     15      7966    铜锣湾6 啥子字段        110     艾欧尼亚大区    weq     9C9C0不知名4    21      汉东省云中猴姑米西翻公司
25 Time taken: 0.089 seconds, Fetched: 20 row(s)

2.9 查看HBase中 table_hive_xternal 的数据

 1 scan 'table_hive_xternal',{LIMIT=>2}
 2 hbase(main):013:0> scan 'table_hive_xternal',{LIMIT=>2}
 3 ROW                                                          COLUMN+CELL                                                                                                                                                                     
 4  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:area_code, timestamp=1539681842885, value=weq                                                                                                                       
 5  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_id, timestamp=1539681842885, value=13F1D05894                                                                                                                
 6  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
 7                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
 8  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
 9  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_id, timestamp=1539681842885, value=2210                                                                                                                        
10  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                                                                                     
11  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:dict_id, timestamp=1539681842885, value=12                                                                                                                          
12  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_id, timestamp=1539681842885, value=110                                                                                                                        
13  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_name, timestamp=1539681842885, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA                                                                         
14  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:sort, timestamp=1539681842885, value=1                                                                                                                              
15  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:area_code, timestamp=1539681842885, value=weq                                                                                                                       
16  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582                                                                                           
17  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
18                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
19  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
20  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_id, timestamp=1539681842885, value=3755                                                                                                                        
21  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                                                                                   
22  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:dict_id, timestamp=1539681842885, value=20                                                                                                                          
23  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_id, timestamp=1539681842885, value=110                                                                                                                        
24  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_name, timestamp=1539681842885, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA                                                 
25  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:sort, timestamp=1539681842885, value=1                                                                                                                              
26 2 row(s) in 0.0260 seconds
2.10 删除表
先删除hive表再查询Hbase
 1 //删除hive表
 2 hive> show tables ;
 3 OK
 4 table_hive_xternal
 5 table_hive_xternal_1
 6 Time taken: 0.011 seconds, Fetched: 9 row(s)
 7 hive> drop table table_hive_xternal;
 8 OK
 9 Time taken: 0.476 seconds
10 hive> show tables ;
11 OK
12 table_hive_xternal_1
13 Time taken: 0.01 seconds, Fetched: 8 row(s)
14 hive> 
15 
16 //查询Hbase
17 hbase(main):014:0> scan 'table_hive_xternal',{LIMIT=>2}
18 ROW                                                          COLUMN+CELL                                                                                                                                                                     
19  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:area_code, timestamp=1539681842885, value=weq                                                                                                                       
20  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_id, timestamp=1539681842885, value=13F1D05894                                                                                                                
21  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE5\xB9\xBF\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
22                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
23  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
24  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_id, timestamp=1539681842885, value=2210                                                                                                                        
25  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                                                                                     
26  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:dict_id, timestamp=1539681842885, value=12                                                                                                                          
27  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_id, timestamp=1539681842885, value=110                                                                                                                        
28  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:group_name, timestamp=1539681842885, value=\xE9\x9F\xA9\xE5\x9B\xBD\xE5\xA4\xA7\xE5\x8C\xBA                                                                         
29  221_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE2                   column=info:sort, timestamp=1539681842885, value=1                                                                                                                              
30  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:area_code, timestamp=1539681842885, value=weq                                                                                                                       
31  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_id, timestamp=1539681842885, value=31E2F\xE4\xB8\x8D\xE7\x9F\xA582                                                                                           
32  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:bureau_name, timestamp=1539681842885, value=\xE6\xB1\x89\xE4\xB8\x9C\xE7\x9C\x81\xE6\xB7\xB1\xE4\xB8\xAD\xE7\x8C\xB4\xE5\xA7\x91\xE7\xB1\xB3\xE8\xA5\xBF\xE7\xBF\xBB
33                                                              \xE5\x85\xAC\xE5\x8F\xB8                                                                                                                                                        
34  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_code, timestamp=1539681842885, value=\xE5\x95\xA5\xE5\xAD\x90\xE5\xAD\x97\xE6\xAE\xB5                                                                          
35  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_id, timestamp=1539681842885, value=3755                                                                                                                        
36  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:city_name, timestamp=1539681842885, value=\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                                                                                   
37  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:dict_id, timestamp=1539681842885, value=20                                                                                                                          
38  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_id, timestamp=1539681842885, value=110                                                                                                                        
39  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:group_name, timestamp=1539681842885, value=\xE8\x89\xBE\xE6\xAC\xA7\xE5\xB0\xBC\xE4\xBA\x9A\xE5\xA4\xA7\xE5\x8C\xBA                                                 
40  375_\xE9\x93\x9C\xE9\x94\xA3\xE6\xB9\xBE234                 column=info:sort, timestamp=1539681842885, value=1                                                                                                                              
41 2 row(s) in 0.0200 seconds 
再走一次之前的流程把数据弄回来

先删除hbase 在查询Hive
 1 //删除hbase 
 2 hbase(main):018:0> disable 'table_hive_xternal'
 3 0 row(s) in 2.2310 seconds
 4 
 5 hbase(main):019:0> drop 'table_hive_xternal'
 6 0 row(s) in 1.2290 seconds
 7 
 8 //查询Hive
 9 hive> select * from table_hive_xternal;
10 OK
11 Failed with exception java.io.IOException:org.apache.hadoop.hbase.TableNotFoundException: table_hive_xternal
12 Time taken: 0.109 seconds 
2.3 Hive-Hbase 方式总结
2.3.1 管理表
  • Hbase 是否需要先建立
不需要,在创建table_hive_mange后HBase表会自动创建
  • 能否直接load数据到table_hive_mange
不能
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_mange;
3 FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD 
  • 删除表的影响
先删除HBase,数据已经被删除,此时虽然可以看到hive表但是已经没有数据(表信息还在),执行drop table 后报错 但是表信息已经被删除;
先删除Hive表,Hbase表同时也被删除
说明数据是存在HBase的而不是Hive

2.3.2 外部表
  • Hbase 是否需要先建立

需要,如果事先建好HBase汇报下面的错误
 1 hive> create external table table_hive_xternal
 2     > (key String,
 3     > dict_id String,
 4     > city_id String,
 5     > city_name String,
 6     > city_code String,
 7     > group_id String,
 8     > group_name String,
 9     > area_code String,
10     > bureau_id String,
11     > sort String,
12     > bureau_name String)
13     > row format delimited
14     > fields terminated by '|'
15     > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
16     > WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,
17     >     info:dict_id,
18     >     info:city_id,
19     >     info:city_name,
20     >     info:city_code,
21     >     info:group_id,
22     >     info:group_name,
23     >     info:area_code,
24     >     info:bureau_id,
25     >     info:sort,
26     >     info:bureau_name")
27     > TBLPROPERTIES("hbase.table.name" = "table_hive_xternal");
28 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:HBase table table_hive_xternal doesn't exist while the table is declared as an external table.)
29         at org.apache.hadoop.hive.hbase.HBaseStorageHandler.preCreateTable(HBaseStorageHandler.java:215)
...... 
  • 能否直接load数据到table_hive_xternal
不能
1 load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
2 hive> load data inpath 'hdfs://ns1/user/hive/warehouse/hive-hbase' into table table_hive_xternal;
3 FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD 
  • 删除表的影响
先删除Hive表,Hbase可以照常查询
先删除Hbase表,Hive表也会被删除
再次说明数据存储在Hbase

通过生成HFile导入HBase

要实现DataFrame通过HFile导入HBase有两个关键步骤
第一个是要生成Hfile
第二个是HFile导入HBase

测试DataFrame数据来自mysql,如果对读取mysql作为DataFrame不熟悉的人可以参考 Spark:读取mysql数据作为DataFrame
当然也可以自己决定DataFrame的数据来源,此处以Mysql为例

1.mysql的信息

mysql的信息我保存在了外部的配置文件,这样方便后续的配置添加。

1 //配置文件示例:
2 [hdfs@iptve2e03 tmp_lillcol]$ cat job.properties 
3 #mysql数据库配置
4 mysql.driver=com.mysql.jdbc.Driver
5 mysql.url=jdbc:mysql://127.0.0.1:3306/database1?useSSL=false&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true
6 mysql.username=user
7 mysql.password=123456

2.需要的jar依赖

sbt版本,maven的对应修改即可

 1 libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0-cdh5.7.2"
 2 libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0-cdh5.7.2"
 3 libraryDependencies += "org.apache.spark" % "spark-hive_2.10" % "1.6.0-cdh5.7.2"
 4 libraryDependencies += "org.apache.hbase" % "hbase-client" % "1.2.0-cdh5.7.2"
 5 libraryDependencies += "org.apache.hbase" % "hbase-server" % "1.2.0-cdh5.7.2"
 6 libraryDependencies += "org.apache.hbase" % "hbase-common" % "1.2.0-cdh5.7.2"
 7 libraryDependencies += "org.apache.hbase" % "hbase-protocol" % "1.2.0-cdh5.7.2"
 8 libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.38"
 9 libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0-cdh5.7.2"
10 libraryDependencies += "com.yammer.metrics" % "metrics-core" % "2.2.0" 

3. 完整代码

  1 import java.io.FileInputStream
  2 import java.util.Properties
  3 
  4 import org.apache.hadoop.conf.Configuration
  5 import org.apache.hadoop.fs.{FileSystem, Path}
  6 import org.apache.hadoop.fs.permission.{FsAction, FsPermission}
  7 import org.apache.hadoop.hbase.io.ImmutableBytesWritable
  8 import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2
  9 import org.apache.hadoop.hbase.util.Bytes
 10 import org.apache.hadoop.hbase.{HBaseConfiguration, KeyValue}
 11 import org.apache.hadoop.mapreduce.Job
 12 import org.apache.spark.rdd.RDD
 13 import org.apache.spark.sql.functions.{concat, lit}
 14 import org.apache.spark.sql.hive.HiveContext
 15 import org.apache.spark.sql.{DataFrame, SQLContext}
 16 import org.apache.spark.{SparkConf, SparkContext}
 17 
 18 /**
 19   * @author 利伊奥克儿-lillcol
 20   *         2018/10/14-11:08
 21   *
 22   */
 23 object TestHFile {
 24   var hdfsPath: String = ""
 25   var proPath: String = ""
 26   var DATE: String = ""
 27 
 28   val sparkConf: SparkConf = new SparkConf().setAppName(getClass.getSimpleName)
 29   val sc: SparkContext = new SparkContext(sparkConf)
 30   val sqlContext: SQLContext = new HiveContext(sc)
 31 
 32   import sqlContext.implicits._
 33 
 34   def main(args: Array[String]): Unit = {
 35     hdfsPath = args(0)
 36     proPath = args(1)
 37 
 38     //HFile保存路径
 39     val save_path: String = hdfsPath + "TableTestHFile"
 40     //获取测试DataFrame
 41     val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath)
 42 
 43     val resultDataFrame: DataFrame = dim_sys_city_dict
 44       .select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
 45     //注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
 46     saveASHfFile(resultDataFrame, "cf_info", save_path)
 47   }
 48 
 49   /**
 50     * 将DataFrame 保存为 HFile
 51     *
 52     * @param resultDataFrame 需要保存为HFile的 DataFrame,DataFrame的第一个字段必须为"key"
 53     * @param clounmFamily    列族名称(必须在Hbase中存在,否则在load数据的时候会失败)
 54     * @param save_path       HFile的保存路径
 55     */
 56   def saveASHfFile(resultDataFrame: DataFrame, clounmFamily: String, save_path: String): Unit = {
 57     val conf: Configuration = HBaseConfiguration.create()
 58     lazy val job = Job.getInstance(conf)
 59     job.setMapOutputKeyClass(classOf[ImmutableBytesWritable]) //设置MapOutput Key Value 的数据类型
 60     job.setMapOutputValueClass(classOf[KeyValue])
 61 
 62     var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
 63     columnsName = columnsName.drop(1).sorted //把key去掉  因为要排序
 64 
 65     val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
 66       .map(row => {
 67         var kvlist: Seq[KeyValue] = List()
 68         var rowkey: Array[Byte] = null
 69         var cn: Array[Byte] = null
 70         var v: Array[Byte] = null
 71         var kv: KeyValue = null
 72         val cf: Array[Byte] = clounmFamily.getBytes //列族
 73         rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
 74         for (i <- 1 to (columnsName.length - 1)) {
 75           cn = columnsName(i).getBytes() //列的名称
 76           v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
 77           //将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
 78           kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
 79           //
 80           kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
 81         }
 82         (new ImmutableBytesWritable(rowkey), kvlist)
 83       })
 84 
 85     //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
 86     val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
 87       s.iterator
 88     })
 89 
 90     delete_hdfspath(save_path) //删除save_path 原来的数据
 91     //保存数据
 92     result
 93       .sortBy(x => x._1, true) //要保持 整体有序
 94       .saveAsNewAPIHadoopFile(save_path,
 95       classOf[ImmutableBytesWritable],
 96       classOf[KeyValue],
 97       classOf[HFileOutputFormat2],
 98       job.getConfiguration)
 99 
100   }
101 
102   /**
103     * 删除hdfs下的文件
104     *
105     * @param url 需要删除的路径
106     */
107   def delete_hdfspath(url: String) {
108     val hdfs: FileSystem = FileSystem.get(new Configuration)
109     val path: Path = new Path(url)
110     if (hdfs.exists(path)) {
111       val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
112       hdfs.delete(path, true)
113     }
114   }
115 
116   /**
117     * 获取 Mysql 表的数据
118     *
119     * @param sqlContext
120     * @param tableName 读取Mysql表的名字
121     * @param proPath   配置文件的路径
122     * @return 返回 Mysql 表的 DataFrame
123     */
124   def readMysqlTable(sqlContext: SQLContext, tableName: String, proPath: String) = {
125     val properties: Properties = getProPerties(proPath)
126     sqlContext
127       .read
128       .format("jdbc")
129       .option("url", properties.getProperty("mysql.url"))
130       .option("driver", properties.getProperty("mysql.driver"))
131       .option("user", properties.getProperty("mysql.username"))
132       .option("password", properties.getProperty("mysql.password"))
133       //        .option("dbtable", tableName.toUpperCase)
134       .option("dbtable", tableName)
135       .load()
136 
137   }
138 
139   /**
140     * 获取 Mysql 表的数据 添加过滤条件
141     *
142     * @param sqlContext
143     * @param table           读取Mysql表的名字
144     * @param filterCondition 过滤条件
145     * @param proPath         配置文件的路径
146     * @return 返回 Mysql 表的 DataFrame
147     */
148   def readMysqlTable(sqlContext: SQLContext, table: String, filterCondition: String, proPath: String): DataFrame = {
149     val properties: Properties = getProPerties(proPath)
150     var tableName = ""
151     tableName = "(select * from " + table + " where " + filterCondition + " ) as t1"
152     sqlContext
153       .read
154       .format("jdbc")
155       .option("url", properties.getProperty("mysql.url"))
156       .option("driver", properties.getProperty("mysql.driver"))
157       .option("user", properties.getProperty("mysql.username"))
158       .option("password", properties.getProperty("mysql.password"))
159       .option("dbtable", tableName)
160       .load()
161   }
162 
163   /**
164     * 获取配置文件
165     *
166     * @param proPath
167     * @return
168     */
169   def getProPerties(proPath: String): Properties = {
170     val properties: Properties = new Properties()
171     properties.load(new FileInputStream(proPath))
172     properties
173   }
174 }

4. 测试代码

 1 def main(args: Array[String]): Unit = {
 2     hdfsPath = args(0)
 3     proPath = args(1)
 4 
 5     //HFile保存路径
 6     val save_path: String = hdfsPath + "TableTestHFile"
 7     //获取测试DataFrame
 8     val dim_sys_city_dict: DataFrame = readMysqlTable(sqlContext, "DIM_SYS_CITY_DICT", proPath)
 9 
10     val resultDataFrame: DataFrame = dim_sys_city_dict
11       .select(concat($"city_id", lit("_"), $"city_name", lit("_"), $"city_code").as("key"), $"*")
12     //注:resultDataFrame 里面的 key 要放在第一位,因为后面需要对字段名排序
13     saveASHfFile(resultDataFrame, "cf_info", save_path)
14   }

 5. 执行命令

 1 nohup spark-submit --master yarn \
 2 --driver-memory 4G \
 3 --num-executors 2 \
 4 --executor-cores 4 \
 5 --executor-memory 8G \
 6 --class com.iptv.job.basedata.TestHFile \
 7 --jars /var/lib/hadoop-hdfs/tmp_lillcol/mysql-connector-java-5.1.38.jar \
 8 tygq.jar \
 9 hdfs://ns1/user/hive/warehouse/ \
10 /var/lib/hadoop-hdfs/tmp_lillcol/job.properties > ./TestHFile.log 2>&1 &

6.执行结果

1 [hdfs@iptve2e03 tmp_lillcol]$ hadoop fs -du -h hdfs://ns1/user/hive/warehouse/TableTestHFile
2 0       0       hdfs://ns1/user/hive/warehouse/TableTestHFile/_SUCCESS
3 12.3 K  24.5 K  hdfs://ns1/user/hive/warehouse/TableTestHFile/cf_info

 7. HFile load 进 Hbase

1 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://ns1/user/hive/warehouse/TableTestHFile iptv:spark_test
2 
3 .....
4 18/10/17 10:14:20 INFO mapreduce.LoadIncrementalHFiles: Trying to load hfile=hdfs://ns1/user/hive/warehouse/TableTestHFile/cf_info/fdc37dc6811140dfa852ac71b00b33aa first=200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ last=769_\xE4\xB8\x9C\xE8\x8E\x9E_GD_DG
5 18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing master protocol: MasterService
6 18/10/17 10:14:20 INFO client.ConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x16604bba6872fff
7 18/10/17 10:14:20 INFO zookeeper.ClientCnxn: EventThread shut down
8 18/10/17 10:14:20 INFO zookeeper.ZooKeeper: Session: 0x16604bba6872fff closed

 

8.查看HBase中的数据

 1 hbase(main):005:0> scan 'iptv:spark_test',{LIMIT=>2}
 2 ROW                                                          COLUMN+CELL                                                                                                                                                                     
 3  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:bureau_id, timestamp=1539742949840, value=BF55                                                                                    
 4  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:bureau_name, timestamp=1539742949840, value=\x85\xAC\xE5                              
 5  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:city_code, timestamp=1539742949840, value=112                                                                                                                  
 6  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:city_id, timestamp=1539742949840, value=112                                                                                                                      
 7  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:city_name, timestamp=1539742949840, value=\xB7\x9E                                                                                               
 8  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:dict_id, timestamp=1539742949840, value=112                                                                                                                       
 9  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:group_id, timestamp=1539742949840, value=112                                                                                                                     
10  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA                                                                      
11  200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ                          column=cf_info:sort, timestamp=1539742949840, value=112                                                                                                                           
12  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:bureau_id, timestamp=1539742949840, value=6AA0EF0B                                                                                       
13  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:bureau_name, timestamp=1539742949840, value=xE5\x8F\xB8                                 
14  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:city_code, timestamp=1539742949840, value=112                                                                                                                  
15  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:city_id, timestamp=1539742949840, value=112                                                                                                                      
16  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:city_name, timestamp=1539742949840, value=\xBE                                                                                               
17  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:dict_id, timestamp=1539742949840, value=112                                                                                                                       
18  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:group_id, timestamp=1539742949840, value=112                                                                                                                     
19  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:group_name, timestamp=1539742949840, value=\x8C\xBA                                                                      
20  660_\xE6\xB1\x95\xE5\xB0\xBE_GD_SW                          column=cf_info:sort, timestamp=1539742949840, value=112  

 9.总结

多列族,多列处理

通过算法将原本只能单个一个列族一个列处理的数据扩展到了多列族,多列处理。
实现的关键是下面的两段代码

 1 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key
 2     columnsName = columnsName.drop(1).sorted //把key去掉  因为要排序
 3 
 4     val result1: RDD[(ImmutableBytesWritable, Seq[KeyValue])] = resultDataFrame
 5       .map(row => {
 6         var kvlist: Seq[KeyValue] = List()
 7         var rowkey: Array[Byte] = null
 8         var cn: Array[Byte] = null
 9         var v: Array[Byte] = null
10         var kv: KeyValue = null
11         val cf: Array[Byte] = clounmFamily.getBytes //列族
12         rowkey = Bytes.toBytes(row.getAs[String]("key")) //key
13         for (i <- 1 to (columnsName.length - 1)) {
14           cn = columnsName(i).getBytes() //列的名称
15           v = Bytes.toBytes(row.getAs[String](columnsName(i))) //列的值
16           //将rdd转换成HFile需要的格式,我们上面定义了Hfile的key是ImmutableBytesWritable,那么我们定义的RDD也是要以ImmutableBytesWritable的实例为key
17           kv = new KeyValue(rowkey, cf, cn, v) //封装一下 rowkey, cf, clounmVale, value
18           //
19           kvlist = kvlist :+ kv //将新的kv加在kvlist后面(不能反 需要整体有序)
20         }
21         (new ImmutableBytesWritable(rowkey), kvlist)
22       })
23 
24     //RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]
25     val result: RDD[(ImmutableBytesWritable, KeyValue)] = result1.flatMapValues(s => {
26       s.iterator
27     })

 

DataFrame的优势就是它算是一个结构化数据,我们很容易对里面的每一个字段进行处理

  • 通过resultDataFrame.columns获取所有列名,通过drop(1)删掉“key”,(序号从1开始)
  • 通过sorted 对列名进行排序,默认就是升序的,如果不排序会报错,具体错误后面展示
  •  然后通过map取出每一行一行数据,再通过for对每一个字段处理,每处理一个字段相关信息加入List,得到 RDD[(ImmutableBytesWritable, Seq[KeyValue])]
  • 通过flatMapValues将RDD[(ImmutableBytesWritable, Seq[KeyValue])] 转换成 RDD[(ImmutableBytesWritable, KeyValue)]

通过上述处理,我们将得到RDD[(ImmutableBytesWritable, KeyValue)]类型的数据,就可以直接使用saveAsNewAPIHadoopFile这个方法了

排序

此处有两个地方进行了排序

  • rowkey

这个就不用说了,这个必须要整体有序,实现代码

1 //保存数据
2     result
3       .sortBy(x => x._1, true) //要保持 整体有序
4       .saveAsNewAPIHadoopFile(save_path,
5       classOf[ImmutableBytesWritable],
6       classOf[KeyValue],
7       classOf[HFileOutputFormat2],
8       job.getConfiguration)
  • 列名
1 //列名也要保持整体有序,实现代码
2 var columnsName: Array[String] = resultDataFrame.columns //获取列名 第一个为key;
3     columnsName = columnsName.drop(1).sorted //把key去掉  因为要排序

 

如果不排序 会出现下面的错误

1 18/10/15 14:19:32 WARN scheduler.TaskSetManager: Lost task 0.1 in stage 2.0 (TID 3, iptve2e03): java.io.IOException: Added a key not lexically larger than previous. 
2 Current cell = 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ/cf_info:area_code/1539584366048/Put/vlen=5/seqid=0, 
3     lastCell = 200_\xE5\xB9\xBF\xE5\xB7\x9E_GD_GZ/cf_info:dict_id/1539584366048/Put/vlen=2/seqid=0

上面的意思是当前列名cf_info:area_code比前一个列名cf_info:dict_id小,这就是为什么需要对列名排序的原因,同时还要把key删除掉,因为不删除会出现cf_info:key这个列,这显然是不如何要求的。
而把key放在第一位也是为了在这个步骤中删除掉key,否则一经排序就很难轻松的删除掉key了

保存路径

保存的路径不能存在,那就删除呗

 1 /**
 2     * 删除hdfs下的文件
 3     *
 4     * @param url 需要删除的路径
 5     */
 6   def delete_hdfspath(url: String) {
 7     val hdfs: FileSystem = FileSystem.get(new Configuration)
 8     val path: Path = new Path(url)
 9     if (hdfs.exists(path)) {
10       val filePermission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.READ)
11       hdfs.delete(path, true)
12     }
13   }

 

列族名称

列族需要在Hbase中存在,列可以不存在

对比总结

Hive-Hbase

  • 优点:

关联Hive,容易对数据进行二次加工

操作相对简单,要求没那么高

可以轻易处理多列族多列问题

  • 缺点:

建立一张临时表,消耗空间增加一倍左右

load数据的时候很快,但是insert into的时候耗费时间与数据量相关

 

HFile

  • 优点:

Load数据很快

从头到尾产生的文件只有一个HFile,必两一种方式节省空间

  • 缺点:

数据很难二次加工,查询如果没有工具很不友好

 对开发有一定的要求

 

至于两种方式如何选择,看需求。

此文为本人日常工作总结,转载请标明出处!!!!!!!























 

posted @ 2018-10-16 18:20  lillcol  阅读(4006)  评论(0编辑  收藏  举报