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,问题解决。

posted @ 2021-01-07 23:18  Christine_7  阅读(1141)  评论(0编辑  收藏  举报