sqoop的安裝與使用

sqoop的安裝與使用

閱讀目錄

  • 1、列出mysql數據庫中的所有數據庫
  • 2、連接mysql並列出數據庫中的表
  • 3、將關係型數據的表結構複製到hive中
  • 4、將數據從關係數據庫導入文件到hive表中
  • 5、將hive中的表數據導入到mysql數據庫表中
  • 6、將數據從關係數據庫導入文件到hive表中,--query 語句使用
  • 7、將數據從關係數據庫導入文件到hive表中,--columns  --where 語句使用

Sqoop是一個轉換工具,用於在關係型數據庫與HDFS之間進行數據轉換。強大功能見下圖

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

1.安裝

我們使用的版本是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目錄下。

2.重命名配置文件

在${SQOOP_HOME}/conf中執行命令

mv  sqoop-env-template.sh  sqoop-env.sh

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

3.修改配置文件sqoop-env.sh

內容如下

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/hadoop/

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/hadoop

#set the path to where bin/hbase is available
export HBASE_HOME=/usr/local/hbase

#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/hive

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/zk

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

4.把數據從mysql導入到hdfs中

在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的內容,字段之間是使用製表符分割的。

5.把數據從hdfs導出到mysql中

把上一步導入到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中的數據,是不是已經存在了!


Hadoop啓動時,出現 Warning:$HADOOP_HOME is deprecated 的原因



我們在執行腳本start-all.sh,啓動hadoop時,有時會出現如下圖的警告信息

雖然不影響程序運行,但是看到這樣的警告信息總是覺得自己做得不夠好,怎麼去掉哪?

我們一步步分享,先看一下啓動腳本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,就不會出現警告信息了,如下圖


1列出mysql數據庫中的所有數據庫

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

 

2、連接mysql並列出數據庫中的表

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

 

3、將關係型數據的表結構複製到hive

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"  設置的是每行之間的分隔符,此處爲換行符,也是默認的分隔符;


注意:只是複製表的結構,表中的內容沒有複製


4、將數據從關係數據庫導入文件到hive表中

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表時保持一致;


 

5hive中的表數據導入到mysql數據庫表中

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會報異常,具體見本人上一篇帖子

 

6、將數據從關係數據庫導入文件到hive表中,--query 語句使用

 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 ",";


7、將數據從關係數據庫導入文件到hive表中,--columns  --where 語句使用

 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 進行替換

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章