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

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


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

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

   5)將hive中的表數據導入到mysql中sql

./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文件的分隔符,使它可以正確的解析文件字段。apache

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

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