sqoop优化

Kakfa是如何保证分区内有序的?

两种方案:

方案一,kafka topic 只设置一个partition分区

方案二,producer将消息发送到指定partition分区

方案一:kafka默认保证同一个partition分区内的消息是有序的,则可以设置topic只使用一个分区,这样消息就是全局有序,缺点是只能被consumer group里的一个消费者消费,降低了性能,不适用高并发的情况

方案二:既然kafka默认保证同一个partition分区内的消息是有序的,则producer可以在发送消息时可以指定需要保证顺序的几条消息发送到同一个分区,这样消费者消费时,消息就是有序。

producer发送消息时具体到topic的哪一个partition分区,提供了三种方式

1)指定分区

2)不指定分区,有指定key 则根据key的hash值与分区数进行运算后确定发送到哪个partition分区

3)不指定分区,不指定key,则轮询各分区发送

Sqoop优化

  1. 空值问题

HIve底层的nulll是以“/N”来存储,而mysqlNull底层就是Null,这就导致存储不一致问题。在同步时必须保证两段的数据格式、数据类型。

方案一:建表时修改hive的底层存储

在hive导出时,给需要导出的表创建一张临时表,该表和Mysql同步的表、字段、类型等严格一致,将需要导出的数据插入到该表中,在建立该临时表的时候将hive中Null底层存储“/N”修改为''(空串)

sqoop数据一致性问题

如Sqoop在导出到Mysql时,使用4个Map任务,过程中有2个任务失败,那此时MySQL中存储了另外两个Map任务导入的数据,此时老板正好看到了这个报表数据。而开发工程师发现任务失败后,会调试问题并最终将全部数据正确的导入MySQL,那后面老板再次看报表数据,发现本次看到的数据与之前的不一致,这在生产环境是不允许的

--staging-table方式

建立临时表,必须保证我所有的map任务都成功才会进入临时表,在进入mysql,只有“全部成功和全部失败

方案二:只设置一个map数,我就不用再去调整

一般情况下,500W一下设置4个maptask

500W以上设置8个,太多会造成数据库加压,造成我其他性能的降低

(3)ADS层数据向Mysql同步数据存储为orc或parquet问题

 Sqoop导出时,如果导出的表存储为orc或parquet就会报错

建议tmp表对接mysql的改成默认texfile形式

  修改 tmp表成原来的textfile形式执行成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值