这篇文章主要在上一篇文章的基础上讲一下 如何自定义flume到kafka的分区
上一节中从下面的地址下载了一个源码
https://github.com/beyondj2ee/flumeng-kafka-plugin/tree/master/
我们只是从中获取了jar包。这次我们就利用下载的源码去自定义分区
把源码通过mvn eclipse:eclipse 转变为普通java项目 导到eclipse中 结构如上图
上节讲的SimglePartition已经标出,源码如下
public class SinglePartition implements Partitioner<String> {
private static final Logger LOGGER = LoggerFactory.getLogger(SinglePartition.class);
public SinglePartition(VerifiableProperties props) {
}
@Override
public int partition(String key, int numberOfPartions) {
return 0;
}
}
我们把这个文件复制 改名为ManyPartition 修改源码中绿线标示的位置 即可
我的修改源码如下
public class ManyPartition implements Partitioner<String> {
// - [ constant fields ] ----------------------------------------
/**
* The constant LOGGER.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(ManyPartition.class);
private int count = 0;
public ManyPartition(VerifiableProperties props) {
}
@Override
public int partition(String key, int numberOfPartions) {
return new Random().nextInt(numberOfPartions);
}
}
然后通过 mvn clean package 重新编译 会重新生成flumeng-kafka-plugin.jar 然后把此jar包替换flume/lib/下的同名jar包就可使用自定义分区类
而上一节中提到的配置文件中的producer.sinks.r.partition.key=4 实际上没有多大的作用
他对应源码中KafkaSink类的process()方法中的代码 入下图标出所示
实际传入不传入这个partititonId没有任何区别 因为即使传入ParitionId 也是一个固定值 因此没有办法依照这个Id进行分区