通过Kafka在ignite集群之间进行实时数据复制

版本1.6的ApacheIgnite提供了一种基于KafkaConnect进行数据处理的新方法。Kafka Connect是ApacheKafka 0.9中引入的一个新特性,它支持ApacheKafka和其他数据系统之间的可伸缩和可靠的流数据。它使得在内存中向您的可伸缩和安全的流数据管道中添加新系统变得非常容易。在本文中,我们将研究如何设置和配置IgniteSource连接器,以便在Ignite集群之间执行数据复制。

apache ignite,开箱即用,提供点燃-卡夫卡模块采用三种不同的解决方案(API)来实现健壮的数据处理管道,将数据从/到Kafka主题流到ApacheIgnite。

Image title

简而言之,ApacheIgniteSourceConnector用于订阅Ignite缓存事件并将其流到Kafka主题。换句话说,它可以用于从Ignite缓存导出数据(更改的数据集),并仅使用配置文件将内容写入Kafka主题。点燃源连接器侦听注册的Ignite网格事件(如PUT),并将它们转发到Kafka主题。这使得保存到Ignite缓存中的数据能够很容易地转换为事件流。每个事件流包含一个键和两个值:旧的和新的。

The Apache Ignite book

这篇文章的部分内容摘自这本书。阿帕奇·艾格尼特的书。如果它让你感兴趣,看看书的其余部分,以获得更有帮助的信息。

这,这个,那,那个IgniteSourceConnector对于支持以下用例可能很有用:

  1. 若要在发生缓存事件时自动通知任何客户端,例如,每当有新条目进入缓存时。
  2. 若要使用从Ignite缓存流到1-N目的地的异步事件流,请执行以下操作。目标可以是任何数据库,也可以是另一个Ignite集群。这些使您能够通过Kafka在两个Ignite集群之间进行数据复制。

阿帕奇IgniteSourceConnector与IgniteSinkConnector一起使用的工具,可在ignite-kafka-x.x.x.jar分配。IgniteSourceConnector需要以下配置参数:

Image title

的高级体系结构。IgniteSinkConnector如图1所示。

Figure 1.

在本文中,我们将使用两个IgniteSourceConnectorIgniteSinkConnector对于从一个Ignite集群到另一个Ignite集群的流事件。IgniteSourceConnector将事件从一个Ignite集群(源集群)流到Kafka主题,IgniteSinkConnector将更改从主题流到另一个Ignite集群(目标集群)。我们将演示逐步配置和运行Source和Sink连接器的说明.为了完成Ignite集群之间的数据复制,我们将执行以下操作:

  1. 在一台机器上执行两个独立的Ignite集群。

  2. 在发送到Ignite目标集群之前,开发一个流提取器来解析传入的数据。

  3. 在不同的独立卡夫卡工人中配置并启动IgniteSource和Sink连接器。

  4. 向Ignite源集群中添加或修改某些数据。

在完成所有配置之后,您应该有一个典型的管道,即将数据从一个Ignite集群流到另一个Ignite集群,如图2所示。

Figure 2.

让我们从Ignite集群配置开始。

第一步。我们将在一台机器上启动两个孤立的集群。要做到这一点,我们必须使用另一组TcpDiscoverySpiTcpConfigurationSpi将两个集群分离到一个主机上。因此,对于第一个集群中的节点,我们将使用以下方法TcpDiscoverySpiTcpConfigurationSpi组合:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="peerClassLoadingEnabled" value="true"/>
        <property name="cacheConfiguration">
            <list>
                <!-- Partitioned cache example configuration (Atomic mode). -->
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="myCacheSource"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>
                </bean>
            </list>
        </property>
        <!-- Enable cache events. -->
        <property name="includeEventTypes">
            <list>
                <!-- Cache events. -->
                <util:constant static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT"/>
            </list>
        </property>
<property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <!-- Initial local port to listen to. -->
                <property name="localPort" value="48500"/>
<!-- Changing local port range. This is an optional action. -->
                <property name="localPortRange" value="20"/>
<!-- Setting up IP finder for this cluster -->
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:48500..48520</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
<!--
        Explicitly configure TCP communication SPI changing local
        port number for the nodes from the first cluster.
        -->
        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="48100"/>
            </bean>
        </property>
    </bean>
</beans>

我们指定了本地港口48500要侦听并使用静态IP查找器来发现节点,请执行以下操作。此外,我们还显式地将tcp通信端口配置为48100。从上述配置开始的每个Ignite节点将只加入到此集群,并且在同一主机上的另一个集群中不可见。注意,我们还启用了缓存对象放置用于获取的事件PUT缓存中每个条目的事件通知。作为数据源,我们将使用myCacheSource复制缓存。用名称保存文件isolated-cluster-1-kafka-source.xml在.。$IGNITE_HOME/examples/config文件夹。

对于来自第二个集群的节点,我们必须使用另一组端口。配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
        <property name="peerClassLoadingEnabled" value="true"/>
        <property name="cacheConfiguration">
            <list>
                <!-- Partitioned cache example configuration (Atomic mode). -->
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="myCacheTarget"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>
                </bean>
            </list>
        </property>
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <!-- Initial local port to listen to. -->
                <property name="localPort" value="49500"/>
<!-- Changing local port range. This is an optional action. -->
                <property name="localPortRange" value="20"/>
<!-- Setting up IP finder for this cluster -->
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>127.0.0.1:49500..49520</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
        <!--
        Explicitly configure TCP communication SPI changing local port number
        for the nodes from the second cluster.
        -->
        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="49100"/>
            </bean>
        </property>
    </bean>
</beans>

对于第二个集群中的节点,我们将发现端口定义为49500和通信端口49100。这两种配置之间的差别是微不足道的,只有Spis和IP查找程序的端口号不同。将此配置保存为具有名称的文件isolated-cluster-1.xml并将文件放入文件夹中。$IGNITE_HOME/examples/config.

让我们测试一下配置。使用不同的配置文件在单独的控制台中启动两个Ignite节点。下面是一个如何运行Ignite节点的示例。

ignite.sh $IGNITE_HOME/examples/config/isolated-cluster-1-kafka-source.xml 
ignite.sh $IGNITE_HOME/examples/config/isolated-cluster-2.xml

下一个屏幕截图显示了上述命令的结果。正如预期的那样,两个独立的Ignite节点在不同的集群中启动和运行。

Figure 3.

注意,所有清单和配置文件都可以在GitHub储存库.

第二步。接下来,您需要定义流提取器来将数据转换为键值元组。创建一个Maven项目,并将以下依赖项添加到pom.xml.

<dependency>
  <groupId>org.apache.ignite</groupId> 
  <artifactId>ignite-kafka</artifactId> 
  <version>2.6.0</version>
</dependency>

我们用ignite-kafka模块作为我们的依赖项。添加以下具有名称的Java类CsvStreamExtractor进入com.blu.imdg包,它将实现StreamSingleTupleExtractor接口如下:

public class CsvStreamExtractor implements StreamSingleTupleExtractor<SinkRecord, String, String> {
  public Map.Entry<String, String> extract(SinkRecord sinkRecord) {
          System.out.println("SinkRecord:"+ sinkRecord.value().toString());
    String[] parts = sinkRecord.value().toString().split(",");
          String key = ((String[])parts[2].split("="))[1];
          String val= ((String[])parts[7].split("="))[1];
          return new AbstractMap.SimpleEntry<String, String>(key, val);
      }
}

方法extract 是班里的工作人员吗?CsvStreamExtractor。这里的代码很简单:它从事件的每个元组中检索键和值,其中每个元组都公开为SinkRecord在小溪里。这,这个,那,那个extract 方法返回键值对,它将被发送到Ignite集群(目标),以便在缓存中进一步存储。

使用Maven命令编译和构建项目:mvn clean install。成功编译项目后,一个名为kafka-1.0.jar应该在项目目标目录中创建。将库复制到文件夹$KAFKA_HOME/libs.

步骤3。现在我们的流提取器已经准备好使用了,让我们配置Ignite源和接收器连接器,并让它们从复制数据开始。让我们创建一个名为ignite-connector- source.properties进入$KAFKA_HOME/myconfig目录。添加以下属性并保存文件。

# connector
name=my-ignite-source-connector
connector.class=org.apache.ignite.stream.kafka.connect.IgniteSourceConnector
tasks.max=2
topicNames=test2
# cache
cacheName=myCacheSource
cacheAllowOverwrite=true
cacheEvts=put
igniteCfg=PATH_TO_THE_FILE/isolated-cluster-1-kafka-source.xml

在前面的连接器配置中,我们定义了org.apache.ignite.stream.kafka.connect.IgniteSourceConnector作为连接器类。我们还将test 2指定为主题名称,其中将存储流事件。接下来,对于缓存配置,我们将PUT事件定义为网格远程事件。在我们的例子中,我们使用myCacheSource作为源缓存。在这里,另一个关键属性是igniteCfg,其中我们显式地指定了一个孤立的集群配置。第一组将是我们的事件来源。

接下来,让我们配置Ignite接收器连接器。用名称创建另一个文件ignite- connector-sink.properties进入$KAFKA_HOME/myconfig目录。从下面的清单中添加以下属性。

# connector
name=my-ignite-sink-connector
connector.class=org.apache.ignite.stream.kafka.connect.IgniteSinkConnector
tasks.max=2
topics=test2
# cache
cacheName=myCacheTarget
cacheAllowOverwrite=true
igniteCfg=PATH_TO_THE_FILE/isolated-cluster-2.xml
singleTupleExtractorCls=com.blu.imdg.CsvStreamExtractor

配置与我们在上一节中使用的配置相同。主要区别在于singleTupleExtractorCls属性,其中指定了我们在步骤2中开发的流提取器。

步骤4。启动动物园管理员和Kafka Broker(服务器),如Kafka文献

步骤5。您可以猜到,我们必须用test 2来创建一个新的Kafka主题。让我们使用以下命令创建主题。

$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor \ 1 --partitions 1 --topic test2

步骤6。让我们在一个单独的控制台中启动源和接收器连接器。首先,使用以下命令启动源连接器。

bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connecto\ r-source.properties

这将使用默认连接器独立属性启动源连接器。请注意,此连接器还将启动Ignite服务器节点,我们将该节点加入到点燃团簇1.

拼图的最后一部分是沉槽连接器。我们现在已经准备好启动接收器连接器了。但是,在以独立模式启动另一个Kafka连接器之前,我们必须更改连接器的REST端口和存储文件名。创建一个名为Connection的文件-standalone-sink.properties进入$KAFKA_HOME/myconfig文件夹。向其添加以下属性。

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-1.offsets
rest.port=8888
offset.flush.interval.ms=10000

大多数配置与以前相同,只有rest.portoffset.storage.file.filename是不同的。我们已经显式地定义了一个新的端口。8888对于此连接器,还指定了另一个文件存储。使用此配置从$KAFKA_HOME目录。

bin/connect-standalone.sh myconfig/connect-standalone-sink.properties myconfig/ignite-con\ nector-sink.properties

上面的命令将在另一个控制台上启动接收器连接器。下一个图显示了在独立控制台上启动和运行的两个连接器的屏幕截图。

Figure 4.

步骤7。现在我们已经设置了连接器,现在是测试流管道的时候了。此时,如果我们在myCacheSource在集群1上创建的缓存,应该将条目复制到myCacheTarget集群2上的缓存。我们有几种方法可以使用IgniteRESTAPI或Java客户机将一些条目加载到缓存myCacheSource中。让我们使用Ignite Java客户机IsolatedCluster从…第二章写这篇文章的书。

$ java -jar ./target/IsolatedCLient-runnable.jar

这个Java客户机加载22进入缓存的条目myCacheSource。让我们观察一下在Ignite星系团上发生了什么。使用两个Ignite管理程序工具连接到集群,每个集群一个。执行cache -scan命令来扫描缓存,您应该得到一个非常类似于图5所示的截图。

Figure 5.

如图5所示,不同集群中的每个缓存包含相同的条目集。如果仔细查看控制台上的Ignite接收器连接器日志,您应该会发现类似于以下日志的日志:

CacheEvent [cacheName=myCacheSource, part=64, key=Key:150, xid=null, lockId=GridCacheVersion [topVer=150300733, order=1538826349084, nodeOrder=4], newVal=Hello World!!: 150, oldVal=null, hasOldVal=false, hasNewVal=true, near=false, subjId=572ac224-f48b-4a0c-a844-496f4d609b6a, cloClsName=null, taskName=null, nodeId8=fb6ae4b6, evtNodeId8=572ac224, msg=Cache event., type=CACHE_OBJECT_PUT, tstamp=1538829094472]
Key:150 
Val:Hello World!!:

启动源连接器流缓存。PUT事件进入主题test2作为一个元组,它包含元数据以及键和值:旧值和新值。点火器接收器连接器使用CsvStreamExtractor提取器从元组中检索值并将键值对存储到缓存中,myCacheTarget.

在上面的例子中,我们只配置了Ignite集群之间的单向实时数据复制。但是,ApacheIgniteKafka连接器将大量电源打包到一个小模块中。通过利用它的通用性和易用性,您可以开发强大的双向数据复制管道,或者在网格中发生任何缓存事件时通知任何客户端应用程序。此外,您还可以使用任何Kafka JDBC接收器连接器和Ignite源连接器将数据推入任何RDBMS。但是,Ignite源连接器也有一些限制,在生产环境中使用它之前应该考虑到这些限制:

  1. 点火源连接器不能并行工作。它不能分割工作,一个任务实例处理流。
  2. 它不处理多个缓存。为了处理多个缓存,必须定义在Kafka中配置和运行的多个连接器。
  3. 点火器源连接器需要在嵌入式模式下启动服务器节点才能获得通知的事件。
  4. 它不支持动态重新配置。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
要将HDFS集群中的数据拉取到Kafka topic中,可以使用Kafka Connect来实现。Kafka Connect是Kafka的一个开源工具,用于连接Kafka和其他数据源,包括HDFS、JDBC、Elasticsearch等。 以下是将HDFS中的数据拉取到Kafka topic的操作步骤: 1. 安装Kafka Connect:可以从Kafka官网上下载和安装Kafka Connect。安装完成后,需要配置Kafka Connect的配置文件,包括Kafka集群的地址、连接器的配置等。 2. 安装HDFS连接器:Kafka Connect提供了一个HDFS连接器,用于连接HDFS和Kafka。可以从Kafka官网上下载和安装HDFS连接器,并将其添加到Kafka Connect的插件目录中。 3. 配置HDFS连接器:需要在Kafka Connect的配置文件中配置HDFS连接器的参数,包括HDFS集群的地址、HDFS文件的路径、Kafka topic的名称等。 4. 启动Kafka Connect:启动Kafka Connect后,它会自动加载HDFS连接器,并根据配置的参数从HDFS中读取数据,并将数据发送到指定的Kafka topic中。 下面是一个使用HDFS连接器将HDFS中的数据拉取到Kafka topic的配置示例: ```ini # Kafka Connect的配置文件 bootstrap.servers=localhost:9092 # HDFS连接器的配置 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 connector.class=io.confluent.connect.hdfs.HdfsSinkConnector topics=hdfs-topic tasks.max=1 hdfs.url=hdfs://localhost:9000 flush.size=3 rotate.interval.ms=60000 logs.dir=/usr/local/kafka-connect/logs hadoop.home=/usr/local/hadoop format.class=io.confluent.connect.hdfs.parquet.ParquetFormat schema.compatibility=NONE ``` 在这个配置文件中,我们首先指定了Kafka集群的地址,然后配置了HDFS连接器的参数,包括数据的序列化器、Kafka topic的名称、HDFS集群的地址、HDFS文件的路径等。其中,flush.size和rotate.interval.ms参数用于控制数据的写入频率和文件的切换频率,logs.dir参数用于指定日志文件的存储路径,hadoop.home参数用于指定Hadoop的安装路径,format.class参数用于指定数据的格式(这里使用了Parquet格式),schema.compatibility参数用于指定数据的模式兼容性。 启动Kafka Connect后,它会自动加载HDFS连接器,并从HDFS中读取数据,并将数据发送到指定的Kafka topic中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值