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优化
- 空值问题
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形式执行成功。