前言
Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.
Sqoop是一個在Hadoop與關係數據庫之間進行高效傳輸大量數據的工具。也即是可進行導入和導出操作。
翻譯的不太好見諒哈。
而Sqoop2是最新版本,但並不兼容Sqoop1。Sqoop2相比之前的版本添加了很多新的東西。具體的可參看官方文檔,這裏不過多介紹了。
對了,Sqoop2還可以在非關係數據庫之間進行導入和導出,如:HBase等
環境
- OS Debian 8.7
- Hadoop 2.6.5
- Sqoop 1.99.7
- MySQL 5.7.17
這裏除了Hadoop和Sqoop版本需要注意一下,其他的都差不多就行。
配置
關於Hadoop的集羣基本配置,我會在另外一篇文章再介紹。這裏只說下跟Sqoop2有關的配置。
Hadoop相關配置
因爲sqoop訪問Hadoop的MapReduce使用的是代理的方式,必須在Hadoop中配置所接受的proxy用戶和組。
編輯hadoop-2.6.5/etc/hadoop/core-site.xml
文件。
在裏面添加如下內容:
<!-- sqoop2 -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
其中hadoop.proxyuser.hadoop.hosts(groups)的格式應該是:hadoop.proxyuser.${SYSTEM_USER}.hosts
表示運行hadoop的系統用戶名,這裏我就是使用hadoop用戶運行的,所以就這樣配置。
Sqoop2相關配置
- 修改sqoop classpath配置,編輯
sqoop-1.99.7-bin-hadoop200/bin/sqoop.sh
文件
找到sqoop_server_classpath_set函數,修改內容如下:
function sqoop_server_classpath_set {
#HADOOP_COMMON_HOME=${HADOOP_COMMON_HOME:-${HADOOP_HOME}/share/hadoop/common}
#HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-${HADOOP_HOME}/share/hadoop/hdfs}
#HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-${HADOOP_HOME}/share/hadoop/mapreduce}
#HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-${HADOOP_HOME}/share/hadoop/yarn}
HADOOP_COMMON_HOME=${HADOOP_HOME}/share/hadoop/common
HADOOP_HDFS_HOME=${HADOOP_HOME}/share/hadoop/hdfs
HADOOP_MAPRED_HOME=${HADOOP_HOME}/share/hadoop/mapreduce
HADOOP_YARN_HOME=${HADOOP_HOME}/share/hadoop/yarn
就是改一些環境變量的配置,在這之前需要先配置好HADOOP_HOME的環境變量,也即是hadoop的解壓安裝目錄。
- 繼續修改配置文件:
sqoop-1.99.7-bin-hadoop200/conf/sqoop.properties
修改以下屬性:
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/home/hadoop/hadoop-2.6.5/etc/hadoop
這個值就是爲hadoop的配置目錄。
打開以下配置:
org.apache.sqoop.security.authentication.type=SIMPLE
org.apache.sqoop.security.authentication.handler=org.apache.sqoop.security.authentication.SimpleAuthenticationHandler
org.apache.sqoop.security.authentication.anonymous=true
這裏只簡單的配置一下,可根據需求進行更多的配置。
- 驗證配置是否有效
sqoop-1.99.7-bin-hadoop200/bin/sqoop2-tool verify
當出現以下語句時,就表示成功了,可以開始運行。
Verification was successful.
- 添加MySQL驅動
這篇主要是從MySQL數據庫導入數據,所以需要添加MySQL官方的JDBC驅動。
從官網下載:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.41.zip
解壓下其中的jar包文件,將其放到Sqoop的server/lib
和shell/lib
目錄下。
好了,基本配置就完成。
運行
- 首先需要先運行Hadoop服務,進入hadoop-2.6.5/sbin/。啓動dfs和yarn。
$ ./start-dfs.sh
$ ./start-yarn.sh
- 啓動sqoop2服務,進入sqoop-1.99.7-bin-hadoop200/bin/
$ ./sqoop.sh server start
- 檢查啓動是否成功
運行jps
命令:
6980 Jps
18020 ResourceManager
5813 SqoopJettyServer
17785 SecondaryNameNode
17550 NameNode
當都出現以上進程時就表示啓動成功了。
導入
Sqoop2相比Sqoop1不僅有命令行工具,還可以通過Java等編程接口進行操作。這裏爲了演示方便,只用命令行的形式進行操作了。
進入sqoop-1.99.7-bin-hadoop200/bin
目錄,執行以下命令進入sqoop2命令行交互界面:
$ ./sqoop2-shell
Tips:當然添加到全局PATH環境變量中,更方便。
連接服務端,配置參數
sqoop:000> set server --host 127.0.0.1 --port 12000 --webapp sqoop
運行命令查看客戶端和服務端的版本信息,確保已正確連接成功了:
sqoop:000> show version -all
配置鏈接link
sqoop2導入數據需要配置兩條鏈接的,一條鏈接到數據庫,一條鏈接到目的地(HDFS)。
而每一條鏈接都是要基於一個Connector的。
我們先查看一下,sqoop服務中已有的Connector。
sqoop:000> show connector
可以看到默認就已經有支持jdbc和hdfs的connector了。
- 創建MySQL鏈接
sqoop:000> create link -connector generic-jdbc-connector
執行以上命令就會進入到一個交互界面了,依次會提示輸入以下數據:
Name:標示這個link的字符串,如MySQL
Driver Class:指定jdbc啓動時所需要加載的driver類,我們這裏使用的是MySQL,那麼就是com.mysql.jdbc.Driver
Connection String:就是使用jdbc連接時所需要的url參數了。如:jdbc:mysql://localhost:3306/hadoop,hadoop就是數據庫名稱。
Username:鏈接數據庫的用戶名,也就是mysql客戶端傳入的-u參數。如:root
Password:鏈接數據庫的用戶密碼。
FetchSize:這個與jdbc中的fetchSize參數一樣。當需要更多行時應該從數據庫獲取的行數。直接回車了,使用默認值。
entry# 這時候可以手動指定很多JDBC屬性的值。本例只覆蓋了一個protocol值爲tcp:
protocol=tcp
Identifier enclose: 指定SQL中標識符的定界符,也就是說,有的SQL標示符是一個引號:select * from "table_name",這種定界符在MySQL中是會報錯的。這個屬性默認值就是雙引號,所以不能使用回車,必須將之覆蓋,可使用空格覆蓋了這個值。
最後出現New link was successfully
就表示創建成功了。
可以通過show link
命令查看剛剛創建的link,如果不想要了也可以通過命令刪除這個Link。
delete link -name MySQL
- 創建Hadoop鏈接Link
創建命令同上類似,只是指定的connector需要改爲hdfs的。
sqoop:000> create link -connector hdfs-connector
然後進入交互界面,這個只提示四個輸入:
Name:標示這個link的字符串,如HDFS
URI: 集羣URI,這個是在Hadoop中配置的,可找到/etc/hadoop/core-site.xml文件中的fs.defaultFS屬性,輸入對應的value值即可。
Conf directory: hadoop的配置文件目錄,如:/home/hadoop/hadoop-2.6.5/etc/hadoop
entry# 覆寫hadoop中的配置值,這裏我們不需要覆蓋,直接回車即可
返回這個表示已成功創建:New link was successfully
創建傳輸 Job
鏈接已經有了,現在就需要創建一個sqoop的Job用於提交到MapReduce框架平臺運行了。
sqoop:000> create job -f "link-name1" -t "link-name2"
- link-name1表示FROM從哪獲取數據的鏈接,這裏就是MySQL了
- link-name2表示TO導入到哪個位置去,這裏就是HDFS了
執行以上命令就會進入到一個交互界面了,依次會提示輸入以下數據:
Name: 標示這個job的字符串,如mysqlTOhdfs
Schema name: 數據庫的schema,這裏使用MySQL也就是數據庫的名稱了,如:hadoop
Table name: 數據庫中的表名
SQL statement: 就是sql查詢語句,可選的,直接回車就好
element# 重寫數據相關的一些參數,可選,直接回車就好
Partition column: 分割的列,也就是將最終文件分割爲多個,默認導入到一個文件。
Partition column nullable: (可選直接回車)
Boundary query: (可選直接回車)
Check column: (可選直接回車)
Last value: (可選直接回車)
Override null value: 覆蓋值爲空的列 (可選直接回車)
Null value: 覆蓋的值爲什麼 (可選直接回車)
File format: 文件格式,這裏選擇0,TEXT_FILE
Compression codec: 壓縮編碼器,這裏不壓縮,選擇0
Custom codec: 自定義的編碼器,這裏也不需要,直接回車
Output directory: 導入的輸出目錄,這裏需要注意指定存儲在HDFS文件系統中的路徑,需要指定一個存在的路徑,或者存在但路徑下是空的,貌似這樣才能成功。
Append mode: 用於指定是否是在已存在導出文件的情況下將新數據追加到數據文件中。可選回車
Extractors: 可選,對應 mapreduce 的 job 中 map 的數量。這裏直接回車
Loaders: 可選,對應 mapreduce 的 job 中的 reduce 的數量。這裏直接回車
element# Classpath配置,如:需要添加任務額外的jar包,這裏直接回車
以上有些參數還需要另外進行試驗分析,因爲官方文檔也說的挺少的。。
最後出現:New job was successfully
表示Job創建成功了
啓動Job
啓動job很簡單,使用命令start job -n name
這裏就是:
sqoop:000> start job -n mysqlTOhdfs
查看
查看link
sqoop:000> show link
查看connector
sqoop:000> show connector
查看job
sqoop:000> show job
查看job進度
sqoop:000> status job -n mysqlTOhdfs
查看導入後的數據
$ hadoop fs -ls sqoop
這個sqoop目錄必須要先創建,之後才能導入。
問題解析
- sqoop2 shell操作總是提示如下警告信息:
0 [main] WARN org.apache.hadoop.util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
在系統的/etc/profile
或者hadoop用戶的~/.bashrc
中添加以下環境變量即可:
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
或者添加下面的這個也行(沒試過)
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
後記
斷斷續續折騰這個也有好幾天了,當然都是晚上下班回來搞的。趁着週末又花了半天的時間,終於是搞定了。在這裏留個筆記吧。
參考資料:
http://blog.csdn.net/u012842205/article/details/52346595
https://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html