大数据(3j)Sqoop生产经验
Posted 小基基o_O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据(3j)Sqoop生产经验相关的知识,希望对你有一定的参考价值。
增量同步遇到的坑
- 上游(业务系统)手动导入数据,导入的时间使用了历史时间而不是插入时间
并行度
-
Sqoop的底层运行任务是MR中的Map,没有Reduce,默认4个MapTask
-
数据导入时,建议并行度设为1:
--num-mappers 1
并行度>1时,会产生多个文件 -
数据量较大时,可以增加并行度,并指定切分的键:
--split-by
列式存储导出问题
-
问题描述:
- 数仓表采用列式存储,Sqoop导出时可能出问题 解决方案:
-
1、ads层数据量不多,不采用列式存储(首选)
2、创建 常规存储的 临时表,再导出
Sqoop数据导出一致性问题
-
场景:
- Sqoop导出HIVE到mysql时,使用4个MapTask,过程中有2个任务失败,导致MySQL中存储了另外两个Map任务导入的数据 原因:
- Sqoop将导出过程分解为多个事务 解决方案:
-
添加
--staging-table
选项,指定表名
(是个辅助表),使阶段数据在单个事务中移动到目标表
--staging-table 用于辅助的表名 \\
--clear-staging-table \\
上游业务系统数据库按月分表
- sqoop的Python脚本设置动态表名即可
from datetime import date, timedelta
# 今天
today = date.today()
# 上个月最后一天
last_day_of_last_month = today - timedelta(days=today.day)
# 上个月
month = last_day_of_last_month.month
# 上个月最后一天所在年份
year = last_day_of_last_month.year
# 年月
ym = '%4d%2d' % (year, month)
print(ym)
# 动态表名
tb_name = TB_NAME + ym
上游表字段变更管理
变更日期 | 库 | 库名 | 表名 | 变更操作 | 变更字段 | 是否要修改Sqoop任务 |
---|---|---|---|---|---|---|
2021-10-24 | MySQL | b1 | t1 | 删除字段 | f5 | 是 |
2021-10-24 | MySQL | b1 | t2 | 增加字段 | f3,f4 | 是 |
… |
以上是关于大数据(3j)Sqoop生产经验的主要内容,如果未能解决你的问题,请参考以下文章