Hive 存儲格式和關系型數據庫之間進行導入導出
最近更新時間:2020-09-29 15:54:18
前往 GitHub 編輯?我的收藏
本頁目錄:
1. 開發準備
2. 將關系型數據庫導入到 Hive 中
3. 將 Hive 導入到關系型數據庫中
使用 HDFS 中的 Hive 數據
使用 Hcatalog 進行導入
4. 將 orc 格式的 Hive 表格導入到關系型數據庫中
本文介紹了使用騰訊雲 Sqoop 服務將數據在 MySQL 和 Hive 之間相互導入導出的方法。
1. 開發準備
確認已開通騰訊雲,並且創建了壹個 EMR 集群。在創建 EMR 集群的時候需要在軟件配置界面選擇 Sqoop,Hive 組件。
Sqoop 等相關軟件安裝在路徑 EMR 雲服務器的/usr/local/service/路徑下。
2. 將關系型數據庫導入到 Hive 中
本節將繼續使用上壹節的用例。
進入 EMR 控制臺,復制目標集群的實例 ID,即集群的名字。再進入關系型數據庫控制臺,使用 Ctrl+F 進行搜索,找到集群對應的 MySQL 數據庫,查看該數據庫的內網地址 $mysqlIP。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。登錄 EMR 的方式請參考?登錄 Linux 實例。這裏我們可以選擇使用 WebShell 登錄。單擊對應雲服務器右側的登錄,進入登錄界面,用戶名默認為 root,密碼為創建 EMR 時用戶自己輸入的密碼。輸入正確後,即可進入命令行界面。
在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
[root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive新建壹個 Hive 數據庫:
[hadoop@172 hive]$ hivehive> create database hive_from_sqoop;
OK
Time taken: 0.167 seconds
使用 sqoop-import 命令把上壹節中創建的 MySQL 數據庫導入到 Hive 中:
[hadoop@172 hive]# cd /usr/local/service/sqoop[hadoop@172 sqoop]$ bin/sqoop-import --connect ?jdbc:mysql://$mysqlIP/test --username root -P --table sqoop_test_back --hive-database hive_from_sqoop --hive-import --hive-table hive_from_sqoop
$mysqlIP:騰訊雲關系型數據庫(CDB)的內網地址。
test:MySQL 數據庫名稱。
--table:要導出的 MySQL 表名。
--hive-database:Hive 數據庫名。
--hive-table:導入的 Hive 表名。
執行指令需要輸入您的 MySQL 密碼,默認為您創建 EMR 集群時設置的密碼。執行成功後,可以在 Hive 中查看導入的數據庫:
hive> select * from hive_from_sqoop;OK1 first 2018-07-03 16:07:46.0 spark2 second 2018-07-03 15:30:57.0 mr3 third 2018-07-03 15:31:07.0 yarn4 forth 2018-07-03 15:39:38.0 hbase5 fifth 2018-07-03 16:02:29.0 hive6 sixth 2018-07-03 16:09:58.0 sqoopTime taken: 1.245 seconds, Fetched: 6 row(s)3. 將 Hive 導入到關系型數據庫中
Sqoop 支持將 Hive 表中的數據導入到關系型數據庫中。先在 Hive 中創建新表並導入數據。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
[root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive新建壹個 bash 腳本文件 gen_data.sh,在其中添加以下代碼:
#!/bin/bashMAXROW=1000000 #指定生成數據行數for((i = 0; i < $MAXROW; i++))do echo $RANDOM, \"$RANDOM\"done並按如下方式執行:
[hadoop@172 hive]$ ./gen_data.sh > hive_test.data這個腳本文件會生成1,000,000個隨機數對,並且保存到文件 hive_test.data 中。
使用如下指令把生成的測試數據先上傳到 HDFS 中:
[hadoop@172 hive]$ hdfs dfs -put ./hive_test.data /$hdfspath其中 $hdfspath 為 HDFS 上的您存放文件的路徑。
連接 Hive 並創建測試表:
[hadoop@172 hive]$ bin/hivehive> create database hive_to_sqoop; ?#創建數據庫 hive_to_sqoopOKTime taken: 0.176 secondshive> use hive_to_sqoop; #切換數據庫OK
Time taken: 0.176 secondshive> create table hive_test (a int, b string)hive> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; #創建數據表 hive_test, 並指定列分割符為’,’
OK
Time taken: 0.204 secondshive> load data inpath "/$hdfspath/hive_test.data" into table hive_test; ? #導入數據
$hdfspath 為 HDFS 上的您存放文件的路徑。
成功後可使用quit命令退出 Hive 數據倉庫。連接關系型數據庫並創建對應的表格:
[hadoop@172 hive]$ mysql -h $mysqlIP –pEnter password:
其中 $mysqlIP 為該數據庫的內網地址,密碼為您創建集群時設置的密碼。
在 MySQL 中創建壹個名為 test 的表格,MySQL 中的表字段名字和 Hive 中的表字段名字必須完全壹致:
mysql> create table table_from_hive (a int,b varchar(255));成功創建表格後即可退出 MySQL。
使用 Sqoop 把 Hive 數據倉庫中的數據導入到關系型數據庫中有兩種方法,可以直接使用 HDFS 存儲的 Hive 數據,也可以使用 Hcatalog 來進行數據的導入。
使用 HDFS 中的 Hive 數據
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 數據庫中的數據導出到關系型數據庫中:
[hadoop@172 hive]$ cd ?../sqoop/bin[hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
--table table_from_hive --export-dir /usr/hive/warehouse/hive_to_sqoop.db/hive_test
其中 $mysqlIP 為您的關系型數據庫的內網 IP 地址,test 為關系型數據庫中的數據庫名,--table 後跟的參數為您的關系型數據庫的表名,--export-dir 後跟的參數為 Hive 表中的數據在 HDFS 中存儲的位置。
使用 Hcatalog 進行導入
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 數據庫中的數據導出到關系型數據庫中:
[hadoop@172 hive]$ cd ?../sqoop/bin[hadoop@172 bin]$ ./sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P
--table table_from_hive --hcatalog-database hive_to_sqoop --hcatalog-table hive_test
其中 $mysqlIP 為您的關系型數據庫的內網 IP 地址,test 為關系型數據庫中的數據庫名,--table 後跟的參數為您的關系型數據庫的表名,--hcatalog-database 後面跟的參數是要導出的 Hive 表所在的數據庫的名稱,--hcatalog-table 後面跟的參數是要 Hive 中要導出的表的名稱。
操作完成後可以進入關系型數據庫查看是否導入成功:
[hadoop@172 hive]$ mysql -h $mysqlIP –p ?#連接 MySQLEnter password:mysql> use test;Database changed
mysql> select count(*) from table_from_hive; #現在表中有1000000條數據+----------+| count(*) |+----------+| 1000000 |+----------+1 row in set (0.03 sec)
mysql> select * from table_from_hive limit 10; #查看表中前10條記錄+-------+----------+| a | b |
+-------+----------+
| 28523 | ?"3394" ?|| 31065 | ?"24583" |
| ? 399 | ?"23629" || 18779 | ?"8377" ?|
| 25376 | ?"30798" || 20234 | ?"22048" |
| 30744 | ?"32753" || 21423 | ?"6117" ?|
| 26867 | ?"16787" || 18526 | ?"5856" ?|
+-------+----------+
10 rows in set (0.00 sec)
更多關於 sqoop-export 命令的參數可以通過如下命令查看:
[hadoop@172 bin]$ ./sqoop-export --help4. 將 orc 格式的 Hive 表格導入到關系型數據庫中