使用sqoop将数据定时从hive表导入MySQL,采坑问题日记

本文分享了一个将Hive表数据定时导入MySQL的Shell脚本案例,包括详细步骤与常见错误解决方案,适用于大数据处理场景。

使用sqoop将数据定时从hive表导入MySQL。

话不多说,先上脚本:

#!/bin/sh
#********************************************************************************
#********************************************************************************
#reload env

#当前目录路径
mysqldhome_hostname="172.28.65.133"
mysqldhome_username="root"
mysqldhome_password="xxxxx"
mysqldhome_port="3306"
mysqldhome_dbname="recom_video"

#hive表名
hive_table1=t_dwa_hot_result_ad
#mysql表名
mysql_table=t_st_video_hot_ad
echo "......mysql_table = "$mysql_table".......hive_table1 = "$hive_table1

# 取得系统当前时间
sys_time=$(date "+%Y%m%d%H%M")
echo "...sys_time = "$sys_time

# 取得输入日期
#op_day=${last_day}
#echo "op_day="$op_day
#dt_month=`date | awk '{print $2}'`  #当期日期月份
#op_day="20200611"
op_day=`date -d '-1 days' +%Y%m%d`

# 清mysql
mysql -h$mysqldhome_hostname -P$mysqldhome_port -u$mysqldhome_username -p$mysqldhome_password -D$mysqldhome_dbname -e "
DELETE FROM $mysql_table;
"
echo "delete mysql data success...."

touch ${mysql_table}_temp_$op_day
/usr/bin/hive -e "
use recommend_video;
set hive.execution.engine=mr;
set hive.fetch.task.conversion=none;
select
  cast(video_id as BIGINT) as video_id,
  cast(watch_user as int) as watch_user,
  cast(max_watch_user as int) as max_watch_user,
  cast(coalesce(sum_finish_score ,'0.0') as decimal(15,4)) as sum_finish_score,
  cast(cnt_finish_score as int) as cnt_finish_score,
  cast(coalesce(favor_cnt,'0') as int) as favor_cnt,
  cast(coalesce(max_favor_cnt,'0') as int) as max_favor_cnt,
  cast(coalesce(hot_score,'0.0') as decimal(15,4)) as hot_score,
  create_time as shelf_time,
  from_unixtime(unix_timestamp()) as create_time,
  from_unixtime(unix_timestamp()) as update_time
from ${hive_table1} 
where dayid = "$op_day";" | grep -vi '^warn\|data' >  ${mysql_table}_temp_$op_day

echo "...select hive data success.... save in file:"${mysql_table}_temp_$op_day
echo "...dayid = "$op_day" "

/usr/bin/hadoop fs -put ${mysql_table}_temp_$op_day /tmp/
rm -rf ${mysql_table}_temp_$op_day
echo "put file to hdfs, and del file in local path..."

hdfs_temp='/tmp/'$mysql_table'_temp_'$op_day
encoding="?useUnicode=true&characterEncoding=utf-8"

echo "...sqoop script start..."
/usr/bin/sqoop export --connect jdbc:mysql://$mysqldhome_hostname:$mysqldhome_port/$mysqldhome_dbname$encoding \
--username $mysqldhome_username \
--password $mysqldhome_password \
--table $mysql_table \
--fields-terminated-by '\t' \
--input-fields-terminated-by '\t' \
--export-dir $hdfs_temp \
--columns video_id,watch_user,max_watch_user,sum_finish_score,cnt_finish_score,favor_cnt,max_favor_cnt,hot_score,shelf_time,create_time,update_time
echo "...sqoop script end..."

/usr/bin/hadoop fs -rm -r $hdfs_temp
echo "rm hdfs tmp file..."
echo "......task end......"

exit 0

 

 

注意事项:

1、请各个执行命令前使用全路径!

如,/usr/bin/hive -e,/usr/bin/hadoop fs,/usr/bin/sqoop等。

PS:该脚本是将hive数据导到本地,在导入hdfs文件上面,再通过sqoop插入MySQL。参考网上的方法,应该可以直接将hive表中的数据读取导入到mysql,有兴趣的同学可以尝试下。

附上MySQL数据表:

CREATE TABLE `t_st_video_hot_ad` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID,主键',
  `video_id` bigint(20) NOT NULL COMMENT '视频ID',
  `watch_user` bigint(15) NOT NULL COMMENT '当前视频观看次数',
  `max_watch_user` bigint(15) NOT NULL COMMENT '最大视频观看次数',
  `sum_finish_score` decimal(10,4) NOT NULL COMMENT '完播率分子/加和',
  `cnt_finish_score` bigint(15) NOT NULL COMMENT '完播率分母/次数',
  `favor_cnt` bigint(15) NOT NULL COMMENT '当前视频点赞次数',
  `max_favor_cnt` bigint(15) NOT NULL COMMENT '最大视频点赞次数',
  `hot_score` decimal(8,4) DEFAULT NULL COMMENT '热度得分',
  `shelf_time` varchar(50) NOT NULL COMMENT '上架时间',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_video_id` (`video_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

添加crontab定时任务脚本:

00 14 * * * sh /data/xh/test/t_st_video_hot_ad.sh >> /data/xh/test/video_hot_log.log 2>&1

 

贴一下调测过程中遇到的错误:

1、JAVA_HOME环境变量找不到:

解决办法:将变量重新在/etc/hadoop/conf/hadoop-env.sh中声明一下。

如:export JAVA_HOME=/data/jdk1.8.0_171

 

2、Export job failed。。。被这个问题困了好久。

其实通过查看Hadoop的yarn日志,可以很容易定位到错误原因。

 

通过查看中间导出的数据发现,多了一行字符串文字:

解决办法:执行hive,hdfs等命令请使用全路径!上面已提到!

 

完结!!!

 

### 使用 Sqoop数据Hive 导入MySQL 的解决方案 在大数据处理领域,Sqoop 是一个常用的工具,用于在关系型数据库(如 MySQL)和 Hadoop 生态系统(如 Hive)之间传输数据。然而,Sqoop 本身并不直接支持从 Hive 导入数据MySQL 的功能,但可以通过一些间接方法实现这一目标。 以下是实现 SqoopHive 数据导出MySQL 的详细指南: --- #### 1. 确保环境配置正确 在开始之前,请确保以下环境变量已正确配置: ```bash export PATH=$ZOOKEEPER_HOME/bin:$SPARK_HOME/bin:$HIVE_HOME/bin:/bigdata/hadoop/bin:$SQOOP_HOME/bin:$PATH ``` 这一步确保了所有必要的工具路径都被正确加载[^5]。 --- #### 2. 将 Hive 中的数据导出到 HDFS 由于 Sqoop 不直接支持从 Hive 导出数据MySQL,因此需要先将 Hive 数据导出到 HDFS。可以使用以下命令完成此操作: ```bash hive -e "INSERT OVERWRITE DIRECTORY '/path/to/hdfs/export' SELECT * FROM hive_table;" ``` 这会将 Hive 中的数据以文本文件的形式存储到指定的 HDFS 路径中。 --- #### 3. 使用 Sqoop 导出 HDFS 数据MySQL 接下来,使用 Sqoop 将 HDFS 中的数据导入MySQL。以下是示例命令: ```bash $SQOOP_HOME/bin/sqoop export \ --connect "jdbc:mysql://<mysql_host>:<mysql_port>/<mysql_database>?useUnicode=true&characterEncoding=utf-8" \ --username <mysql_username> \ --password <mysql_password> \ --table <mysql_table_name> \ --export-dir /path/to/hdfs/export \ --input-fields-terminated-by '\t' \ --update-mode allowinsert \ --update-key <primary_key_column> \ --input-null-string '\\N' \ --input-null-non-string '\\N' ``` **参数说明:** - `--connect`: 指定 MySQL 数据库的连接字符串。 - `--username` 和 `--password`: 指定 MySQL 用户名和密码。 - `--table`: 指定要导入MySQL 名称。 - `--export-dir`: 指定 HDFS 中包含数据的目录。 - `--input-fields-terminated-by`: 指定字段分隔符,通常为 `\t`。 - `--update-mode`: 指定更新模式,`allowinsert` 允许插入新记录或更新现有记录。 - `--update-key`: 指定主键列,用于判断是否需要更新记录。 - `--input-null-string` 和 `--input-null-non-string`: 指定如何处理 NULL 值。 --- #### 4. 处理异常问题 如果在导出过程中遇到异常,可以参考以下解决方案: - **字段不匹配问题**: 如果 Hive MySQL 的字段类型或数量不一致,可以使用 `--columns` 参数指定需要导出的字段列[^4]。 - **NULL 值处理问题**: 确保正确设置了 `--input-null-string` 和 `--input-null-non-string` 参数,以避免因 NULL 值导致的错误。 --- #### 5. 示例代码 以下是一个完整的示例,展示如何将 Hive 中的数据导出MySQL : ```bash # Step 1: 将 Hive 数据导出到 HDFS hive -e "INSERT OVERWRITE DIRECTORY '/user/hive/export_data' SELECT * FROM hive_table;" # Step 2: 使用 Sqoop 将 HDFS 数据导入MySQL $SQOOP_HOME/bin/sqoop export \ --connect "jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password password \ --table mysql_table \ --export-dir /user/hive/export_data \ --input-fields-terminated-by '\t' \ --update-mode allowinsert \ --update-key id \ --input-null-string '\\N' \ --input-null-non-string '\\N' ``` --- ### 注意事项 - 如果 Hive 中有复杂的数据类型(如数组、映射等),可能需要先将其转换为简单的文本格式再进行导出[^4]。 - 在大规模数据场景下,建议调整 `--num-mappers` 参数以优化性能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值