Sqoop导出Hive数据到Mysql
1 需求描述
Hql统计出热搜关键词,使用Sqoop将结果从Hive导出到Mysql,其中关键字是中文,需要注意建表语句和Sqoop导出参数的设置。这里记录整个导出过程及遇到问题如何排查解决。
2 Sqoop导出Hive数据到Mysql
2.1 Mysql建表
create table if not exists keyword_seach(
dt varchar(30) not null,
keyword varchar(255) not null,
count varchar(30) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
这里需要特别注意,Hive结果表results中keyword是中文,建表语句需要添加CHARSET=utf8mb4 COLLATE=utf8mb4_bin
,否则报错 Incorrect string value: '\xF0\xA4\xA3\xB3\xE5\xB0...' for column 'keyword' at row 39
。
2.2 Sqoop导出脚本
sqoop_export.sh
#!/bin/bash
sudo -uhdfs sqoop export \
--connect \
"jdbc:mysql://IP:3306/database?useUnicode=true&characterEncoding=utf8" \
--username 'database' \
--password 'password' \
--table keyword_seach \
--export-dir /user/hive/warehouse/database1.db/results \
--num-mappers 1 \
--input-fields-terminated-by '\001' \
--input-null-string '\\N' \
--input-null-non-string '\\N'
导出数据包括中文,需要添加useUnicode=true&characterEncoding=utf8
。
2.3 执行Sqoop脚本
这里主要记录执行脚本过程中的报错及排查,第一次执行后报错权限不够
//查看权限
sudo -uhdfs hadoop fs -ls /tmp
//修改权限
sudo -uhdfs hadoop fs -chown -R root:root /tmp
第二次执行报错发现mysql表设置了主键,Sqoop向mysql导数据,主键冲突导致的,这篇博客给出了解决办法跳转。
第三次执行报错,记录一下过程。
(1) 查看日志
找到application_XXXXX,开始排查错误
yarn logs -applicationId application_1593700350483_58776 //执行 查日志
(2)解决问题
查看日志后,发现如下报错
Caused by: java.io.IOException: java.sql.SQLException: Incorrect string value: '\xF0\xA4\xA3\xB3\xE5\xB0...' for column 'keyword' at row 39
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:233)
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:46)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:670)
at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:89)
... 10 more
从日志发现就是上面反复提到的建表语句中文问题,建表语句增加CHARSET=utf8mb4 COLLATE=utf8mb4_bin
,Sqoop增加添加useUnicode=true&characterEncoding=utf8
,问题解决。