資料導出/遷移的概念
在做資料導出之前,我們看一下已經完成的操作:資料分析階段将名額統計完成,也将統計完成的名額放到Hive資料表中,并且名額資料存儲到HDFS分布式檔案存儲系統。
名額統計完成之後,我們最終是想将我們的名額資料做成可視化大屏進行展示,Hive中的資料無法、很難直接連接配接到JavaWeb或者EE技術直接進行資料展示。 是以我們需要将Hive中統計出來的資料名額表遷移到我們的MySQL資料庫中,由MySQL資料庫連接配接web技術進行可視化展示。
Hive數倉名額表的資料都存儲在HDFS分布式檔案存儲系統,如果想要将Hive的資料導出,有以下幾種導出方式:
(1)使用insert指令導出資料到一個目錄
(2)HDFS的相關指令:hdfs dfs -get/-move/-copyToLocalFile,将Hive數倉的資料導出到本地的檔案中
(3)hive -e 和重定向 >> 指令将資料導出到一個檔案中
(4)使用hive自帶的export指令導出資料到一個檔案夾中(主要做資料倉庫的遷移 )
(5)第三方軟體技術sqoop技術實作資料遷移,實作将Hive數倉中的資料遷移到MySQL中
資料遷移技術SQOOP
一、SQOOP技術的相關概念
(1) sqoop技術也是apache的頂尖項目,主要是做資料遷移的。
(2)sqoop是将資料在Hadoop和關系型資料庫之間的資料傳遞,基于MapReduce完成。核心是對MR程式的InputFormat和OutputFormat進行定制。
(3)sqoop也是使用指令進行資料的導入和導出的,隻不過底層也是會翻譯成為MR程式執行。
二、sqoop中兩個核心概念
導入:将關系型資料庫表資料(比如MySQL)中表資料導入到大資料叢集(比如Hive、HBase、HDFS)
導出:将大資料叢集的資料(Hive、HBase、HDFS資料)導出到非大資料叢集的關系型資料庫,比如MySQL
三、SQOOP的安裝
sqoop軟體是基于Java和Hadoop的,是以必須先把Java和Hadoop軟體配置好。
1、首先下載下傳上傳解壓sqoop、再配置sqoop的相關配置檔案。
配置的sqoop配置檔案是sqoop-env.sh,重點需要配置Hadoop的相關依賴環境:
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.8.5
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.8.5
export HIVE_HOME=/opt/module/hive-2.3.8
sqoop可以實作将Hive、HBase中表資料導出到MySQL資料庫中,需要sqoop具備連接配接MySQL的條件——mysql-connector-java-xxxx.jar(需要把此jar包放在sqoop下)
cp /opt/module/hive-2.3.8/lib/mysql-connector-java-5.1.27.jar /opt/module/sqoop-1.4.7/lib/
2、配置sqoop的環境變量(vim /etc/profile)
四、SQOOP的使用
1、檢測sqoop是否安裝成功
sqoop help
sqoop version
sqoop可以用來檢視某個資料庫管理系統中有哪些資料庫存在
2、sqoop檢視MySQL資料庫中有哪些資料庫存在
sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password root
list-databases代表檢視所有資料庫,connect代表連接配接哪個資料庫,username代表連接配接資料庫的使用者名,password代表連接配接資料庫密碼。
這個指令執行成功的前提條件是:你已經将對應資料庫的驅動jar包放到了sqoop的lib目錄下。
五、sqoop實作将MySQL資料導入到Hive資料倉庫
【注意】需要将hive的相關jar包放到sqoop環境下
cp /opt/module/hive-2.3.8/lib/hive-common-2.3.8.jar /opt/module/sqoop-1.4.7/lib/
将MySQL中test資料庫下的test表資料導入到Hive資料倉庫中。
sqoop import #導入
--connect jdbc:mysql://localhost:3306/test # 連接配接MySQL的那個資料庫
--username root #連接配接MySQL的使用者名
--password root #連接配接MySQL的密碼
--table test # 指定MySQL要向Hive資料倉庫導入目前資料下那張資料表的資料
--num-mappers 1 # 将導入任務轉成MR程式運作 需要一個Map任務
--hive-import # 将資料導入到hive數倉
--fields-terminated-by "\t" #指定hive數倉導入完成之後表字段之間分隔符
--hive-overwrite # 表中有資料 覆寫寫
--hive-table 資料庫名.表名 # 導入到Hive的那個表中 表可以不存在 會自動建立
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table test --num-mappers 1 --hive-import --fields-terminated-by "\t" --hive-overwrite --hive-table 資料庫名.表名
将MySQL表中資料導入到Hive數倉的時候,hive資料倉庫中表可以不用提前存在,會自動建立。
六、sqoop實作将Hive/HDFS資料導入到MySQL資料表中
sqoop的導入分為:将資料導入到HDFS和将資料導入到Hive數倉,或者其他。每種導入方式不一樣。
sqoop的導出隻有一種指令,就是将Hive/HDFS資料導出到Mysql中。因為hive存儲的表資料也在HDFS上存儲着,是以HDFS的導出和Hive的導出指令一緻的。
案例:實作項目功能,将age_pvs的資料導出到MySQL資料庫中。
将MySQL資料導入到hive表中,hive表可以不用提前存在,但是如果要将Hive資料表的資料導入到MySQL中,那麼MySQL中對應的表必須提前存在,并且和hive表結構保持一緻。
導出指令:
sqoop export # 導出資料
--connect jdbc:mysql://localhost:3306/project #連接配接MySQL資料庫
--username root #連接配接使用者名
--password 123456 #連接配接密碼
--table staff # 導入到MySQL的那張表中
--num-mappers 1 #轉成一個MR任務運作
--export-dir /user/hive/warehouse/staff_hive #hive資料表資料在HDFS上對應的路徑
--input-fields-terminated-by "\t" #hive表字段和字段之間的分隔符
sqoop的另外一種導出方式:
vim一個xxx.opt檔案,然後将sqoop導出指令放到檔案中。
注意:sqoop關鍵字需要删除、而且參數和參數值需要分行寫
使用 sqoop --options-file xxx.opt
sqoop實作資料遷移(導入、導出)主要是将遷移操作轉換成為MR程式去運作,在表現形式上,就是将MR程式的InputFormat和OutputFormat進行重寫或者自定義。