我们有一个主题,其中消息以3个分区的速度以每秒1msg的速度传输,我正在使用HDFS连接器以AVRo格式(默认)将数据写入HDFS,它生成的文件大小为KBS,因此我尝试更改HDFS属性中的以下属性。
“ flush.size”:“ 5000”, “ rotate.interval.ms”:“ 7200000”
但是输出仍然是小文件,因此,我需要在以下方面进行说明以解决此问题:
是否必须具有flush.size属性,以防万一,如果我们不提及flus.size属性,该如何刷新数据?
如果我们提到刷新大小为5000且旋转间隔为2小时,则它会在前3个间隔中每2小时刷新一次数据,但之后会随机刷新数据,请查找文件的时间创建( 19:14,21:14,23:15, 01:15,06:59,08:59 ,12:40,14:40)-突出显示了不匹配的时间间隔。提到的财产超支?将我带到第三个问题。
如果我们提到以下所有属性(flush.size,rotate.interval.ms,rotate.schedule.interval.ms),则对flush的偏好是什么?
提高msg速率并减少分区实际上表明正在刷新的数据大小有所增加,这是控制小文件的唯一方法,如果输入事件的速率是变化的并且不稳定?
如果您可以在使用HDFS连接器的kafka connect中共享有关处理小文件的文档,将对您有很大帮助。
答案 0 :(得分:0)
如果您使用的是TimeBasedPartitioner,并且消息的时间戳不会一直增加,那么当它看到单个消息的时间戳小于{{1 }}读取任何给定的记录。
如果要具有一致的每两小时一次的分区窗口,则应使用rotate.interval.ms
禁用它,然后使用rotate.interval.ms=-1
将其设置为分区持续时间窗口内的某个合理数字。
例如您每2小时就会收到7200条消息,目前尚不清楚每条消息有多大,但是假设有1MB。然后,您将在缓冲区中保存约7GB的数据,并且需要调整Connect堆大小以容纳这么多的数据。
开始顺序为
我相信对于存储连接器来说,齐平尺寸是必不可少的
总体而言,诸如Uber的Hudi或以前的Camus Sweeper的Kafka-HDFS工具之类的系统都具有处理小文件的能力。 Connect Sink Tasks只关心从Kafka消费数据并写入下游系统。框架本身无法识别Hadoop喜欢较大的文件。