Sqoop解決關係型資料庫與HDFS之間進行資料轉換
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 ‘ ’ ##指定輸出檔案中的行的欄位分隔符
-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 ‘ ’ ##hive中被匯出的檔案欄位的分隔符
命令執行完後,再去觀察表bb中的資料,是不是已經存在了!
Hadoop啟動時,出現 Warning:$HADOOP_HOME is deprecated
雖然不影響程式執行,但是看到這樣的警告資訊總是覺得自己做得不夠好,怎麼去掉哪?
我們一步步分享,先看一下啟動指令碼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 “ 001″ –lines-terminated-by “
”;
引數說明:
–fields-terminated-by “ 001″ 是設定每列之間的分隔符,” 001″是ASCII碼中的1,它也是hive的預設行內分隔符, 而sqoop的預設行內分隔符為”,”
–lines-terminated-by “
” 設定的是每行之間的分隔符,此處為換行符,也是預設的分隔符;
注意:只是複製表的結構,表中的內容沒有複製
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 “ 001″;
引數說明:
-m 2 表示由兩個map作業執行;
–fields-terminated-by “ 001″ 需同建立hive表時保持一致;
5、將hive中的表資料匯入到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 ‘ 001′
注意:
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 進行替換
相關文章
- 關係型資料庫與非關係型資料庫介紹!資料庫
- 資料庫入門之3張表對比關係型與非關係型資料庫資料庫
- 關係型資料庫之SQL資料庫SQL
- 關係型資料庫之索引資料庫索引
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- 關係型資料庫資料庫
- 關係型資料庫和非關係型資料庫的區別資料庫
- nodejs之MongoDB 非關係型資料庫NodeJSMongoDB資料庫
- 反DDD模式之關係型資料庫模式資料庫
- 關係型資料庫概要資料庫
- 關係型資料庫原理資料庫
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- redis—非關係型資料庫Redis資料庫
- WebSocket系列之JavaScript字串如何與二進位制資料間進行互相轉換WebJavaScript字串
- 資料庫——關係型資料庫MySQL--簡單使用資料庫MySql
- 虛擬主機資料庫與空間關係資料庫
- 5.JavaScript資料型別之間的轉換JavaScript資料型別
- mysqlclient操作MySQL關係型資料庫MySqlclient資料庫
- SQLALchemy操作MySQL關係型資料庫MySql資料庫
- FastAPI(44)- 操作關係型資料庫ASTAPI資料庫
- Node MySQL打造關係型資料庫MySql資料庫
- MYSQL資料庫型別與JAVA型別對應關係MySql資料庫型別Java
- 資料結構之資料、資料元素、資料項、資料物件之間的關係資料結構物件
- 大資料與Hadoop之間是什麼關係?大資料Hadoop
- 大資料技術與Hadoop之間的關係大資料Hadoop
- 關係型資料庫全表掃描分片詳解資料庫
- 使用Kepserver 自帶 DataLogger 功能 實現工控資料轉儲關係型資料庫Server資料庫
- 聊聊非關係型資料庫MongoDB索引資料庫MongoDB索引
- 平時常見關係型資料庫資料庫
- 架構與資料庫的關係架構資料庫
- 這些著名資料庫之間的“關係”,你知道嗎?資料庫
- 探討PostgreSQL例項中資料庫之間的關係SQL資料庫
- js資料型別間的互相轉換JS資料型別
- 關係型和非關係型資料庫一定要對立?達夢資料提供新思路資料庫
- 關係型資料庫 RDBMS 的舊與新 — 談談 NewSQL資料庫SQL
- 7.GoLang中基本資料型別之間的轉換Golang資料型別
- python 與 Mysql 資料型別轉換PythonMySQL 資料型別
- 資料結構與演算法之間有何關係?資料結構演算法