您好,登錄后才能下訂單哦!
??這里小編介紹兩種導入數據的方式,一種是基于hive,一種是基本文件生成HFile。
這種方式需要一個jar包支持:
下載地址:https://down.51cto.com/data/2464129
將其放入$HBASE_HOME/lib 并將原有的jar包復制。
其次修改hive-site.xml:
#加入:
<property>
<name>hive.aux.jars.path</name>
<value>file:///applications/hive-2.3.2/lib/hive-hbase-handler.jar,file:///applications/hive-2.3.2/lib/guava-14.0.1.jar,file:///ap plications/hbase-2.0.5/lib/hbase-common-2.0.5.jar,file:///applications/hbase-2.0.5/lib/hbase-client-2.0.5.jar,file:///application s/hive-2.3.2/lib/zookeeper-3.4.6.jar</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
將hive數據導入到hbase中:
① 創建hive表:
create table hive_hbase_test(id int,name string,age int);
② 插入數據到hive表中
insert into hive_hbae_test(id,name,age) values(1,"xiaozhang","18");
insert into hive_hbase_test(id,name,age) values(2,"xiaowang","19");
這里測試環境可以這樣插入數據,真實環境最好使用外表。
③ 映射 Hbase 的表
create table hive_hbase_pro(row_key string,id bigint,name string,age int) STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:id,info:name,info:age") TBLPROPERTIES ("hbase.table.name"="hive_hbase_pro");
此時在hbase中就會創建一個名為hive_hbase_pro表。
④ 插入到映射 Hbase 表中的數據
#在hive中配置如下參數:
set hive.hbase.wal.enabled=false;
set hive.hbase.bulk=true;
set hbase.client.scanner.caching=1000000;
⑤導入數據:
insert overwrite table hive_hbase_pro select id as row_key,id,name,age from hive_hbase_test;
此時在hive表中就有hive中的數據:
補充:如果hbase中表已經存在,此時hive中只能建立外表:
create external table hive_hbase_xiaoxu(row_key string,id bigint,name string,age int) STORED BY "org.apache.hadoop.hive.hbase.HBaseStorageHandler" WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:id,info:name,info:age") TBLPROPERTIES ("hbase.table.name"="hive_hbase_pro");
這時建立的外表可以讀取到hbase表中的數據。
??總結:這種方式中插入數據是按照一條一條的的形式插入的,速度是比較 慢的,如果數量級在百萬千萬級別機器比較好的情況下可以使用這種方式,執行的速度大概 在每秒 2-3W 之間。
其中還有Phoneix 和pig的導數,感覺和hive都大同小異,這里就不在介紹。
這種方式導入數據相當的快,因為跳過了WAL直接生產底層HFile文件。
優勢:
過程中沒有大量的接口調用消耗性能。
步驟:
① 將數據文件上傳到HDFS中:
下載地址:https://down.51cto.com/data/2464129
這里文件內容是以逗號分隔。
$hadoop fs -put sp_address.txt /tmp/sp_addr_bulktable
② 利用 importtsv 命令生成 Hfile 文件
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.bulk.output=/tmpbulkdata/sp_addr_data -Dimporttsv.columns=HBASE_ROW_KEY,sp_address:ID,sp_address:PLACE_TYPE,sp_address:PLACE_CODE,sp_address:PLACE_NAME,sp_address:UP_PLACE_CODE sp_address_bulkload "/tmp/sp_addr_bulktable"
參數介紹:
-Dimporttsv.separator :指定文件的分隔符
Dimporttsv.bulk.output:生成的HFile的目錄(此目錄一定不存在)
Dimporttsv.columns:hbase表的關系映射
sp_address_bulkload :hbase表名(這里一定要在生成hfile之前創建hbase表)
"/tmp/sp_addr_bulktable":源數據目錄
**建表語句:**create ‘sp_address_bulkload’,’ sp_address’
③ 把 Hfile 文件導入到 Hbase 中
$hadoop jar /applications/hbase-2.0.5/lib/hbase-mapreduce-2.0.5.jar completebulkload /tmpbulkdata/sp_addr_data/ sp_address_bulkload
這里有一個坑,網上說是在hbase-server-VRESION-hadoop2.jar 這里小編用的是2.0.5版本的,這個completebulkload 主類在hbase-mapreduce-2.0.5.jar 這個jar包下。
好處:運行該命令的本質是一個hdfs的mv操作,并不會啟動MapReduce。
④ 查看hbase表
$scan 'sp_address_bulkload'
到此數據就被裝載進入hbase中。
??當然還可以使用API的方式,但是學習成本就會翻倍,如果場景不是特別復雜的情況下,使用shell基本可以解決。
??總結:這種方式是最快的,原理是按照 Hfile 進行的,一次性處理多條數據,建議使用這種方式。在真是環境中會 相當快的快,我們測試的是 4 億多條的數據,20 分鐘搞定。可能這里看不出什么快不快,這里小編可以提供一個真實情況,256G內存的機器中,用sqoop導入5000W數據需要27分鐘。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。