1.6-1.10 使用Sqoop導入數據到HDFS及一些設置


一、導數據

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    啟用壓縮


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM