利用sqoop将hive数据导入导出数据到mysql

本文介绍了如何使用 Sqoop 在 MySQL 和 Hadoop/Hive 之间进行数据迁移,包括配置环境、安装 Sqoop、基本操作及解决常见错误的方法。

运行环境  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

 

 

 

使用 SqoopHive 数据导出到 MySQL 的过程中,如果在 **reduce 阶段**出现错误,通常与数据类型不匹配、JDBC 驱动缺失或配置问题有关。以下是对该问题的详细排查和解决建议。 ### 1. 检查 JDBC 驱动是否正确安装 Sqoop 依赖 JDBC 驱动与关系型数据库通信。确保 MySQLJDBC 驱动(如 `mysql-connector-java-5.1.15-bin.jar`)已复制到 Sqoop 的 `lib` 目录中: ```bash sudo cp /usr/lib/hive/lib/mysql-connector-java-5.1.15-bin.jar /usr/lib/sqoop/lib/ ``` 若驱动未正确放置,Sqoop 在运行时将无法找到类,从而导致任务失败[^1]。 ### 2. 数据类型兼容性检查 Hive 中的数据类型可能与 MySQL 表结构不兼容。例如,Hive 的 `string` 类型字段尝试插入 MySQL 的 `int` 或 `date` 字段时会引发异常。建议执行如下操作: - 使用 `DESCRIBE <hive_table>` 查看 Hive 表结构。 - 使用 `DESCRIBE <mysql_table>` 查看 MySQL 表结构。 - 确保字段顺序和类型一致,必要时使用 `--map-column-java` 参数显式映射 Java 类型。 示例命令: ```bash sqoop export \ --connect jdbc:mysql://localhost/db \ --username root \ --password password \ --table mysql_table \ --export-dir /user/hive/warehouse/hive_table \ --input-fields-terminated-by '\001' \ --map-column-java id=Integer,name=String ``` ### 3. 分区键选择与性能优化 默认情况下,Sqoop 使用主键作为分区键进行并行处理。如果没有主键,或主键不适合做分区键(如分布不均),可能导致 reduce 阶段性能下降甚至失败。 解决方案包括: - 显式指定用于分区的列:`--split-by <column>` - 减少并发任务数以降低资源争用:`-m 1` 强制单任务运行 ### 4. 日志分析与调试信息 查看 Hadoop JobTracker 页面或 YARN 日志输出,定位具体失败的 reduce task,并检查其详细日志。常见错误包括: - `java.lang.ClassNotFoundException`: 表明缺少驱动或类路径未设置正确。 - `Data truncation` 或 `Incorrect string value`: 表示数据长度或编码不匹配。 - `Deadlock found when trying to get lock`: 表示数据库并发写入冲突。 ### 5. 调整批处理参数 MySQL 对批量插入有一定限制,可通过以下方式调整: - 设置每次提交记录数:`--batch` - 调整批处理大小(需 MySQL JDBC 支持): ```bash -Doracle.jdbc.batch.performanceOptimization=true ``` ### 6. 启用 Sqoop 的调试模式 通过添加 `--verbose` 参数运行 Sqoop 命令,可以获取更详细的日志信息,有助于快速定位问题。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值