基于Apache Hudi在Google云构建数据湖平台的思路详解


Posted in Servers onApril 07, 2022

自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品。多年来数据以多种方式存储在计算机中,包括数据库、blob存储和其他方法,为了进行有效的业务分析,必须对现代应用程序创建的数据进行处理和分析,并且产生的数据量非常巨大!有效地存储数PB数据并拥有必要的工具来查询它以便使用它至关重要,只有这样对该数据的分析才能产生有意义的结果。
大数据是一门处理分析方法、有条不紊地从中提取信息或以其他方式处理对于典型数据处理应用程序软件而言过于庞大或复杂的数据量的方法的学科。为了处理现代应用程序产生的数据,大数据的应用是非常必要的,考虑到这一点,本博客旨在提供一个关于如何创建数据湖的小教程,该数据湖从应用程序的数据库中读取任何更改并将其写入数据湖中的相关位置,我们将为此使用的工具如下:

  • Debezium
  • MySQL
  • Apache Kafka
  • Apache Hudi
  • Apache Spark

我们将要构建的数据湖架构如下:

基于Apache Hudi在Google云构建数据湖平台的思路详解

第一步是使用 Debezium 读取关系数据库中发生的所有更改,并将所有更改推送到 Kafka 集群。

Debezium 是一个用于变更数据捕获的开源分布式平台,Debezium 可以指向任何关系数据库,并且它可以开始实时捕获任何数据更改,它非常快速且实用,由红帽维护。

首先,我们将使用 docker-compose 在我们的机器上设置 Debezium、MySQL 和 Kafka,您也可以使用这些的独立安装,我们将使用 Debezium 提供给我们的 mysql 镜像,因为其中已经包含数据,在任何生产环境中都可以使用适当的 Kafka、MySQL 和 Debezium 集群,docker compose 文件如下:

version: '2'
services:
  zookeeper:
    image: debezium/zookeeper:${DEBEZIUM_VERSION}
    ports:
     - 2181:2181
     - 2888:2888
     - 3888:3888
  kafka:
    image: debezium/kafka:${DEBEZIUM_VERSION}
    ports:
     - 9092:9092
    links:
     - zookeeper
    environment:
     - ZOOKEEPER_CONNECT=zookeeper:2181
  mysql:
    image: debezium/example-mysql:${DEBEZIUM_VERSION}
    ports:
     - 3307:3306
    environment:
     - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASS}
     - MYSQL_USER=${MYSQL_USER}
     - MYSQL_PASSWORD=${MYSQL_USER_PASS}
  schema-registry:
    image: confluentinc/cp-schema-registry
    ports:
     - 8181:8181
     - 8081:8081
    environment:
     - SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=kafka:9092
     - SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL=zookeeper:2181
     - SCHEMA_REGISTRY_HOST_NAME=schema-registry
     - SCHEMA_REGISTRY_LISTENERS=http://schema-registry:8081
    links:
     - zookeeper
  connect:
    image: debezium/connect:${DEBEZIUM_VERSION}
    ports:
     - 8083:8083
    links:
     - kafka
     - mysql
     - schema-registry
    environment:
     - BOOTSTRAP_SERVERS=kafka:9092
     - GROUP_ID=1
     - CONFIG_STORAGE_TOPIC=my_connect_configs
     - OFFSET_STORAGE_TOPIC=my_connect_offsets
     - STATUS_STORAGE_TOPIC=my_connect_statuses
     - KEY_CONVERTER=io.confluent.connect.avro.AvroConverter
     - VALUE_CONVERTER=io.confluent.connect.avro.AvroConverter
     - INTERNAL_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
     - INTERNAL_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter
     - CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL=http://schema-registry:8081
     - CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL=http://schema-registry:8081

DEBEZIUM_VERSION 可以设置为 1.8。 此外请确保设置 MYSQL_ROOT_PASS、MYSQL_USER 和 MYSQL_PASSWORD。

在我们继续之前,我们将查看 debezium 镜像提供给我们的数据库 inventory 的结构,进入数据库的命令行:

docker-compose -f docker-compose-avro-mysql.yaml exec mysql bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD inventory'

在 shell 内部,我们可以使用 show tables 命令。 输出应该是这样的:

基于Apache Hudi在Google云构建数据湖平台的思路详解

我们可以通过 select * from customers 命令来查看客户表的内容。 输出应该是这样的:

基于Apache Hudi在Google云构建数据湖平台的思路详解

现在在创建容器后,我们将能够为 Kafka Connect 激活 Debezium 源连接器,我们将使用的数据格式是 Avro 数据格式,Avro 是在 Apache 的 Hadoop 项目中开发的面向行的远程过程调用和数据序列化框架。它使用 JSON 来定义数据类型和协议,并以紧凑的二进制格式序列化数据。

让我们用我们的 Debezium 连接器的配置创建另一个文件。

{
    "name": "inventory-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "mysql",
        "database.port": "3306",
        "database.user": "MYSQL_USER",
        "database.password": "MYSQL_PASSWORD",
        "database.server.id": "184054",
        "database.server.name": "dbserver1",
        "database.include.list": "inventory",
        "database.history.kafka.bootstrap.servers": "kafka:9092",
        "database.history.kafka.topic": "schema-changes.inventory",
        "key.converter": "io.confluent.connect.avro.AvroConverter",
        "value.converter": "io.confluent.connect.avro.AvroConverter",
        "key.converter.schema.registry.url": "http://schema-registry:8081",
        "value.converter.schema.registry.url": "http://schema-registry:8081"
    }
}

正如我们所看到的,我们已经在其中配置了数据库的详细信息以及要从中读取更改的数据库,确保将 MYSQL_USER 和 MYSQL_PASSWORD 的值更改为您之前配置的值,现在我们将运行一个命令在 Kafka Connect 中注册它,命令如下:

curl -i -X POST -H "Accept:application/json" -H "Content-type:application/json" http://localhost:8083/connectors/ -d @register-mysql.json

现在,Debezium 应该能够从 Kafka 读取数据库更改。
下一步涉及使用 Spark 和 Hudi 从 Kafka 读取数据,并将它们以 Hudi 文件格式放入 Google Cloud Storage Bucket。 在我们开始使用它们之前,让我们了解一下 Hudi 和 Spark 是什么。

Apache Hudi 是一个开源数据管理框架,用于简化增量数据处理和数据管道开发。 该框架更有效地管理数据生命周期等业务需求并提高数据质量。 Hudi 使您能够在基于云的数据湖上管理记录级别的数据,以简化更改数据捕获 (CDC) 和流式数据摄取,并帮助处理需要记录级别更新和删除的数据隐私用例。 Hudi 管理的数据集使用开放存储格式存储在云存储桶中,而与 Presto、Apache Hive 和/或 Apache Spark 的集成使用熟悉的工具提供近乎实时的更新数据访问

Apache Spark 是用于大规模数据处理的开源统一分析引擎。 Spark 为具有隐式数据并行性和容错性的集群编程提供了一个接口。 Spark 代码库最初是在加州大学伯克利分校的 AMPLab 开发的,后来被捐赠给了 Apache 软件基金会,该基金会一直在维护它。

现在,由于我们正在 Google Cloud 上构建解决方案,因此最好的方法是使用 Google Cloud Dataproc。 Google Cloud Dataproc 是一种托管服务,用于处理大型数据集,例如大数据计划中使用的数据集。 Dataproc 是 Google 的公共云产品 Google Cloud Platform 的一部分。 Dataproc 帮助用户处理、转换和理解大量数据。

在 Google Dataproc 实例中,预装了 Spark 和所有必需的库。 创建实例后,我们可以在其中运行以下 Spark 作业来完成我们的管道:

spark-submit \
  --packages org.apache.hudi:hudi-spark3.1.2-bundle_2.12:0.10.1,org.apache.spark:spark-avro_2.12:3.1.2 \
  --master yarn --deploy-mode client \
  --class org.apache.hudi.utilities.deltastreamer.HoodieDeltaStreamer /usr/lib/hadoop/hudi-packages/hudi-utilities-bundle_2.12-0.10.1.jar \
  --table-type COPY_ON_WRITE --op UPSERT \
  --target-base-path gs://your-data-lake-bucket/hudi/customers \
  --target-table hudi_customers --continuous \
  --min-sync-interval-seconds 60 \
  --source-class org.apache.hudi.utilities.sources.debezium.MysqlDebeziumSource \
  --source-ordering-field _event_origin_ts_ms \
  --hoodie-conf schema.registry.url=http://localhost:8081 \
  --hoodie-conf hoodie.deltastreamer.schemaprovider.registry.url=http://localhost:8081/subjects/dbserver1.inventory.customers-value/versions/latest \
  --hoodie-conf hoodie.deltastreamer.source.kafka.topic=dbserver1.inventory.customers \
  --hoodie-conf bootstrap.servers=localhost:9092 \
  --hoodie-conf auto.offset.reset=earliest \
  --hoodie-conf hoodie.datasource.write.recordkey.field=id \
  --hoodie-conf hoodie.datasource.write.partitionpath.field=id \

这将运行一个 spark 作业,该作业从我们之前推送到的 Kafka 中获取数据并将其写入 Google Cloud Storage Bucket。 我们必须指定 Kafka 主题、Schema Registry URL 和其他相关配置。

结论

可以通过多种方式构建数据湖。 我试图展示如何使用 Debezium、Kafka、Hudi、Spark 和 Google Cloud 构建数据湖。 使用这样的设置,可以轻松扩展管道以管理大量数据工作负载! 有关每种技术的更多详细信息,可以访问文档。 可以自定义 Spark 作业以获得更细粒度的控制。 这里显示的 Hudi 也可以与 Presto、Hive 或 Trino 集成。 定制的数量是无穷无尽的。 本文提供了有关如何使用上述工具构建基本数据管道的基本介绍!

到此这篇关于基于Apache Hudi在Google云构建数据湖平台的文章就介绍到这了,更多相关Apache Hudi构建数据湖内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx location中多个if里面proxy_pass的方法
Mar 31 Servers
fastdfs+nginx集群搭建的实现
Mar 31 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
Apache Linkis 中间件架构及快速安装步骤
Mar 16 Servers
HDFS免重启挂载新磁盘
Apr 06 Servers
IIS服务器中设置HTTP重定向访问HTTPS
Apr 29 Servers
如何Tomcat中使用ipv6地址
May 06 Servers
Nginx的gzip相关介绍
May 11 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 Servers
Nginx如何获取自定义请求header头和URL参数详解
Jul 23 Servers
修改Nginx配置返回指定content-type的方法
Sep 23 Servers
HDFS免重启挂载新磁盘
Apr 06 #Servers
OpenStack虚拟机快照和增量备份实现方法
Apr 04 #Servers
使用Docker容器部署rocketmq单机的全过程
Apr 03 #Servers
教你使用Jenkins集成Harbor自动发布镜像
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 #Servers
为Centos安装指定版本的Docker
Apr 01 #Servers
Dashboard管理Kubernetes集群与API访问配置
You might like
杏林同学录(六)
2006/10/09 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
深入浅析python继承问题
2016/05/29 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python内置模块collections知识点总结
2019/12/19 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
pandas按条件筛选数据的实现
2021/02/20 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
2014年个人售房协议书
2014/10/30 职场文书
内勤岗位职责
2015/02/10 职场文书
个人党性锻炼总结
2015/03/05 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
JS数组去重详情
2021/11/07 Javascript
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js