Apache Ignite(五):Ignite和Kafka集成-实现高可扩展和高可靠的数据处理

我与影子孤独终老i 提交于 2019-12-03 19:44:21

这两者都具有高可扩展性和高可靠性,本文将说明如何集成Apache Ignite和Apache Kafka消息系统,以获得一个健壮的数据处理管道。目前,这两者的集成有两个开箱即用的解决方案,一个是KafkaStreamer,一个是IgniteSinkConnector,其中IgniteSinkConnector是基于Apache Kafka最近发布的新特性-Kafka连接器

1.通过KafkaStreamer注入数据

从Ignite 1.3版本开始,通过他的KafkaStreamer,支持从Kafka中获取数据,然后将其注入Ignite用于基于内存的数据处理。KafkaStreamer是IgniteDataStreamer的一个实现,他会使用Kafka的消费者从Kafka代理中拉取数据,然后将数据高效地注入Ignite缓存。 要使用它,首先,需要将KafkaStreamer依赖加入pom.xml文件:

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-kafka</artifactId>
    <version>${ignite.version}</version>
</dependency>

假设已经有一个缓存,键和值都是String类型,通过一个简单的方式就能实现数据的流化处理:

KafkaStreamer<String, String, String> kafkaStreamer = new KafkaStreamer<>();

try (IgniteDataStreamer<String, String> stmr = ignite.dataStreamer(null)) {

    // 覆盖已有数据
    stmr.allowOverwrite(true);

    kafkaStreamer.setIgnite(ignite);

    kafkaStreamer.setStreamer(stmr);

    // 设置主题
    kafkaStreamer.setTopic(someKafkaTopic);

    // 设置处理Kafka流进程的线程数
    kafkaStreamer.setThreads(4);

    // 设置Kafka消费者的配置
    kafkaStreamer.setConsumerConfig(kafkaConsumerConfig);

    // 设置解码器
    kafkaStreamer.setKeyDecoder(strDecoder);

    kafkaStreamer.setValueDecoder(strDecoder);
    kafkaStreamer.start();
}finally {
    kafkaStreamer.stop();
}

至于如何配置消费者,可以参考Kafka文档

2.通过IgniteSinkConnector注入数据

Apache Ignite从即将到来的1.6版本开始,将可以通过另一种方式实现数据处理的集成。他基于Kafka连接器,这是一个从Apache Kafka 0.9版本中引入的一个新特性,它在Apache Kafka和其他的数据系统间实现了可扩展和可靠的的流化数据处理。这样的集成可以从Kafka中获得持续且安全的流化数据,然后注入Ignite用于内存中的大规模数据集的计算和事务处理。

连接器位于optional/ignite-kafka,它和它的依赖需要加入一个Kafka运行实例的类路径中。 同时,还需要像下面这样配置连接器:

# connector
name=my-ignite-connector
connector.class=IgniteSinkConnector
tasks.max=2
topics=someTopic1,someTopic2
# cache
cacheName=myCache
cacheAllowOverwrite=true
igniteCfg=/some-path/ignite.xml

其中igniteCfg要设置为Ignite缓存配置文件的路径,cacheName设置为*/some-path/ignite.xml中设置的缓存的名字,someTopic1,someTopic2是数据的来源,cacheAllowOverwrite设置为true*,它会覆盖缓存中的已有数据。 另一个重要的配置是Kafka连接器属性,可以看如下的示例:

bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.storage.StringConverter
key.converter.schemas.enable=false
value.converter.schemas.enable=false
internal.key.converter=org.apache.kafka.connect.storage.StringConverter
internal.value.converter=org.apache.kafka.connect.storage.StringConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000

这时可以启动连接器,比如,在一个独立运行模式中可以这样:

bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connector.properties

3.流程验证

可以通过一个简单的方式,做一下这个流程的基本验证。 启动Zookeeper和Kafka服务:

bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties

因为这个示例只能处理字符串数据,所以只是通过kafka-console-producer注入key1val1(这么做只是为了举例--正常的话需要使用一个Kafka生产者或者数据源头的连接器来注入数据):

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test --property parse.key=true --property key.separator=, key1,val1

然后,按照前述的方法启动连接器。

完成!数据全部注入Ignite缓存,已经可以进行内存内的处理,或者通过SQL查询进行分析(可以参照Apache Ignite文档)。

本文翻译整理自Roman Shtykh的博客

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!