sqoop export 到mysql踩得巨坑。。

本文介绍了使用sqoop将数据从Hive导出到MySQL的过程,强调了需要预先在MySQL中创建表,明确Hive表在HDFS中的位置,并启动MapReduce History Server以查看报错日志。特别注意MapReduce日志对于排查错误的重要性,以及正确配置字段分隔符和行终止符。

首先把修正后的脚本放出来,然后在说说踩得那些坑!

可以直接下滑到中间从看特别注意开始看。

sqoop export 脚本:

/home/huser/sqoop-1.4.7/bin/sqoop export --connect "jdbc:mysql://localhost9:3306/analysisuseUnicode=true&characterEncoding=
utf-8" \
--username mysql \
--password Pass2020 \
--table tmp_dws_visit_source \
--columns days,visitSourceType,visitSource \
--input-fields-terminated-by '^A' \
--input-lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--export-dir "hdfs://hadooprt:9000/user/hive/warehouse/rt1.db/dws_visit_source/everyday=2020-08-06/" \
-m 1;

mysql创建表脚本:

#!/bin/bash
everyday="2020-08-06"
sql=$(cat << !EOF

use database;
drop table dws_visit_source;
create table if not exists dws_visit_source(
days string,
visitSourceType string,
visitSource string
)
partitioned by (everyday string)
row format delimited
fields terminated by '^A'
lines terminated by '\n'
stored as textfile;

insert into table dws_visit_source partition(everyday='$everyday1')
select everyday,visitSourceType,visitSource 
from cr_t_test08 where everyday='$everyday' group by visitSourceType,visitSource;

exit;

!EOF)
$HIVE_HOME/bin/hive -e "$sql"
exitCode=$?
if [ $exitCode -ne 0 ];then
         echo "[ERROR] hive execute failed!" >> tmplog.txt
         exit $exitCode
fi

mysql数据库字符设置:

 alter database analysis character set utf8 collate utf8_general_ci;

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

注意事项:

sqoop 导出hive到mysql,需要mysql中创建好表:

 

sqoop导出hive表,需要知道表在hdfs中的位置,指定的是hive表在文件中的路径:

--export-dir "hdfs://hadooprt:9000/user/hive/warehouse/rt1.db/dws_visit_source/everyday=2020-08-06/" \

查询hive表的存储位置:

show create table dws_visit_source;

 

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

特别注意:如果用sqoop导出导入数据,需要把MapReduce History server启动起来,方便查看报错日志,启动命令:

$HADOOP_HOME/sbin/mr-jobhistory-deamon.sh start historyserver

查看网页:http://hadoop(主机名或IP地址):18088/cluster

 

就可以查看详细日志了。 

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

如果日志中有如下类似报错,需要查看几处地方:

       

 检查位置:

最先检查的一点:hive的文件存储格式!

Sqoop  从hdfs 同步数据到mysql,hive 中的表 必须是textfile 。我就是这个问题,一开始设置的orc,导出找问题改改改,一天以后,发现的这个,然后成功导入数据╮(╯▽╰)╭

sqoop导出脚本中的--input-fields-terminated-by和创建hive表时的fields terminated by '^A'是不是一致的分隔符!
sqoop export 中是否设置了--input-null-string '\\N' \ --input-null-non-string '\\N' \
sqoop export导出字段是否和mysql字段存在错位,如果有错位,可能报错数据转换异常数据太长异常
如果导入数据了,但是mysql中中文乱码,加 useUnicode=true&characterEncoding=utf-8" \

注意 ^A 一定是手动 Ctrl+v+A 敲上去的,刚刚试验了,复制的都偶尔不好使。╮(╯▽╰)╭

create table if not exists dws_visit_source(
days string,
visitSourceType string,
visitSource string
)
partitioned by (everyday string)
row format delimited
fields terminated by '^A'
lines terminated by '\n'
stored as textfile;--注意,很重要

 

/home/huser/sqoop-1.4.7/bin/sqoop export --connect "jdbc:mysql://localhost:3306/analysis?useUnicode=true&characterEncoding=utf-8" \
--username mysql \
--password Pass2020 \
--table tmp_dws_visit_source \
--columns days,visitSourceType,visitSource \
--input-fields-terminated-by '^A' \
--input-lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \

--export-dir "hdfs://hadooprt:9000/user/hive/warehouse/rt1.db/dws_visit_source/everyday=2020-08-06/" \
-m 1;

 

### 问题分析与解决方法 在使用 Sqoop 导出数据到 MySQL 的过程中,如果任务长时间处于运行状态(卡住),可能是由于多种原因导致的。以下是可能的原因及解决方案: #### 1. 数据量过大 当导出的数据量非常大时,Sqoop 可能会因为内存不足或网络延迟而卡住。可以通过调整 `--num-mappers` 参数来优化性能[^1]。默认情况下,Sqoop 使用单个 mapper 来处理数据导出操作,这可能会导致性能瓶颈。 ```bash sqoop export \ --connect "jdbc:mysql://172.16.xxx.xxx:3306/dbname?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password password \ --table target_table \ --export-dir /path/to/hdfs/data \ --num-mappers 4 ``` 通过增加 `--num-mappers` 的值,可以并行化导出过程,从而提高效率和减少卡住的可能性。 #### 2. 数据类型不匹配 如果 HDFS 中的数据格式与 MySQL 表中的字段定义不匹配,可能会导致任务卡住或失败。例如,某些字段的长度超出 MySQL 表中定义的长度限制,将引发 `DataTruncation` 异常[^2]。 解决方案是检查 HDFS 数据文件的内容,并确保其与目标 MySQL 表的字段类型一致。例如,对于字符串类型的字段,确保 HDFS 中的值不会超过 MySQL 表中定义的最大长度。 #### 3. JDBC 驱动版本不兼容 MySQL 的 JDBC 驱动版本可能与 MySQL 数据库版本不兼容,这可能导致连接问题或任务卡住。建议使用与 MySQL 版本匹配的最新 JDBC 驱动程序。 下载并替换正确的驱动程序后,重新运行 Sqoop 命令: ```bash export CLASSPATH=$CLASSPATH:/path/to/mysql-connector-java-x.x.x.jar ``` #### 4. 网络连接问题 如果 SqoopMySQL 数据库之间的网络连接不稳定,可能会导致任务卡住。可以通过以下方式排查: - 检查 MySQL 数据库的网络带宽和延迟。 - 在 Sqoop 客户端上测试与 MySQL 的连接是否正常: ```bash mysql -h 172.16.xxx.xxx -u root -p ``` #### 5. 日志分析 如果任务卡住,查看 SqoopMySQL 的日志文件可以帮助定位问题。通常,日志中会包含具体的错误信息或警告提示。 Sqoop 日志路径通常位于 `/var/log/sqoop/` 或 `$SQOOP_HOME/logs/` 中。MySQL 的错误日志路径可以通过以下命令查询: ```sql SHOW VARIABLES LIKE 'log_error'; ``` #### 6. MySQL 配置问题 MySQL 的配置参数可能会影响 Sqoop 导出任务的性能。例如,`innodb_buffer_pool_size`、`max_allowed_packet` 等参数设置不当可能会导致任务卡住。 调整 MySQL 配置文件(通常是 `my.cnf` 或 `my.ini`)中的相关参数: ```ini [mysqld] innodb_buffer_pool_size = 4G max_allowed_packet = 128M ``` 然后重启 MySQL 服务以应用更改。 --- ### 示例代码 以下是一个完整的 Sqoop 导出命令示例,结合了上述优化建议: ```bash sqoop export \ --connect "jdbc:mysql://172.16.xxx.xxx:3306/dbname?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password password \ --table target_table \ --export-dir /path/to/hdfs/data \ --input-fields-terminated-by ',' \ --num-mappers 4 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值