運行環境 centos 5.6 hadoop hive sqoop是讓hadoop技術支持的clouder公司開發的一個在關係資料庫和hdfs,hive之間數據導入導出的一個工具。 上海尚學堂hadoop大數據培訓組原創,陸續有hadoop大數據技術相關文章奉上,請多關註! 在使用過程中可能遇到的問 ...
運行環境 centos 5.6 hadoop hive
sqoop是讓hadoop技術支持的clouder公司開發的一個在關係資料庫和hdfs,hive之間數據導入導出的一個工具。
上海尚學堂hadoop大數據培訓組原創,陸續有hadoop大數據技術相關文章奉上,請多關註!
在使用過程中可能遇到的問題:
- sqoop依賴zookeeper,所以必須配置ZOOKEEPER_HOME到環境變數中。
- sqoop-1.2.0-CDH3B4依賴hadoop-core-0.20.2-CDH3B4.jar,所以你需要下載hadoop-0.20.2-CDH3B4.tar.gz,解壓縮後將hadoop-0.20.2-CDH3B4/hadoop-core-0.20.2-CDH3B4.jar複製到sqoop-1.2.0-CDH3B4/lib中。
1 首先安裝sqoop,如果你使用的是clouder分發版的話就非常簡單
# yum install sqoop
如果用官方版本的話
# cd /etc/yum.repos.d
# wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo
# yum -y install sqoop
sqoop就會安裝完成
2 使用sqoop
首先將mysql-connector-java-5.1.16-bin.jar文件複製到/usr/lib/sqoop/lib文件夾下
3 導入導出資料庫
1)列出mysql資料庫中的所有資料庫命令
# sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
2)連接mysql併列出資料庫中的表命令
# sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
命令中的test為mysql資料庫中的test資料庫名稱 username password分別為mysql資料庫的用戶密碼
3)將關係型數據的表結構複製到hive中
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table username --username root --password 123456 --hive-table test
其中 --table username為mysql中的資料庫test中的表 --hive-table test 為hive中新建的表名稱
4)從關係資料庫導入文件到hive中
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password mysql-password --table t1 --hive-import
5)將hive中的表數據導入到mysql中
./sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password admin --table uv_info --export-dir /user/hive/warehouse/uv/dt=2011-08-03
如果報錯
11/08/05 10:51:22 INFO mapred.JobClient: Running job: job_201108051007_0010
11/08/05 10:51:23 INFO mapred.JobClient: map 0% reduce 0%
11/08/05 10:51:36 INFO mapred.JobClient: Task Id : attempt_201108051007_0010_m_000000_0, Status : FAILED
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:350)
at uv_info.__loadFromFields(uv_info.java:194)
at uv_info.parse(uv_info.java:143)
at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:79)
at com.cloudera.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:38)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at com.cloudera.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:187)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:647)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.mapred.Child.main(Child.java:264)
此錯誤的原因為sqoop解析文件的欄位與MySql資料庫的表的欄位對應不上造成的。因此需要在執行的時候給sqoop增加參數,告訴sqoop文件的分隔符,使它能夠正確的解析文件欄位。
hive預設的欄位分隔符為'\001'
./sqoop export --connect jdbc:mysql://localhost:3306/datacenter --username root --password admin --table uv_info --export-dir /user/hive/warehouse/uv/dt=2011-08-03 --input-fields-terminated-by '\t'