用Kafka、Kafka Connect和DynamoDB在AWS上构建数据管道的教程

346 阅读7分钟

有很多方法可以缝合数据管道:开源组件、管理服务、ETL工具等。在Kafka领域,Kafka Connect是"在Apache Kafka和其他系统之间进行数据流的首选工具。在Kafka领域,Kafka Connect是 "Apache Kafka和其他系统之间的数据流"的首选工具,它有大量的预建源和汇连接器,以及Kafka连接器的通用框架,这使得其他数据系统与Kafka的集成标准化,如果有需要,开发自己的连接器也更简单。

这是一个由两部分组成的博客系列,提供了一个使用Kafka和Kafka Connect的数据管道的逐步演练。我将使用AWS进行演示,但这些概念适用于任何同等的选择(例如,使用Docker在本地运行这些程序)。以下是我将使用的一些关键的AWS服务。

  • Amazon Managed Streaming for Apache Kafka(MSK)。数据基础设施的核心组件
  • MSK连接。它将用于部署为Kafka Connect构建的完全管理的连接器,以便将数据移入或从各种来源拉取数据。
  • 亚马逊DynamoDB:一个完全管理的NoSQL数据库服务,在本博客系列的背景下,它作为我们数据管道的目标/水槽。
  • 亚马逊Aurora MySQL。一个完全管理的、与MySQL兼容的关系型数据库引擎,在本博客系列的第二部分中使用。

下面是每个部分将涵盖的内容的快速浏览。

  • 第一部分将保持相对简单的东西:它是所有关于容易开始的。我将使用Kafka Connect Datagen源连接器将一些样本数据泵入MSK主题,然后使用AWS DynamoDB水槽连接器将数据持久化在DynamoDB表中。
  • 第二部分将更上一层楼:我们将探索变化数据的捕获。Datagen连接器将被MySQL的Debezium连接器取代,它将从Aurora MySQL的表中实时提取数据,推送到MSK主题。然后,我们将继续使用DynamoDB水槽连接器,就像我们以前做的那样。

准备好基础设施组件和服务

首先,你需要部署本教程所需的所有资源。有很多,但不用担心,因为我为你准备了一个CloudFormation模板

在你继续之前,请下载该模板

这里是本博文中提出的解决方案的高层次图示。

关于一步一步的说明,请参考官方文档中的《在AWS CloudFormation控制台创建堆栈》。

使用AWS控制台来部署CloudFormation模板。在创建堆栈向导中,选择上传模板文件并上传你刚刚下载的文件。

点击下一步,并输入堆栈的名称。点击下一步继续。在向导的最后一页,点击创建堆栈来启动资源创建。

你可以在CloudFormation控制台跟踪进度。一旦成功,你应该拥有所有的资源,包括。

  • 核心基础设施。VPC、子网等。
  • 服务。MSK集群,Aurora MySQL,等等。
  • 其他。IAM角色,CloudWatch日志组,等等。

通过会话管理器连接到EC2实例

在CloudFormation的资源列表中,找到KafkaClientEC2Instance EC2实例(在上图中强调)。

使用会话管理器连接到它。

启用自动主题创建

MSK Connect需要在运行中创建主题。我们可以在MSK中创建一个自定义配置来启用自动主题创建。

从EC2实例,运行下面的命令来创建一个自定义配置。

sudo -u ec2-user -i
mkdir kafka-configuration && cd kafka-configuration

cat <<EOF > configuration.txt 
auto.create.topics.enable=true
EOF

export AWS_REGION=<enter MSK cluster region e.g. us-east-1>
export AWS_REGION=us-east-1

aws kafka create-configuration \
    --name "CustomConfiguration" \
    --description "Topic auto-creation enabled" \
    --kafka-versions "2.6.2" \
    --region $AWS_REGION \
    --server-properties file://configuration.txt

继续并应用这个配置。

进入你的MSK cluster > Properties > Configuration ,选择编辑
选择你刚刚创建的配置,然后,选择保存。这将重新启动你的MSK集群:在你继续之前,等待这个过程完成。

数据管道。第一部分

让我们开始创建管道的前半部分,利用Datagen源连接器将样本事件泵送到MSK的一个主题。

在这一节中,你将。

  • 下载Datagen连接器的构件。
  • 在MSK中创建一个自定义插件。
  • 将Datagen源连接器部署到MSK连接。

最后,你将拥有数据管道的前半部分,可以开始使用了!

创建一个自定义插件和连接器

将Datagen连接器文件上传到Amazon S3

从Kafka客户端的EC2实例,运行这些命令。

sudo -u ec2-user -i
mkdir kafka-connect-datagen && cd kafka-connect-datagen

wget https://d1i4a15mxbxib1.cloudfront.net/api/plugins/confluentinc/kafka-connect-datagen/versions/0.5.3/confluentinc-kafka-connect-datagen-0.5.3.zip
aws s3 cp ./confluentinc-kafka-connect-datagen-0.5.3.zip s3://msk-lab-<ENTER_YOUR_AWS_ACCOUNT_ID>-plugins-bucket/

cd ..

创建自定义插件

关于如何创建MSK连接插件的步骤说明,请参阅官方文档中的使用AWS管理控制台创建自定义插件

在创建自定义插件时,确保选择你在上一步上传到Amazon S3 的Datagen连接器压缩文件。

创建Datagen源连接器

关于如何创建MSK Connect连接器的步骤说明,请参阅官方文档中的创建连接器

要创建一个连接器。

  1. 选择你刚刚创建的插件。
  2. 输入连接器名称并选择MSK集群以及IAM认证。
  3. 你可以在连接器配置部分输入下面提供的内容。
connector.class=io.confluent.kafka.connect.datagen.DatagenConnector
kafka.topic=orders
quickstart=orders
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schemas.enable=false
max.interval=10000
iterations=-1
tasks.max=1

其他配置不做改变

  1. 访问权限下,为连接器选择正确的IAM角色(名称中带有DatagenConnectorIAMRole )。
  2. 点击 "下一步",转到安全选项:保持不变。
  3. 点击下一步。对于日志交付,选择交付给Amazon CloudWatch Logs。找到并选择/msk-connect-demo-cwlog-group
  4. 点击下一步。 在最后一页,向下滚动并单击 "创建连接器"以启动该过程,并等待连接器的启动。

一旦完成,连接器已经过渡到运行状态,继续下面的步骤。

测试管道

在你进一步进行之前。

  • 下载AWS IAM JAR文件并将其包含在classpath中。
  • 为Kafka CLI消费者创建一个属性文件。

在EC2实例中,运行以下命令。

sudo -u ec2-user -i

mkdir iam-auth && cd ./iam-auth
wget https://github.com/aws/aws-msk-iam-auth/releases/download/1.1.0/aws-msk-iam-auth-1.1.0-all.jar
cd ../

cat <<EOF > /home/ec2-user/kafka/config/client-config.properties
# Sets up TLS for encryption and SASL for authN.
security.protocol = SASL_SSL

# Identifies the SASL mechanism to use.
sasl.mechanism = AWS_MSK_IAM

# Binds SASL client implementation.
sasl.jaas.config = software.amazon.msk.auth.iam.IAMLoginModule required;

# Encapsulates constructing a SigV4 signature based on extracted credentials.
# The SASL client bound by "sasl.jaas.config" invokes this class.
sasl.client.callback.handler.class = software.amazon.msk.auth.iam.IAMClientCallbackHandler
EOF

export CLASSPATH=/home/ec2-user/iam-auth/aws-msk-iam-auth-1.1.0-all.jar
echo "export CLASSPATH=${CLASSPATH}" | tee -a ~/.bash_profile

首先,列出Kafka主题。

export MSK_BOOTSTRAP_ADDRESS=<ENTER MSK CLUSTER ENDPOINT>

/home/ec2-user/kafka/bin/kafka-topics.sh --bootstrap-server $MSK_BOOTSTRAP_ADDRESS --command-config /home/ec2-user/kafka/config/client-config.properties --list

启动Kafka CLI消费者。

/home/ec2-user/kafka/bin/kafka-console-consumer.sh --bootstrap-server $MSK_BOOTSTRAP_ADDRESS --consumer.config /home/ec2-user/kafka/config/client-config.properties --from-beginning --topic orders | jq --color-output .

如果一切设置正确,你应该看到类似这样的JSON输出。

...
{
  "ordertime": 1488059390707,
  "orderid": 50,
  "itemid": "Item_845",
  "orderunits": 4.801443003705596,
  "address": {
    "city": "City_",
    "state": "State_6",
    "zipcode": 34225
  }
}
{
  "ordertime": 1496655341559,
  "orderid": 51,
  "itemid": "Item_71",
  "orderunits": 6.184874231875158,
  "address": {
    "city": "City_63",
    "state": "State_91",
    "zipcode": 77633
  }
}
...

数据管道。第二部分

只要Datagen源连接器在运行,它就会继续产生样本订单数据。根据我们的配置,它将每10秒产生一条记录(max.interval=10000iterations=-1)。

接下来,我们将实现管道的后半部分,负责在DynamoDB Sink连接器的帮助下将数据从MSK主题带到DynamoDB表中。

在本节中,你将。

  • 下载DynamoDB连接器的工件
  • 在MSK中创建自定义插件
  • 将DynamoDB sink连接器部署到MSK Connect中

创建自定义插件和连接器

将DynamoDB连接器上传到Amazon S3

登录Kafka客户端EC2实例。

sudo -u ec2-user -i

mkdir kafka-connect-dynamodb && cd kafka-connect-dynamodb

wget https://d1i4a15mxbxib1.cloudfront.net/api/plugins/confluentinc/kafka-connect-aws-dynamodb/versions/1.3.0/confluentinc-kafka-connect-aws-dynamodb-1.3.0.zip

aws s3 cp ./confluentinc-kafka-connect-aws-dynamodb-1.3.0.zip s3://msk-lab-<ENTER_YOUR_AWS_ACCOUNT_ID>-plugins-bucket/

cd ..

创建自定义插件

关于如何创建MSK Connect插件的步骤说明,请参阅官方文档中的使用AWS管理控制台创建自定义插件。

在创建自定义插件时,确保选择你在上一步上传到Amazon S3 的DynamoDB连接器压缩文件。

创建DynamoDB Sink连接器

关于如何创建MSK Connect连接器的步骤说明,请参考官方文档中的创建一个连接器。

要创建一个连接器。

  1. 选择你刚刚创建的插件。
  2. 输入连接器名称并选择MSK集群以及IAM认证
  3. 你可以在连接器配置部分输入下面提供的内容。请确保你根据你的设置替换以下配置。
  • 使用正确的主题名称(在我们的例子中是orders )。
  • confluent.topic.bootstrap.servers 中输入MSK代理端点。
  • 对于aws.dynamodb.endpointaws.dynamodb.region ,输入你创建DynamoDB表的区域,例如:us-east-1

其余的配置保持不变。

connector.class=io.confluent.connect.aws.dynamodb.DynamoDbSinkConnector
tasks.max=1
topics=orders
aws.dynamodb.region=<ENTER AWS REGION e.g. us-east-1>
aws.dynamodb.endpoint=https://dynamodb.<ENTER AWS REGION>.amazonaws.com
aws.dynamodb.pk.hash=value.orderid
aws.dynamodb.pk.sort=
table.name.format=kafka_${topic}
transforms=flatten
transforms.flatten.type=org.apache.kafka.connect.transforms.Flatten$Value
transforms.flatten.delimiter=_
key.converter.schemas.enable=false
value.converter.schemas.enable=false
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
confluent.topic.bootstrap.servers=<ENTER MSK CLUSTER ENDPOINT>
confluent.topic.security.protocol=SASL_SSL
confluent.topic.sasl.mechanism=AWS_MSK_IAM
confluent.topic.sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
confluent.topic.sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
  1. 访问权限下,为连接器选择正确的 IAM 角色(名称中包含DynamoDBConnectorIAMRole 的角色)。
  2. 点击 "下一步"转到安全选项:保持不变。
  3. 点击下一步。对于日志交付,选择交付给Amazon CloudWatch Logs。找到并选择/msk-connect-demo-cwlog-group
  4. 点击**下一步。**在最后一页,向下滚动并单击 "创建连接器"以启动该过程,并等待连接器的启动。

一旦完成,连接器过渡到运行状态,继续下面的步骤。

在我们继续测试管道之前,有几件事情你应该知道

选择DynamoDB主键

在上面的配置中,我们将aws.dynamodb.pk.hash 设置为value.orderid ,这意味着Kafka主题事件有效载荷中的orderid 字段将被用作分区键(aws.dynamodb.pk.sort 被留空,但如果需要,可以用来指定DynamoDB的排序/范围键)。

使用Kafka Connect SMT扁平化记录

事件有效载荷中的address 字段有一个嵌套结构。

"address": {
    "city": "City_63",
    "state": "State_91",
    "zipcode": 77633
  }

为了解除嵌套或扁平化(因为缺乏更好的词),我们使用了扁平化转换(org.apache.kafka.connect.transforms.Flatten$Value)。这是从address 中提取单个字段,并将它们作为单个属性提供。address_city,address_state,address_zipcode 。你很快就会在DynamoDB表中看到同样的情况。

测试端到端管道

导航到DynamoDB控制台。你会看到kafka_orders 表已经存在--这是由DynamoDB水槽连接器自动创建的。

该表有orderid 作为分区键

如果你有AWS CLI,你可以使用aws dynamodb scan --table-name kafka_orders 快速查看数据。

你会得到一个类似的输出(注意address_* 字段)。

{
    "Items": [
        {
            "orderid": {
                "N": "251"
            },
            "address_zipcode": {
                "N": "68100"
            },
            "address_state": {
                "S": "State_2"
            },
            "itemid": {
                "S": "Item_46"
            },
            "ordertime": {
                "N": "1491423463934"
            },
            "address_city": {
                "S": "City_6"
            },
            "orderunits": {
                "N": "3.1272028351151926"
            }
        },
.....

继续:查询,并随意玩弄DynamoDB表中的数据。这就是你的功课!

当连接器编织它的魔法时,它将继续把Kafka主题中的记录同步到DynamoDB表中。请记住,只要连接器在运行,数据管道(来自Datagen source -> MSK topic -> DynamoDB )将继续运行:记录将不断被添加到MSK中的orders 主题中,它们将被持久化到DynamoDB表中。

删除资源

除非你打算通过本博客系列的第二部分工作(即将到来),否则请删除资源。

  • 删除Amazon S3 bucket (msk-lab-<YOUR ACCOUNT_ID>-plugins-bucket)的内容。
  • 删除CloudFormation栈。
  • 删除DynamoDB表。
  • 删除MSK Connect连接器、插件和自定义配置。

总结

像MSK Connect这样的管理环境可以处理繁重的工作,让你专注于构建你的数据架构。这篇博客的重点是让你建立和运行一个简单的数据管道,以DynamoDB为汇。下一部分将包括变化的数据捕获,并指导你如何使用本篇文章中涉及的组件构建一个解决方案。

AWS Build(游戏引擎) 连接器(数学) 数据(计算) kafka 管道(软件)