1.6-1.10 使用Sqoop匯入資料到HDFS及一些設定
阿新 • • 發佈:2021-07-10
一、導資料
1、import和export
Sqoop可以在HDFS/Hive和關係型資料庫之間進行資料的匯入匯出,其中主要使用了import和export這兩個工具。這兩個工具非常強大, 提供了很多選項幫助我們完成資料的遷移和同步。比如,下面兩個潛在的需求: 1、業務資料存放在關係資料庫中,如果資料量達到一定規模後需要對其進行分析或同統計,單純使用關係資料庫可能會成為瓶頸, 這時可以將資料從業務資料庫資料匯入(import)到Hadoop平臺進行離線分析。 2、對大規模的資料在Hadoop平臺上進行分析以後,可能需要將結果同步到關係資料庫中作為業務的輔助資料,這時候需要 將Hadoop平臺分析後的資料匯出(export)到關係資料庫。
[root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help import
[root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help export
2、import引數
##sqoop通用引數 --connect <jdbc-uri>:指定JDBC連線字串。 --connection-manager <class-name>:指定要使用的連線管理器類。 --driver <class-name>:手動指定要使用的JDBC驅動程式類。 --hadoop-mapred-home <dir>:覆蓋$ HADOOP_MAPRED_HOME。 --help:列印使用說明。 --password-file:為包含認證密碼的檔案設定路徑。 -P:從控制檯讀取密碼。 --password <password>:設定驗證密碼。 --username <username>:設定驗證使用者名稱。 --verbose:在執行時列印更多資訊。 --connection-param-file <filename>:提供連線引數的可選屬性檔案。 --relaxed-isolation:將mapper的連線事務隔離設定為只讀。 ##import引數 --append 將資料追加到HDFS上一個已存在的資料集上 --as-avrodatafile 將資料匯入到Avro資料檔案 --as-sequencefile 將資料匯入到SequenceFile --as-textfile 將資料匯入到普通文字檔案(預設) --boundary-query <statement> 邊界查詢,用於建立分片(InputSplit) --columns <col,col,col…> 從表中匯出指定的一組列的資料 --delete-target-dir 如果指定目錄存在,則先刪除掉 --direct 使用直接匯入模式(優化匯入速度) --direct-split-size <n> 分割輸入stream的位元組大小(在直接匯入模式下) --fetch-size <n> 從資料庫中批量讀取記錄數 --inline-lob-limit <n> 設定內聯的LOB物件的大小 -m,--num-mappers <n> 使用n個map任務並行匯入資料 -e,--query <statement> 匯入的查詢語句 --split-by <column-name> 指定按照哪個列去分割資料 --table <table-name> 匯入的源表表名 --target-dir <dir> 匯入HDFS的目標路徑 --warehouse-dir <dir> HDFS存放表的根路徑 --where <where clause> 指定匯出時所使用的查詢條件 -z,--compress 啟用壓縮 --compression-codec <c> 指定Hadoop的codec方式(預設gzip) --null-string <null-string> 果指定列為字串型別,使用指定字串替換值為null的該類列的值 --null-non-string <null-string> 如果指定列為非字串型別,使用指定字串替換值為null的該類列的值
3、在MySQL中準備一些資料
mysql> use test; Database changed mysql> CREATE TABLE `my_user` ( -> `id` tinyint(4) NOT NULL AUTO_INCREMENT, -> `account` varchar(255) DEFAULT NULL, -> `passwd` varchar(255) DEFAULT NULL, -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `my_user` VALUES ('1', 'admin', 'admin'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('2', 'pu', '12345'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('3', 'system', 'system'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('4', 'zxh', 'zxh'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('5', 'test', 'test'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('6', 'pudong', 'pudong'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `my_user` VALUES ('7', 'qiqi', 'qiqi'); Query OK, 1 row affected (0.00 sec)
4、將mysql表匯出到hdfs
##這裡沒有指定存到hdfs哪裡,會預設儲存hdfs使用者主目錄下以表名為目錄儲存 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user ##預設儲存,預設用了4個map [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root 19/05/06 15:55:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable drwxr-xr-x - root supergroup 0 2019-05-06 15:53 /user/root/my_user -rw-r--r-- 1 root supergroup 0 2019-05-06 15:53 /user/root/my_user/_SUCCESS -rw-r--r-- 1 root supergroup 25 2019-05-06 15:53 /user/root/my_user/part-m-00000 -rw-r--r-- 1 root supergroup 26 2019-05-06 15:53 /user/root/my_user/part-m-00001 -rw-r--r-- 1 root supergroup 12 2019-05-06 15:53 /user/root/my_user/part-m-00002 -rw-r--r-- 1 root supergroup 28 2019-05-06 15:53 /user/root/my_user/part-m-00003
指定儲存目錄,設定用1個map:
## bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user \ --num-mappers 1 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -ls -R /user/root/sqoop 19/05/06 16:01:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable drwxr-xr-x - root supergroup 0 2019-05-06 16:01 /user/root/sqoop/imp_my_user -rw-r--r-- 1 root supergroup 0 2019-05-06 16:01 /user/root/sqoop/imp_my_user/_SUCCESS -rw-r--r-- 1 root supergroup 91 2019-05-06 16:01 /user/root/sqoop/imp_my_user/part-m-00000
二、執行流程
sqoop 底層的實現就是MapReduce,對import來說,僅僅執行Map Task
三、設定資料儲存格式為parquet
1、先把mysql的資料匯出到hdfs
## bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user_parquet \ --fields-terminated-by ',' \ --num-mappers 1 \ --as-parquetfile
2、再將資料從hdfs匯入到hive
##在hive中先建立一張表 drop table if exists default.hive_user_orc ; create table default.hive_user_orc( id int, username string, password string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS parquet ; ##匯入資料 hive (default)> load data inpath '/user/root/sqoop/imp_my_user_parquet' into table default.hive_user_orc ; #查詢,此時資料都為空,格式為parquet檔案,這是sqoop1.4.5的一個bug,1.4.6已經修復; hive (default)> select * from default.hive_user_orc ;
四、匯入資料使用query
1、選擇匯出所需的列
##只匯出 id和account這兩列 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_user_column \ --num-mappers 1 \ --columns id,account ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_column/part-m-00000 19/05/06 16:39:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 1,admin 2,pu 3,system 4,zxh 5,test 6,pudong 7,qiqi
2、query
* 在實際的專案中,要處理的資料,需要進行初步清洗和過濾 * 某些欄位過濾 * 條件 * join
##--query引數,直接寫一條select語句 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --query 'select id, account from my_user where $CONDITIONS' \ --target-dir /user/root/sqoop/imp_my_user_query \ --num-mappers 1 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -text /user/root/sqoop/imp_my_user_query/part-m-00000 19/05/06 16:58:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 1,admin 2,pu 3,system 4,zxh 5,test 6,pudong 7,qiqi
五、import hdfs設定資料壓縮為sanppy
1、設定hadoop支援sanppy壓縮
[root@hadoop-senior cdh]# tar zxf cdh5.3.6-snappy-lib-natirve.tar.gz [root@hadoop-senior lib]# rm -rf /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native [root@hadoop-senior lib]# cp -r native/ /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/ ##檢視是否已經支援 [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hadoop checknative 19/05/06 17:13:56 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native 19/05/06 17:13:56 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library Native library checking: hadoop: true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libhadoop.so.1.0.0 zlib: true /lib64/libz.so.1 snappy: true /opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/lib/native/libsnappy.so.1 lz4: true revision:99 bzip2: true /lib64/libbz2.so.1
2、
bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/root/sqoop/imp_my_sannpy \ --delete-target-dir \ --num-mappers 1 \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec #--delete-target-dir 目標目錄存在則刪除 #--compress 啟用壓縮轉自:https://www.cnblogs.com/weiyiming007/p/10820932.html