A. hbase資料庫是關系型資料庫嗎
Hive 存儲格式和關系型資料庫之間進行導入導出
最近更新時間:2020-09-29 15:54:18
前往 GitHub 編輯
1. 開發准備
2. 將關系型資料庫導入到 Hive 中
3. 將 Hive 導入到關系型資料庫中
使用 HDFS 中的 Hive 數據
使用 Hcatalog 進行導入
4. 將 orc 格式的 Hive 表格導入到關系型資料庫中
確認已開通騰訊雲,並且創建了一個 EMR 集群。在創建 EMR 集群的時候需要在軟體配置界面選擇 Sqoop,Hive 組件。
Sqoop 等相關軟體安裝在路徑 EMR 雲伺服器的/usr/local/service/路徑下。
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- [hadoop@172 hive]$ hive
- hive> create database hive_from_sqoop;
- OK
- Time taken: 0.167 seconds
- [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 表名。
- 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)
- [root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive
- #!/bin/bashMAXROW=1000000 #指定生成數據行數for((i = 0; i < $MAXROW; i++))doecho $RANDOM, "$RANDOM"done
- [hadoop@172 hive]$ ./gen_data.sh > hive_test.data
- [hadoop@172 hive]$ hdfs dfs -put ./hive_test.data /$hdfspath
- [hadoop@172 hive]$ bin/hivehive> create database hive_to_sqoop; #創建資料庫 hive_to_sqoopOK
- Time 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; #導入數據
- [hadoop@172 hive]$ mysql -h $mysqlIP –p
- Enter password:
- mysql> create table table_from_hive (a int,b varchar(255));
- [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
- [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
- [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)
- [hadoop@172 bin]$ ./sqoop-export --help
我的收藏
本頁目錄:
本文介紹了使用騰訊雲 Sqoop 服務將數據在 Mysql 和 Hive 之間相互導入導出的方法。
1. 開發准備
2. 將關系型資料庫導入到 Hive 中
本節將繼續使用上一節的用例。
進入 EMR 控制台,復制目標集群的實例 ID,即集群的名字。再進入關系型資料庫控制台,使用 Ctrl+F 進行搜索,找到集群對應的 MySQL 資料庫,查看該資料庫的內網地址 $mysqlIP。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。登錄 EMR 的方式請參考登錄 Linux 實例。這里我們可以選擇使用 WebShell 登錄。單擊對應雲伺服器右側的登錄,進入登錄界面,用戶名默認為 root,密碼為創建 EMR 時用戶自己輸入的密碼。輸入正確後,即可進入命令行界面。
在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
新建一個 Hive 資料庫:
使用 sqoop-import 命令把上一節中創建的 MySQL 資料庫導入到 Hive 中:
執行指令需要輸入您的 MySQL 密碼,默認為您創建 EMR 集群時設置的密碼。執行成功後,可以在 Hive 中查看導入的資料庫:
3. 將 Hive 導入到關系型資料庫中
Sqoop 支持將 Hive 表中的數據導入到關系型資料庫中。先在 Hive 中創建新表並導入數據。
登錄 EMR 集群中的任意機器,最好是登錄到 Master 節點。在 EMR 命令行先使用以下指令切換到 Hadoop 用戶,並進入 Hive 文件夾:
新建一個 bash 腳本文件 gen_data.sh,在其中添加以下代碼:
並按如下方式執行:
這個腳本文件會生成1,000,000個隨機數對,並且保存到文件 hive_test.data 中。
使用如下指令把生成的測試數據先上傳到 HDFS 中:
其中 $hdfspath 為 HDFS 上的您存放文件的路徑。
連接 Hive 並創建測試表:
$hdfspath 為 HDFS 上的您存放文件的路徑。
成功後可使用quit命令退出 Hive 數據倉庫。連接關系型資料庫並創建對應的表格:
其中 $mysqlIP 為該資料庫的內網地址,密碼為您創建集群時設置的密碼。
在 MySQL 中創建一個名為 test 的表格,MySQL 中的表欄位名字和 Hive 中的表欄位名字必須完全一致:
成功創建表格後即可退出 MySQL。
使用 Sqoop 把 Hive 數據倉庫中的數據導入到關系型資料庫中有兩種方法,可以直接使用 HDFS 存儲的 Hive 數據,也可以使用 Hcatalog 來進行數據的導入。
使用 HDFS 中的 Hive 數據
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 資料庫中的數據導出到關系型資料庫中:
其中 $mysqlIP 為您的關系型資料庫的內網 IP 地址,test 為關系型資料庫中的資料庫名,--table 後跟的參數為您的關系型資料庫的表名,--export-dir 後跟的參數為 Hive 表中的數據在 HDFS 中存儲的位置。
使用 Hcatalog 進行導入
切換進入 Sqoop 文件夾,然後使用以下指令把 Hive 資料庫中的數據導出到關系型資料庫中:
其中 $mysqlIP 為您的關系型資料庫的內網 IP 地址,test 為關系型資料庫中的資料庫名,--table 後跟的參數為您的關系型資料庫的表名,--hcatalog-database 後面跟的參數是要導出的 Hive 表所在的資料庫的名稱,--hcatalog-table 後面跟的參數是要 Hive 中要導出的表的名稱。
操作完成後可以進入關系型資料庫查看是否導入成功:
更多關於 sqoop-export 命令的參數可以通過如下命令查看:
4. 將 orc 格式的 Hive 表格導入到關系型資料庫中
B. hbase 的存儲是排序存儲的嗎
hbase是非關系型的,你可以把xml父子節點解析的結果存入hbase
C. Hbase的特性有哪些
HBase不是一個關系型資料庫,它需要不同的方法定義你的數據模型,HBase實際上定義了一個四維數據模型,下面就是每一維度的定義:
行鍵:每行都有唯一的行鍵,行鍵沒有數據類型,它內部被認為是一個位元組數組。
列簇:數據在行中被組織成列簇,每行有相同的列簇,但是在行之間,相同的列簇不需要有相同的列修飾符。在引擎中,HBase將列簇存儲在它自己的數據文件中,所以,它們需要事先被定義,此外,改變列簇並不容易。
列修飾符:列簇定義真實的列,被稱之為列修飾符,你可以認為列修飾符就是列本身。
版本:每列都可以有一個可配置的版本數量,你可以通過列修飾符的制定版本獲取數據。
D. hadoop如何存貯關系型數據
關系數據在hadoop上應該用hive
hbase沒用,他的結構對關系數據沒有優化,只是擅長做鍵值對查詢。
你用關系數據肯定是用它的關系關聯操作,這個存hive足夠了
E. 傳統的行存儲和(HBase)列存儲的區別
列存儲不同於傳統的關系型資料庫,其數據在表中是按行存儲的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。按列存儲每個欄位的數據聚集存儲,在查詢只需要少數幾個欄位的時候,能大大減少讀取的數據量,一個欄位的數據聚集存儲,那就更容易為這種聚集存儲設計更好的壓縮/解壓演算法。
傳統的(Oracle)行存儲和(Hbase)列存儲的區別
這里寫圖片描a
1、數據是按行存儲的
2、沒有索引的查詢使用大量I/O
3、建立索引和物化視圖需要花費大量時間和資源
4、面對查詢的需求,資料庫必須被大量膨脹才能滿足性能需求
這里寫圖片描述
1、數據按列存儲–每一列單獨存放
2、數據即是索引
3、只訪問查詢涉及的列–大量降低系統IO
4、每一列由一個線索來處理–查詢的並發處理
5、數據類型一致,數據特徵相似–高效壓縮
F. 怎樣將關系型數據表轉換至hbase數據表
首先需要把關系型資料庫的數據表的數據增加由 「縱向延伸」,轉變為HBase數據表的「橫向延伸」
一、Hbase的存儲結構
a) HBase以表(HTable)的形式存儲數據
b) HTable包括很多行,每行通過RowKey唯一標記,行按照RowKey的字典序排列,表在行的方向上分割為多個HRegion
c) 每行包括一個RowKey和多個Column Family,數據按照Column Family進行物理切割,即不同Column Family的數據放在不同的Store中,一個Column Family放在一個Strore中
d) HRegion由多個Store組成。一個Store由物理上存在的一個MemStrore(內存中)和多個StoreFile(HFile)中
二、設計原則:
(1)rowkey
a) rowkey是hbase的key-value存儲中的key,通常使用用戶要查詢的欄位作為rowkey ,查詢結果作為value ,HBase中RowKey是按照字典序排列的
(2)Column Family的設計需遵循:
a) 不同Column Family的數據,在物理上是分開的,盡量避免一次請求需要拿到的Column分布在不同的Column Family中;
b) CF的數量盡量要少,原因是過多的columnfamily之間會互相影響
(3) column
對於column需要擴展的應用,column可以按普通的方式設計,但是對於列相對固定的應用,最好採用將一行記錄封裝到一個column中的方式,這樣能夠節省存儲空間。封裝的方式推薦protocolbuffer。
G. hbase和關系型資料庫的區別
Mongodb用於存儲非結構化數據,尤其擅長存儲json格式的數據。存儲的量大概在10億級別,再往上性能就下降了,除非另外分庫。
Hbase是架構在hdfs上的列式存儲,擅長rowkey的快速查詢,但模糊匹配查詢(其實是前模糊或全模糊)不擅長,但存儲的量可以達到百億甚至以上,比mongodb的存儲量大多了。
H. Hbase怎樣進行物理存儲
hbase不是按行存儲,你想一行有多列族的情況下,就會把數據存在多個文件下,按行存儲的意思,是會把行數據存在一個文件中,所以hbase是按列存儲的。
應該說hbase和傳統關系型資料庫還是有些相似的地方,起碼在hfile中hbase列族下一行的列是相鄰存儲的,這點跟傳統關系型資料庫應該是類似的。
I. HBase數據到底是怎麼存儲的
每個列簇對應HDFS中的一個單獨文件,hbase不是按行存儲,你想一行有多列族的情況下,就會把數據存在多個文件下,按行存儲的意思,是會把行數據存在一個文件中,所以hbase是按列存儲的。
應該說hbase和傳統關系型資料庫還是有些相似的地方,起碼在hfile中hbase列族下一行的列是相鄰存儲的,這點跟傳統關系型資料庫應該是類似的。