1. 程式人生 > >資料搬運元件:基於Sqoop管理資料匯入和匯出

資料搬運元件:基於Sqoop管理資料匯入和匯出

本文原始碼:[GitHub](https://github.com/cicadasmile/big-data-parent) || [GitEE](https://gitee.com/cicadasmile/big-data-parent) # 一、Sqoop概述 Sqoop是一款開源的大資料元件,主要用來在Hadoop(Hive、HBase等)與傳統的資料庫(mysql、postgresql、oracle等)間進行資料的傳遞。 ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234133027-505000885.png) 通常資料搬運的元件基本功能:匯入與匯出。 鑑於Sqoop是大資料技術體系的元件,所以關係型資料庫匯入Hadoop儲存系統稱為匯入,反過來稱為匯出。 Sqoop是一個命令列的元件工具,將匯入或匯出命令轉換成mapreduce程式來實現。mapreduce中主要是對inputformat和outputformat進行定製。 # 二、環境部署 在測試Sqoop元件的時候,起碼要具備Hadoop系列、關係型資料、JDK等基礎環境。 鑑於Sqoop是工具類元件,單節點安裝即可。 ## 1、上傳安裝包 安裝包和版本:`sqoop-1.4.6` ``` [root@hop01 opt]# tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz [root@hop01 opt]# mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop1.4.6 ``` ## 2、修改配置檔案 檔案位置:`sqoop1.4.6/conf` ``` [root@hop01 conf]# pwd /opt/sqoop1.4.6/conf [root@hop01 conf]# mv sqoop-env-template.sh sqoop-env.sh ``` 配置內容:涉及hadoop系列常用元件和排程元件zookeeper。 ``` [root@hop01 conf]# vim sqoop-env.sh # 配置內容 export HADOOP_COMMON_HOME=/opt/hadoop2.7 export HADOOP_MAPRED_HOME=/opt/hadoop2.7 export HIVE_HOME=/opt/hive1.2 export HBASE_HOME=/opt/hbase-1.3.1 export ZOOKEEPER_HOME=/opt/zookeeper3.4 export ZOOCFGDIR=/opt/zookeeper3.4 ``` ## 3、配置環境變數 ``` [root@hop01 opt]# vim /etc/profile export SQOOP_HOME=/opt/sqoop1.4.6 export PATH=$PATH:$SQOOP_HOME/bin [root@hop01 opt]# source /etc/profile ``` ## 4、引入MySQL驅動 ``` [root@hop01 opt]# cp mysql-connector-java-5.1.27-bin.jar sqoop1.4.6/lib/ ``` ## 5、環境檢查 ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234148778-1934855722.png) 關鍵點:import與export 檢視幫助命令,並通過version檢視版本號。sqoop是一個基於命令列操作的工具,所以這裡的命令下面還要使用。 ## 6、相關環境 此時看下sqoop部署節點中的相關環境,基本都是叢集模式: ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234158737-1549089116.png) ## 7、測試MySQL連線 ``` sqoop list-databases --connect jdbc:mysql://hop01:3306/ --username root --password 123456 ``` 這裡是檢視MySQL資料庫的命令,如圖結果列印正確: ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234208339-1842843303.png) # 三、資料匯入案例 ## 1、MySQL資料指令碼 ```sql CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `user_name` varchar(100) DEFAULT NULL COMMENT '使用者名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='使用者表'; INSERT INTO `sq_import`.`tb_user`(`id`, `user_name`) VALUES (1, 'spring'); INSERT INTO `sq_import`.`tb_user`(`id`, `user_name`) VALUES (2, 'c++'); INSERT INTO `sq_import`.`tb_user`(`id`, `user_name`) VALUES (3, 'java'); ``` ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234218373-1893736463.png) ## 2、Sqoop匯入指令碼 指定資料庫的表,全量匯入Hadoop系統,注意這裡要啟動Hadoop服務; ``` sqoop import --connect jdbc:mysql://hop01:3306/sq_import \ --username root \ --password 123456 \ --table tb_user \ --target-dir /hopdir/user/tbuser0 \ -m 1 ``` ## 3、Hadoop查詢 ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234229524-976431158.png) ``` [root@hop01 ~]# hadoop fs -cat /hopdir/user/tbuser0/part-m-00000 ``` ## 4、指定列和條件 查詢的SQL語句中必須帶有WHERE\$CONDITIONS: ``` sqoop import --connect jdbc:mysql://hop01:3306/sq_import \ --username root \ --password 123456 \ --target-dir /hopdir/user/tbname0 \ --num-mappers 1 \ --query 'select user_name from tb_user where 1=1 and $CONDITIONS;' ``` 檢視匯出結果: ``` [root@hop01 ~]# hadoop fs -cat /hopdir/user/tbname0/part-m-00000 ``` ## 5、匯入Hive元件 在不指定hive使用的資料庫情況下,預設匯入default庫,並且自動建立表名稱: ``` sqoop import --connect jdbc:mysql://hop01:3306/sq_import \ --username root \ --password 123456 \ --table tb_user \ --hive-import \ -m 1 ``` 執行過程,這裡注意觀察sqoop的執行日誌即可: 第一步:MySQL的資料匯入到HDFS的預設路徑下; 第二步:把臨時目錄中的資料遷移到hive表中; ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234242292-582977440.png) ## 6、匯入HBase元件 當前hbase的叢集版本是1.3,需要先建立好表,才能正常執行資料匯入: ``` sqoop import --connect jdbc:mysql://hop01:3306/sq_import \ --username root \ --password 123456 \ --table tb_user \ --columns "id,user_name" \ --column-family "info" \ --hbase-table tb_user \ --hbase-row-key id \ --split-by id ``` 檢視HBase中表資料: ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234254256-1956971669.png) # 四、資料匯出案例 新建一個MySQL資料庫和表,然後把HDFS中的資料匯出到MySQL中,這裡就使用第一個匯入指令碼生成的資料即可: ![](https://img2020.cnblogs.com/blog/1691717/202103/1691717-20210314234303602-829497915.png) ``` sqoop export --connect jdbc:mysql://hop01:3306/sq_export \ --username root \ --password 123456 \ --table tb_user \ --num-mappers 1 \ --export-dir /hopdir/user/tbuser0/part-m-00000 \ --num-mappers 1 \ --input-fields-terminated-by "," ``` 再次檢視MySQL中資料,記錄完全被匯出來,這裡`,`是每個資料欄位間的分隔符號,語法規則對照指令碼一HDFS資料查詢結果即可。 # 五、原始碼地址 ``` GitHub·地址 https://github.com/cicadasmile/big-data-parent GitEE·地址 https://gitee.com/cicadasmile/big-data-parent ``` **閱讀標籤** 【[Java基礎](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1342230680016683009#wechat_redirect)】【[設計模式](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1709518416274833422#wechat_redirect)】【[結構與演算法](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1709518416274833422#wechat_redirect)】【[Linux系統](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1334314473573744641#wechat_redirect)】【[資料庫](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1376212870744358913#wechat_redirect)】 【[分散式架構](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1327025063014596608#wechat_redirect)】【[微服務](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1460269376221200386#wechat_redirect)】【[大資料元件](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1701021199339667459#wechat_redirect)】【[SpringBoot進階](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1425309486268661760#wechat_redirect)】【[Spring&Boot基礎](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1461797173297135618#wechat_redirect)】 【[資料分析](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1695231212027428866#wechat_redirect)】【[技術導圖](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1506615482391511042#wechat_redirect)】【 [職場](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4Njg0MzYwNw==&action=getalbum&album_id=1719834087936278530#wechat_redirect)】 ![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200811231321146-1741690