`
thomas0988
  • 浏览: 472704 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

利用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

 

=====================================================

搭建sqoop的eclipse调试环境
a、导入到sqoop到eclipse中:下载sqoop 1.3的tar包解压,我们打开build.xml,发现<target name="eclipse" description="Generate Eclipse project">的target,我们只需要执行,ant eclipse,就可以ant脚本就可以给我们生成eclipse的工程文件,我们只需要在eclipse中导入即可。
b、调试sqoop:由于sqoop bin文件夹中的脚本,sqoop来启动java进程,java进程是sqoop脚本的子进程,sqoop脚本中配置了的许多环境变量需要传到sqoop程序中,所以直接,在eclipse中main函数执行,不能执行,所以需要远程调试java进程。
c、如何进行java进程调试:打开bin\sqoop,最后一行,发现,
exec ${HADOOP_HOME}/bin/hadoop com.cloudera.sqoop.Sqoop "$@",执行这句话,说明执行的hadoop脚本,要想进行远程调试,我们需要在hadoop脚本中加入,我们调试参数,我是这样加的,在hadoop脚本中加入,
HADOOP_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=9991,server=y,su    spend=y",然后在后面的脚本中加入这个选项就行,这样就能远程调试了。
例如,我执行./sqoop import --connect jdbc:mysql://localhost/TEST --username root --password root --table STUDENT,功能把student表中的数据导入到hdfs上,加入调试选项后,进程就会停下来,我们只需要eclipse进行远程调试,就像我们本地代码是一样的,可以打断点,可以看变量的值,很方便,具体eclipse 远程调试可以参照,http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/,即可。接下就可以学习其源码了。

==============================================================

 

   今天下午碰到了一个诡异的Sqoop问题,一开始认为是奇迹,后来在牛人的协助下才终于找出原因.这里记录下.

       我这里通过Sqoop从Mysql中导数据到HDFS,再从HDFS中读取这些数据.我们知道Sqoop会通过SQL语句先获取表结构,然后生成相应的Java类.后来我更改了SQL语句,如之前SELECT AGE,NAME FROM USER;AGE是数值型,NAME是VARCHAR型.后来更改了表结构或者临时SQL转换将AGE换成了VARCHAR.

       正常情况下,由于AGE类型已经更改,那么对应Java类也会随着更改.但在Eclipse环境中发生以下不可思议:

       Sqoop可以正常获取数据,生成相应的Java class,并且写入到HDFS中.但是在Eclipse中从HDFS中读取这些数据,却报错.报错主要是AGE是STRING,无法转换成Number.如此看来是沿用了老的Java Class,也就是更改SQL以前Sqoop生成的Java Class.

       有些不可思议,Sqoop明明会根据SQL重新生成对应的Java Class.看它生成的Java Class,所对应的AGE类型也确实正确.但是什么原因呢?

       在牛人的帮助下才知道原因.由于Eclipse中从HDFS中读取刚导入的数据,需要将它生成的Java Class加载进来.而之前生成的Java Class已经被编译成class放在workspace/yourProject/bin目录下.对于Eclipse来说,首先是加载自己的Class,虽然这里Sqoop生成的Java Class才是正宗.所以Eclipse一直用以前的Java Class去解析数据,导致类型不匹配.

       如果是使用Sqoop命令,或者不在Eclipse环境里执行或许就不会发生这种问题.

       折腾了一下午,也明白了这么一回事.

分享到:
评论

相关推荐

    实战Sqoop数据导入及大数据用户行为案例分析

    实战Sqoop数据导入及大数据用户行为案例分析...08_Sqoop将MySQL数据导入Hive表中 09_Sqoop的导出及脚本中使用的方式 10_案例分析-动态分区的实现 11_案例分析-源表的分区加载创建 12_案例分析-指标分析使用Sqoop导出

    数据同步Sqoop用法之mysql与Hive导入导出.docx

    数据同步Sqoop用法之mysql与Hive导入导出.docx

    2、sqoop导入(RMDB-mysql、sybase到HDFS-hive)

    2、sqoop导入(RMDB-mysql、sybase到HDFS-hive) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130572275 介绍sqoop从关系型数据库mysql、sybase同步到hdfs、hive中

    23-Sqoop数据导入导出1

    2. 练习使用Sqoop将数据从Mysql中导入到HBase中 3. 练习使用Sqoop将数据在Mysql与Hive之间的导入导出 4. Sqoop上的操作举例

    BigData:Sqoop+Hive+MySQL 纽约证券交易所数据集

    Sqoop 将数据从mysql导入HIVE 操作hive中的数据来计算每个股票代码的股票量 将此数据存储到 hive 上的 stock_volume 表中 使用 sqoop 将此数据从 hive 导出回 mysql 进行报告。 待开发。 用于导入、数据操作和...

    flume、hive和sqoop的实用案例

    flume、hive和sqoop的实用案例:flume收集日志hive负责处理数据sqoop负责将数据导出到mysql中供页面展示

    【63课时完整版】大数据实践HIVE详解及实战

    29.Sqoop将MySQL数据导入到HDFS(一) 30.Sqoop将MySQL数据导入到HDFS(二) 31.Sqoop中的增量导入与Sqoop job 32.Sqoop将MySQL数据导入Hive表中 33.Sqoop的导出及脚本中使用的方式 34.案例分析-动态分区的实现 35....

    sqoop导出数据到mysql故障处理---完整检查日志方法总结.txt

    sqoop问题处理通用办法,首先详细描绘了一个sqoop实际问题得处理过程,然后延申到完整得hadoop日志得处理过程。非常具体实用。

    大数据开发中的Sqoop学习笔记(自己整理版).pdf

    从hive导出到mysql; Sqoop中的Job任务使用;使用Job任务实现增量导入;从mysql导入hdfs可以指定在hdfs上存储格式等等内容。 希望对有需要的朋友有所帮助,如有疑问,可以私信;整理不易,多多支持!

    spark大作业.zip

    使用Spark框架进行网站用户购物分析 ...4、使用Sqoop将数据从Hive导入MySQL 5、使用Sqoop将数据从MySQL导入HBase 6、使用HBase Java API把数据从本地导入到HBase中 7、使用R对MySQL中的数据进行可视化分析

    3、Sqoop导出(HDFS到RMDB-mysql)

    3、Sqoop导出(HDFS到RMDB-mysql) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130573318 介绍通过sqoop将hdfs数据同步到关系型数据库mysql中

    Sqoop企业级大数据迁移方案全方位实战视频教程

    数据导入数据仓库Hive 4.基于复杂条件实现数据导入 5.基于订单案例实现Increment增量同步数据 6.基于订单案例实现lastModified增量同步导入数据 7.数据导入原理详解 第三章:Sqoop数据导出实战开发 1.Sqoop...

    sqoop安装详解以及sqoop介绍

    sqoop:是一个工具,主要用于导入导出,实现MySQL到Hadoop之间数据的转换 2、导入数据:从结构化数据(Mysql,oracle,db2,)导入到半结构化或非结构化hadoop中(HDFS、HIVE、HBASE) 3、导出数据:从haoop中将数据...

    Apache Hadoop---Sqoop.docx

    Sqoop可以将一个关系型数据库(例如MySQL、Oracle、PostgreSQL等)中的数据导入Hadoop的HDFS、Hive中,也可以将HDFS、Hive中的数据导入关系型数据库中。Sqoop充分利用了Hadoop的优点,整个数据导入导出过程都是用...

    大数据-sqoop.pptx

    从 Hive 或 HBase 将数据提取至 HDFS (作为文本或 Avro 文件) 使用 Sqoop 将上一步的输出导出至 RDBMS 不支持按照与 Sqoop 1 相同的解决方法操作 大数据-sqoop全文共16页,当前为第5页。 Sqoop的用途 Sqoop可以在...

    sqoop工具_202006041735481.docx

    Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行...Sqoop 还能够将 DB2 数据库的数据导入到 HDFS 上,并保存为 多种文件类型。常见的有定界文本类型,Avro 二进制类型以及 Sequence Files 类型。

    Sqoop同步数据命令

    可以使用Sqoop将数据从MySQL或Oracle等关系数据库管理系统(RDBMS)导入Hadoop分布式文件系统(HDFS),在Hadoop MapReduce中转换数据,然后将数据导出回RDBMS,在不使用ETL工具情况下使用sqoop是迁移数据的一个方案...

    大数据分析-网站日志数据文件(Hadoop部署分析资料)

    本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚...使用Sqoop把Hive产生的统计结果导出到mysql中; 两个日志文件,一共有200MB,符合大数据量级,可以作为推荐系统数据集和hadoop测试集。

    大数据运维技术第9章 Sqoop组件安装配置.pptx

    它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。Sqoop由Apache软件基金会提供。;9.2 Sqoop功能应用;9.2.1 Sqoop架构;;;;9.2.2 Sqoop导入原理; JDBC的ResultSet...

    HIVE实战项目-Youtube视频网站常规指各项标

    包含了idea代码关于使用mapreduce清洗数据,以及上传数据到HDFS。 包含了hive创表以及sqoop导出数据到MySQL。

Global site tag (gtag.js) - Google Analytics