Sqoop1.99.7安裝、配置和使用(二)
本文將接上文,記錄Sqoop1.99.7基本使用。這裡我們使用sqoop2將MySQL中的一個數據表匯出到HDFS,都是最簡單的使用。
請確保Sqoop2伺服器已經啟動,並確保Hadoop啟動。其中Hadoop不僅要啟動hdfs(NameNode、DataNode),還要啟動yarn(NodeManager、ResourceManager),當然,一般還會有一個SecondaryNameNode,用於原始NameNode的備援程序。Sqoop具體配置請看上一篇部落格。
一、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。
二、客戶端使用
由於sqoop是一個互動式命令列工具,使用如下命令開啟sqoop的shell:
bin/sqoop2-shell
若成功會開啟sqoop的shell命令列提示符:sqoop:000>
(1)配置sqoop server引數
sqoop:000> set server --host your.host.com --port 12000 --webapp sqoop
port和host就不用說了,port是預設值;最後一個--webapp官方文件說是指定的sqoop jetty伺服器名稱,大概是一個自己能識別的用於標示這個伺服器的名字吧。
完成後可以驗證伺服器是否能正確連結上:
這個命令能顯示shell和server的版本資訊,若server版本資訊能正確顯示,則沒問題!能正確連結上。sqoop:000> show version --all
注意:我在執行這條命令時出現一個警告,說hadoop native library無法載入什麼的,這個目前也沒有查到相關說法,但驗證下來,hadoop2.6中的lib/native只有一些提供給C/C++呼叫的二進位制檔案。若沒有影響直接忽略吧。望哪位知道的能告訴我。
(2)配置連結到MySQL的連結(link)
MySQL連結使用的是JDBC,這樣想來不難理解,必須有對應的驅動檔案jar,還得有對應的訪問許可權,請確保能在server端訪問MySQL。參照上一篇部落格。
可以先看看connector模板都有哪些:
show connector
這時候會顯示各個conector資訊,在1.99.7版本以前,每個connector會有一個id,當建立link時,用這個id指定所繼承的connector,但在這個版本中沒有這個id了,建立link時直接使用connector名稱建立,這裡我們使用的是generic-jdbc-connector:
sqoop:000> create link -connector generic-jdbc-connector
這時候就會出現互動會話,提示你輸入各項引數:
Name:標示這個link的字串,可以是一個自己喜歡的名稱。
Driver Class:指定jdbc啟動時所需要載入的driver類,這個類實現了java.sql.Driver介面。對本文來說,這個值是com.mysql.jdbc.Driver。
Connection String:廣為人知的資料庫連結字串,本例為jdbc:mysql://localhost/db_ez,db_ez是本例的資料庫名稱。
Username:連結資料庫的使用者名稱,也就是mysql客戶端傳入的-u引數。本例是ez。
Password:連結資料庫的使用者密碼。
FetchSize:這個屬性並沒有在官方文件上描述,我也不知道說的是什麼,直接回車了,使用的預設值。
填寫完上面幾項,將提供一個可以輸入JDBC屬性的hash,提示符是entry#,這時候可以手動指定很多JDBC屬性的值。本例只覆蓋了一個protocol值為tcp:
protocol=tcp
再按回車,之後會再定義一下SQL方言。也就是說,各個資料庫系統提供商們對SQL語言標準的理解和實現各有不同,於是各有各的一些細微差別。以下屬性就是用於指定這些區別的。當然,很坑的是,官方文件上並沒有說明這些屬性如何填寫,連提都沒提。
Identifier enclose:指定SQL中識別符號的定界符,也就是說,有的SQL標示符是一個引號:select * from "table_name",這種定界符在MySQL中是會報錯的。這個屬性預設值就是雙引號,所以不能使用回車,必須將之覆蓋,我使用空格覆蓋了這個值。吐槽一下,這個錯誤我整了一整天才搞明白,官方文件也是坑啊!
至此,就可以完成這個link的建立。命令列提示符也會還原為sqoop:000>。使用以下命令檢視是否建立成功:
show link
(3)配置連結到HDFS的link:
同理,使用以下命令,connector指定為HDFS:
sqoop:000> create link -connector hdfs-connector
hdfs的引數只有一個Name和一個HDFS URI,Name同上的MySQL,自己指定一個喜歡的標示符即可。這個url是hadoop中配置hdfs-site.xml中的屬性fs.defaultFS的值。本例為hdfs://localhost:9000
回車後沒有什麼錯誤就會顯示successful資訊。
(4)配置傳輸事務job:
連結都指定了,接下來就要指定Job,用於提交給mapreduce:
sqoop:000> create job -f "link-name1" -t "link-name2"
-f指定from,即是資料來源位置,-t指定to,即是目的地位置。本例是從MySQL傳遞資料到HDFS,所以就是from mysql to HDFS。引數值就是在建立連結(link)時指定的Name。以下是各個屬性
Name:一個標示符,自己指定即可。
Schema Name:指定Database或Schema的名字,在MySQL中,Schema同Database類似,具體什麼區別沒有深究過,但官網描述在建立時差不多。這裡指定資料庫名字為db_ez即可,本例的資料庫。
Table Name:本例使用的資料庫表為tb_forhadoop,自己指定匯出的表。多表的情況請自行檢視官方文件。
SQL Statement:就是sql查詢語句,文件上說需要指定一個$condition,但我一直沒有建立成功,貌似是一個條件子句。
配置完以上幾項,又回出現element#提示符,提示輸入一些hash值,這裡我沒有再指定什麼。直接回車過。而以下幾個配置我也是直接回車,使用預設值,大概是一些與資料庫相關的引數。
Partition column:
Partition column nullable:
Boundary query
Last value
後面需要配置資料目的地各項值:
Null alue:大概說的是如果有空值用什麼覆蓋
File format:指定在HDFS中的資料檔案是什麼檔案格式,這裡使用TEXT_FILE,即最簡單的文字檔案。
Compression codec:用於指定使用什麼壓縮演算法進行匯出資料檔案壓縮,我指定NONE,這個也可以使用自定義的壓縮演算法CUSTOM,用Java實現相應的介面。
Custom codec:這個就是指定的custom壓縮演算法,本例選擇NONE,所以直接回車過去。
Output directory:指定儲存在HDFS檔案系統中的路徑,這裡最好指定一個存在的路徑,或者存在但路勁下是空的,貌似這樣才能成功。
Append mode:用於指定是否是在已存在匯出檔案的情況下將新資料追加到資料檔案中。
Extractors:不清楚是什麼,我取了一個1
Loaders:同上
最後再次出現element#提示符,用於輸入extra mapper jars的屬性,可以什麼都不寫。直接回車。
至此若出現successful則證明已經成功建立。
三、開啟事務
使用如下命令
start job -n name
name就是建立job時指定的Name屬性,不出意外將正確執行,之後使用如下命令就能檢視其進度了:
status job -n name
四、寫在最後
未完成。。。