避免在分布式模式下使用HDFS连接器接收器从Kafka连接中获取小文件

时间:2018-07-03 15:15:53

标签: apache-kafka hdfs kafka-producer-api apache-kafka-connect confluent

我们有一个主题,其中消息以3个分区的速度以每秒1msg的速度传输,我正在使用HDFS连接器以AVRo格式(默认)将数据写入HDFS,它生成的文件大小为KBS,因此我尝试更改HDFS属性中的以下属性。

“ flush.size”:“ 5000”, “ rotate.interval.ms”:“ 7200000”

但是输出仍然是小文件,因此,我需要在以下方面进行说明以解决此问题:

  1. 是否必须具有flush.size属性,以防万一,如果我们不提及flus.size属性,该如何刷新数据?

  2. 如果我们提到刷新大小为5000且旋转间隔为2小时,则它会在前3个间隔中每2小时刷新一次数据,但之后会随机刷新数据,请查找文件的时间创建( 19:14,21:14,23:15, 01:15,06:59,08:59 ,12:40,14:40)-突出显示了不匹配的时间间隔。提到的财产超支?将我带到第三个问题。

  3. 如果我们提到以下所有属性(flush.size,rotate.interval.ms,rotate.schedule.interval.ms),则对flush的偏好是什么?

  4. 提高msg速率并减少分区实际上表明正在刷新的数据大小有所增加,这是控制小文件的唯一方法,如果输入事件的速率是变化的并且不稳定?

如果您可以在使用HDFS连接器的kafka connect中共享有关处理小文件的文档,将对您有很大帮助。

1 个答案:

答案 0 :(得分:0)

如果您使用的是TimeBasedPartitioner,并且消息的时间戳不会一直增加,那么当它看到单个消息的时间戳小于{{1 }}读取任何给定的记录。

如果要具有一致的每两小时一次的分区窗口,则应使用rotate.interval.ms禁用它,然后使用rotate.interval.ms=-1将其设置为分区持续时间窗口内的某个合理数字。

例如您每2小时就会收到7200条消息,目前尚不清楚每条消息有多大,但是假设有1MB。然后,您将在缓冲区中保存约7GB的数据,并且需要调整Connect堆大小以容纳这么多的数据。

开始顺序为

  1. 排定的轮换,从小时的顶部开始
  2. 刷新大小或“基于消息的”时间轮换,以先到者为准,或者有记录被视为当前批处理开始之前“

我相信对于存储连接器来说,齐平尺寸是必不可少的


总体而言,诸如Uber的Hudi或以前的Camus Sweeper的Kafka-HDFS工具之类的系统都具有处理小文件的能力。 Connect Sink Tasks只关心从Kafka消费数据并写入下游系统。框架本身无法识别Hadoop喜欢较大的文件。