利用sqoop將hive數據導入導出數據到mysql

運行環境  centos 5.6   hadoop  hive
sqoop是讓hadoop技術支持的clouder公司開發的一個在關係數據庫和hdfs,hive之間數據導入導出的一個工具


在使用過程中可能遇到的問題:

  • 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'

參考http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html#_literal_sqoop_create_hive_table_literal

 

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