天天看點

Sqoop解決關系型資料庫與HDFS之間進行資料轉換1.安裝 2.重命名配置檔案 3.修改配置檔案sqoop-env.sh 4.把資料從mysql導入到hdfs中 5.把資料從hdfs導出到mysql中

sqoop是一個轉換工具,用于在關系型資料庫與hdfs之間進行資料轉換。

以下操作就是使用sqoop在mysql和hdfs之間轉換資料。

我們使用的版本是sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz,打算安裝在/usr/local目錄下。

首先就是解壓縮,重命名為sqoop,然後在檔案/etc/profile中設定環境變量sqoop_home。

把mysql的jdbc驅動mysql-connector-java-5.1.10.jar複制到sqoop項目的lib目錄下。

在${sqoop_home}/conf中執行指令

在conf目錄下,有兩個檔案sqoop-site.xml和sqoop-site-template.xml内容是完全一樣的,不必在意,我們隻關心sqoop-site.xml即可。

内容如下

好了,搞定了,下面就可以運作了。

在mysql中資料庫test中有一張表是aa

現在我們要做的是把aa中的資料導入到hdfs中,執行指令如下

sqoop ##sqoop指令

import ##表示導入

–connect jdbc:mysql://ip:3306/sqoop ##告訴jdbc,連接配接mysql的url

–username root ##連接配接mysql的使用者名

–password admin ##連接配接mysql的密碼

–table aa ##從mysql導出的表名稱

–fields-terminated-by ‘\t’ ##指定輸出檔案中的行的字段分隔符

-m 1 ##複制過程使用1個map作業

以上的指令中後面的##部分是注釋,執行的時候需要删掉;另外,指令的所有内容不能換行,隻能一行才能執行。以下操作類似。

該指令執行結束後,觀察hdfs的目錄/user/{user_name},下面會有一個檔案夾是aa,裡面有個檔案是part-m-00000。該檔案的内容就是資料表aa的内容,字段之間是使用制表符分割的。

把上一步導入到hdfs的資料導出到mysql中。我們已知該檔案有兩個字段,使用制表符分隔的。那麼,我們現在資料庫test中建立一個資料表叫做bb,裡面有兩個字段。然後執行下面的指令

sqoop

export ##表示資料從hive複制到mysql中

–connect jdbc:mysql://192.168.1.113:3306/test

–username root

–password admin

–table bb ##mysql中的表,即将被導入的表名稱

–export-dir ‘/user/root/aa/part-m-00000′ ##hive中被導出的檔案

–fields-terminated-by ‘\t’ ##hive中被導出的檔案字段的分隔符

指令執行完後,再去觀察表bb中的資料,是不是已經存在了!

雖然不影響程式運作,但是看到這樣的警告資訊總是覺得自己做得不夠好,怎麼去掉哪?

我們一步步分享,先看一下啟動腳本start-all.sh的源碼,

雖然我們看不懂shell腳本的文法,但是可以猜到可能和檔案hadoop-config.sh有關,我們再看一下這個檔案的源碼。該檔案特大,我們隻截取最後一部分,

從圖中的紅色框框中可以看到,腳本判斷變量hadoop_home_warn_suppress和hadoop_home的值,如果前者為空,後者不為空,則顯示警告資訊“warning……”。

我們在安裝hadoop是,設定了環境變量hadoop_home造成的。

網上有的說新的hadoop版本使用hadoop_install作為環境變量,我還沒有看到源代碼,并且擔心其他架構與hadoop的相容性,是以暫時不修改,那麼隻好設定hadoop_home_warn_suppress的值了。

修改配置檔案/etc/profile(我原來一直在這裡設定環境變量,作業系統是rhel6.3),增加環境變量hadoop_home_warn_suppress,

儲存退出,再次啟動hadoop,就不會出現警告資訊了

sqoop list-databases –connect jdbc:mysql://localhost:3306/ -username dyh -password 000000

sqoop list-tables –connect jdbc:mysql://localhost:3306/test –username dyh –password 000000

sqoop create-hive-table –connect jdbc:mysql://localhost:3306/test –table users –username dyh

–password 000000 –hive-table users –fields-terminated-by “\0001″ –lines-terminated-by “\n”;

參數說明:

–fields-terminated-by “\0001″ 是設定每列之間的分隔符,”\0001″是ascii碼中的1,它也是hive的預設行内分隔符, 而sqoop的預設行内分隔符為”,” 

–lines-terminated-by “\n” 設定的是每行之間的分隔符,此處為換行符,也是預設的分隔符;

注意:隻是複制表的結構,表中的内容沒有複制

sqoop import –connect jdbc:mysql://localhost:3306/test –username dyh –password 000000

–table users –hive-import –hive-table users -m 2 –fields-terminated-by “\0001″;

-m 2 表示由兩個map作業執行;

–fields-terminated-by “\0001″ 需同建立hive表時保持一緻;

sqoop export –connect jdbc:mysql://192.168.20.118:3306/test –username dyh –password 000000

–table users –export-dir /user/hive/warehouse/users/part-m-00000

–input-fields-terminated-by ‘\0001′

注意:

1、在進行導入之前,mysql中的表userst必須已經提起建立好了。

2、jdbc:mysql://192.168.20.118:3306/test中的ip位址改成localhost會報異常,具體見本人上一篇文章

sqoop import –append –connect jdbc:mysql://192.168.20.118:3306/test –username dyh –password 000000 –query “select id,age,name from userinfos where \$conditions” -m 1 –target-dir /user/hive/warehouse/userinfos2 –fields-terminated-by “,”;

sqoop import –append –connect jdbc:mysql://192.168.20.118:3306/test –username dyh –password 000000 –table userinfos –columns “id,age,name” –where “id > 3 and (age = 88 or age = 80)” -m 1 –target-dir /user/hive/warehouse/userinfos2 –fields-terminated-by “,”;

注意:–target-dir /user/hive/warehouse/userinfos2 可以用 –hive-import –hive-table userinfos2 進行替換