Hadoop實戰:Sqoop 1.99把MySQL導資料到HDFS
Sqoop客戶端
sqoop2客戶端提供各種命令列互動介面,供使用者使用。sqoop2客戶端先連線Sqoop Server,將引數傳遞過去,再呼叫mapreduce進行資料匯入到出作業。以下是sqoop2中比較重要的幾個物件。
1)connector:sqoop2中預定一了各種裡連結,這些連結是一些配置模板,比如最基本的generic-jdbc-connector,還有hdfs-connector,通過這些模板,可以創建出對應資料來源的link,比如我們連結MySQL,就是使用JDBC的方式進行連結,這時候就從這個generic-jdbc-connector模板繼承出一個link,可以這麼理解。
2)link:從connector繼承出的物件,用於指定的對資料來源的連結。
3)job:指定一個匯入匯出作業,必須指定資料來源和資料目的地,並配置各項job引數,用於提交給mapreduce。
sqoop2-shell使用
請確保Sqoop2伺服器已經啟動,並確保Hadoop啟動。其中hadoop不僅要啟動hdfs(NameNode、DataNode),還要啟動yarn(NodeManager、ResourceManager),當然,一般還會有一個SecondaryNameNode,用於原始NameNode的備援程序。Sqoop具體配置請看上一篇部落格:Hadoop實戰:Sqoop 1.99安裝配置
由於sqoop是一個互動式命令列工具,使用如下命令開啟sqoop的shell:
1 2 3 4 5 6 7 8 |
[[email protected] ~]$ sqoop2-shell Setting conf dir: /usr/local/sqoop/bin/../conf Sqoop home directory: /usr/local/sqoop Jun 19, 2017 10:23:36 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. Sqoop Shell: Type 'help' or '\h' for help.
sqoop:000> |
1)配置sqoop server引數
1 2 |
sqoop:000> set server --host 10.10.0.186 --port 12000 --webapp sqoop Server is set successfully |
port和host就不用說了,port是預設值;最後一個–webapp官方文件說是指定的sqoop jetty伺服器名稱,大概是一個自己能識別的用於標示這個伺服器的名字吧。
完成後可以驗證伺服器是否能正確連結上:
1 |
sqoop:000> show version --all |
這個命令能顯示shell和server的版本資訊,若server版本資訊能正確顯示,則沒問題!能正確連結上。
注意:我在執行這條命令時出現一個警告,說hadoop native library無法載入什麼的,這個目前也沒有查到相關說法,但驗證下來,hadoop2.6中的lib/native只有一些提供給C/C++呼叫的二進位制檔案。若沒有影響直接忽略吧。望哪位知道的能告訴我。
2)一些基本概念
MySQL連結使用的是JDBC,這樣想來不難理解,必須有對應的驅動檔案jar,還得有對應的訪問許可權,請確保能在server端訪問MySQL。參照上一篇部落格。可以先看看預設的connector模板都有哪些:
1 2 3 4 5 6 7 8 9 10 11 12 |
sqoop:000> show connector +------------------------+---------+------------------------------------------------------------+----------------------+ | Name | Version | Class | Supported Directions | +------------------------+---------+------------------------------------------------------------+----------------------+ | generic-jdbc-connector | 1.99.7 | org.apache.sqoop.connector.jdbc.GenericJdbcConnector | FROM/TO | | kite-connector | 1.99.7 | org.apache.sqoop.connector.kite.KiteConnector | FROM/TO | | oracle-jdbc-connector | 1.99.7 | org.apache.sqoop.connector.jdbc.oracle.OracleJdbcConnector | FROM/TO | | ftp-connector | 1.99.7 | org.apache.sqoop.connector.ftp.FtpConnector | TO | | hdfs-connector | 1.99.7 | org.apache.sqoop.connector.hdfs.HdfsConnector | FROM/TO | | kafka-connector | 1.99.7 | org.apache.sqoop.connector.kafka.KafkaConnector | TO | | sftp-connector | 1.99.7 | org.apache.sqoop.connector.sftp.SftpConnector | TO | +------------------------+---------+------------------------------------------------------------+----------------------+ |
這時候會顯示各個conector資訊,在1.99.7版本以前,每個connector會有一個id,當建立link時,用這個id指定所繼承的connector,但在這個版本中沒有這個id了,建立link時直接使用connector名稱建立。
其中,最基本的是generic-jdbc-connector,是MySQL等關係型資料庫的聯結器。支援資料的從關係型資料庫的匯入匯出。除此之外,支援匯入匯出的還有:hdfs-connector、kite-connector和oracle-jdbc-connector。僅支援資料匯入的聯結器有: sftp-connector 、 ftp-connector 以及kafka-connector 。
通過這些模板,可以創建出對應資料來源的link,比如我們連結MySQL,就是使用JDBC的方式進行連結,這時候就從這個generic-jdbc-connector模板繼承出一個link。那如果我們需要連線hdfs,則需要使用hdfs-connector模版。
link:從connector繼承出的物件,用於指定的對資料來源的連結。
job:指定一個匯入匯出作業,必須指定資料來源和資料目的地,並配置各項job引數,用於提交給mapreduce。
3)建立一個jdbc的link
這裡我們使用的是generic-jdbc-connector:
1 |
sqoop:000> create link -connector generic-jdbc-connector |
這時候就會出現互動會話,提示你輸入各項引數:
Name:標示這個link的字串,如:link-name。
JDBC Driver Class:指定JDBC啟動時所需要載入的Driver類,填寫:com.mysql.jdbc.Driver。
JDBC Connection String:指定JDBC連線字串,後面跟上需要連線的資料庫,如:jdbc:mysql://localhost:3306/test。
Username:指定需要連線的使用者名稱(要有test庫的select許可權)。
Password:指定連線使用者名稱的密碼。
FetchSize:這個屬性並沒有在官方文件上描述,我也不知道說的是什麼,直接回車了,使用的預設值。
填寫完上面幾項,將提供一個可以輸入JDBC屬性的hash,提示符是entry#,這時候可以手動指定很多JDBC屬性的值。
本例只覆蓋了一個protocol值為tcp:protocol=tcp
再按回車,之後會再定義一下SQL標準。各個資料庫系統提供商們對SQL語言標準的理解和實現各有不同,於是各有各的一些細微差別。以下屬性就是用於指定這些區別的。至此,就可以完成這個link的建立。命令列提示符也會還原為sqoop:000>。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sqoop:000> create link -connector generic-jdbc-connector Creating link for connector with name generic-jdbc-connector Please fill following values to create new link object Name: link-mysql
Database connection
Driver class: com.mysql.jdbc.Driver Connection String: jdbc:mysql://10.10.0.245:3306/sbtest Username: root Password: ****** Fetch Size: Connection Properties: There are currently 0 values in the map: entry# protocol=tcp There are currently 1 values in the map: protocol = tcp entry#
SQL Dialect
Identifier enclose: New link was successfully created with validation status OK and name link-mysql |
注意Identifier enclose: 這裡不能直接回車!要打一個空格符號然後再回車!因為如果不打空格,查詢MySQL表的時候會在表上加上“”,導致查詢出錯!
4)建立一個hdfs的link
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sqoop:000> create link -connector hdfs-connector Creating link for connector with name hdfs-connector Please fill following values to create new link object Name: link-hdfs
HDFS cluster
URI: hdfs://10.10.0.186:8020 Conf directory: Additional configs:: There are currently 0 values in the map: entry# New link was successfully created with validation status OK and name link-hdfs |
檢視建立的link
1 2 3 4 5 6 7 |
sqoop:000> show link +------------+------------------------+---------+ | Name | Connector Name | Enabled | +------------+------------------------+---------+ | link-mysql | generic-jdbc-connector | true | | link-hdfs | hdfs-connector | true | +------------+------------------------+---------+ |
5)建立傳輸JOB
1 |
sqoop:000> create job -f "link-mysql" -t "link-hdfs" |
-f指定from,即是資料來源位置,-t指定to,即是目的地位置。本例是從MySQL傳遞資料到HDFS,所以就是from mysql to HDFS。引數值就是在建立連結(link)時指定的Name。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
sqoop:000> create job -f "link-mysql" -t "link-hdfs" Creating job for links with from name link-mysql and to name link-hdfs Please fill following values to create new job object Name: mysql-hdfs
Database source
Schema name: sbtest Table name: sbtest1 SQL statement: Column names: There are currently 0 values in the list: element# Partition column: Partition column nullable: Boundary query:
Incremental read
Check column: Last value:
Target configuration
Override null value: Null value: File format: 0 : TEXT_FILE 1 : SEQUENCE_FILE 2 : PARQUET_FILE Choose: 0 Compression codec: 0 : NONE 1 : DEFAULT 2 : DEFLATE 3 : GZIP 4 : BZIP2 5 : LZO 6 : LZ4 7 : SNAPPY 8 : CUSTOM Choose: 0 Custom codec: Output directory: /sqoop Append mode:
Throttling resources
Extractors: Loaders:
Classpath configuration
Extra mapper jars: There are currently 0 values in the list: element# New job was successfully created with validation status OK and name mysql-hdfs |
以下是各個屬性
Name:一個標示符,自己指定即可。
Schema Name:指定Database或Schema的名字,這裡指定資料庫名字為sbtest即可,本例的資料庫。
Table Name:本例使用的資料庫表為sbtest1,自己指定匯出的表,多表的情況請自行檢視官方文件。
SQL Statement:如果指定了表這裡就不需要指定SQL查詢語句了。
配置完以上幾項,又回出現element#提示符,提示輸入一些hash值,這裡我沒有再指定什麼。直接回車過。而以下幾個配置我也是直接回車,使用預設值,大概是一些與資料庫相關的引數。
Partition column:
Partition column nullable:
Boundary query
Last value
後面需要配置資料目的地各項值:
Null alue:大概說的是如果有空值用什麼覆蓋
File format:指定在HDFS中的資料檔案是什麼檔案格式,這裡使用TEXT_FILE,即最簡單的文字檔案。
Compression codec:用於指定使用什麼壓縮演算法進行匯出資料檔案壓縮,我指定NONE。
Custom codec:這個就是指定的custom壓縮演算法,本例選擇NONE,所以直接回車過去。
Output directory:指定儲存在HDFS檔案系統中的路徑,本例中指定/sqoop(會自動在HDFS建立)。
Append mode:用於指定是否是在已存在匯出檔案的情況下將新資料追加到資料檔案中。
Extractors:不清楚是什麼
Loaders:不清楚是什麼
最後再次出現element#提示符,用於輸入extra mapper jars的屬性,可以什麼都不寫。直接回車。至此若出現successful則證明已經成功建立。
檢視任務
1 2 3 4 5 6 |
sqoop:000> show job +----+---------------+-------------------------------------+----------------------------+---------+ | Id | Name | From Connector | To Connector | Enabled | +----+---------------+-------------------------------------+----------------------------+---------+ | 3 | mysql-hdfs | link-mysql (generic-jdbc-connector) | link-hdfs (hdfs-connector) | true | +----+---------------+-------------------------------------+----------------------------+---------+ |
6)啟動JOB
我這裡MySQL資料庫有一百萬資料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[[email protected] ~]# mysql -h10.10.0.245 -P3306 -uroot -p123456 sbtest mysql: [Warning] Using a password on the command line interface can be insecure. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 331 Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select count(*) from sbtest1; +----------+ | count(*) | +----------+ | 1000000 | +----------+ 1 row in set (0.18 sec) |
然後start job即可
1 2 3 4 5 6 7 8 9 10 |
sqoop:000> start job -n mysql-hdfs Submission details Job Name: mysql-hdfs Server URL: http://localhost:12000/sqoop/ Created by: hadoop Creation date: 2017-06-20 07:00:56 EDT Lastly updated by: hadoop External ID: job_1497872194266_0002 http://master:8088/proxy/application_1497872194266_0002/ 2017-06-20 07:00:56 EDT: BOOTING - Progress is not available |
然後趕快檢視這個任務的狀態(當任務執行完成後無法檢視的):
1 2 3 4 5 6 7 8 9 10 |
sqoop:000> status job -n mysql-hdfs Submission details Job Name: mysql-hdfs-02 Server URL: http://localhost:12000/sqoop/ Created by: hadoop Creation date: 2017-06-20 08:57:18 EDT Lastly updated by: hadoop External ID: job_1497961863680_0001 http://master:8088/proxy/application_1497961863680_0001/ 2017-06-20 08:57:51 EDT: RUNNING - 45.00 % |
所以推薦去Web UI檢視,當job執行的時候,你去某個節點上jps一下,會發現有幾個YarnChild和AppMaster的程序。所以,sqoop2也是由yarn框架來管理的,我們可以通過 http://Hadoop:8088來檢視程序的執行的狀態(當Yarn重啟後,歷史任務會消失,可以安裝JobHistoryServer解決)。
啟動過程中很有可能會報錯,我測試中報錯很多,這是後來成功的。比如啟動job的時候提示:“Exception: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0016:Can’t fetch schema -”。需要好好檢查在建立資料庫連結時,連結引數格式問題,特別是注意Identifier enclose: 這裡不能直接回車!要打一個空格符號然後再回車!因為如果不打空格,查詢MySQL表的時候會在表上加上“”,導致查詢出錯!
要設定可檢視具體出錯資訊
1 2 |
sqoop:000> set option --name verbose --value true Verbose option was changed to true |
當任務完成後,可以去HDFS檢視檔案:
1 2 3 4 5 6 7 8 9 10 11 12 |
[[email protected] ~]$ hdfs dfs -ls /sqoop Found 10 items -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/093b9956-962a-4377-b423-0b825215ce6b.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/93e6efc5-03ac-4551-abbe-d447c528c57d.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/97051dbc-fc53-4d33-b651-bc68dc21c296.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/a8df348e-d4de-4883-a22b-565d87e3e255.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/ade642e6-55bb-4f28-8067-da53eecf5d8f.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/bbb1b081-4286-4815-ae48-6adfabf39eb6.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/bff764be-51f0-4440-b360-448109b34f03.txt -rw-r--r-- 3 hadoop supergroup 19800001 2017-06-20 08:57 /sqoop/e12c764c-0c63-46bc-ad98-22d1fa3b2eb1.txt -rw-r--r-- 3 hadoop supergroup 19800000 2017-06-20 08:57 /sqoop/e16cf287-1551-47b4-a264-241251cf9a91.txt -rw-r--r-- 3 hadoop supergroup 19688895 2017-06-20 08:57 /sqoop/fe77ccf9-532a-4041-84dc-8f1322d9fed7.txt |
引用:
http://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html
https://www.jianshu.com/p/b00e1a368bfc
https://blog.csdn.net/u014729236/article/details/46876651