利用sqoop将hive数据导入导出数据到mysql
http://niuzhenxin.iteye.com/blog/1726414
運(yùn)行環(huán)境? centos 5.6?? hadoop? hive
sqoop是讓hadoop技術(shù)支持的clouder公司開發(fā)的一個(gè)在關(guān)系數(shù)據(jù)庫和hdfs,hive之間數(shù)據(jù)導(dǎo)入導(dǎo)出的一個(gè)工具
在使用過程中可能遇到的問題:
- sqoop依賴zookeeper,所以必須配置ZOOKEEPER_HOME到環(huán)境變量中。
- 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復(fù)制到sqoop-1.2.0-CDH3B4/lib中。
1? 首先安裝sqoop,如果你使用的是clouder分發(fā)版的話就非常簡單??
?? # yum install sqoop
? 如果用官方版本的話?
?? # cd /etc/yum.repos.d
?? # wget?http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo
?? # yum -y install sqoop
?? sqoop就會(huì)安裝完成
2? 使用sqoop
?? 首先將mysql-connector-java-5.1.16-bin.jar文件復(fù)制到/usr/lib/sqoop/lib文件夾下
???
3? 導(dǎo)入導(dǎo)出數(shù)據(jù)庫
?? 1)列出mysql數(shù)據(jù)庫中的所有數(shù)據(jù)庫命令
? #? sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
???
?? 2)連接mysql并列出數(shù)據(jù)庫中的表命令
?? # sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
?? 命令中的test為mysql數(shù)據(jù)庫中的test數(shù)據(jù)庫名稱? username password分別為mysql數(shù)據(jù)庫的用戶密碼
???
?? 3)將關(guān)系型數(shù)據(jù)的表結(jié)構(gòu)復(fù)制到hive中
?sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table username --username root --password 123456 --hive-table test
其中 --table username為mysql中的數(shù)據(jù)庫test中的表?? --hive-table test 為hive中新建的表名稱
???
?? 4)從關(guān)系數(shù)據(jù)庫導(dǎo)入文件到hive中
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password mysql-password --table t1 --hive-import
?? 5)將hive中的表數(shù)據(jù)導(dǎo)入到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
如果報(bào)錯(cuò)
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)??
此錯(cuò)誤的原因?yàn)閟qoop解析文件的字段與MySql數(shù)據(jù)庫的表的字段對(duì)應(yīng)不上造成的。因此需要在執(zhí)行的時(shí)候給sqoop增加參數(shù),告訴sqoop文件的分隔符,使它能夠正確的解析文件字段。
hive默認(rèn)的字段分隔符為'\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'
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的利用sqoop将hive数据导入导出数据到mysql的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring 项目中集成 Protoco
- 下一篇: mysql中case when then