Vertica集成Apache Hudi重磅使用指南


Posted in Servers onMarch 31, 2022

1. 摘要

本文演示了使用外部表集成 Vertica 和 Apache Hudi。 在演示中我们使用 Spark 上的 Apache Hudi 将数据摄取到 S3 中,并使用 Vertica 外部表访问这些数据。

2. Apache Hudi介绍

Apache Hudi 是一种变更数据捕获 (CDC) 工具,可在不同时间线将事务记录在表中。 Hudi 代表 Hadoop Upserts Deletes and Incrementals,是一个开源框架。 Hudi 提供 ACID 事务、可扩展的元数据处理,并统一流和批处理数据处理。
以下流程图说明了该过程。 使用安装在 Apache Spark 上的 Hudi 将数据处理到 S3,并从 Vertica 外部表中读取 S3 中的数据更改。

Vertica集成Apache Hudi重磅使用指南

3. 环境准备

Apache Spark 环境。 使用具有 1 个 Master 和 3 个 Worker 的 4 节点集群进行了测试。 按照在多节点集群上设置 Apache Spark 中的说明安装 Spark 集群环境。 启动 Spark 多节点集群。

Vertica 分析数据库。 使用 Vertica Enterprise 11.0.0 进行了测试。

AWS S3 或 S3 兼容对象存储。 使用 MinIO 作为 S3 存储桶进行了测试。

需要以下 jar 文件。将 jar 复制到 Spark 机器上任何需要的位置,将这些 jar 文件放在 /opt/spark/jars 中。

Hadoop - hadoop-aws-2.7.3.jar

AWS - aws-java-sdk-1.7.4.jar

在 Vertica 数据库中运行以下命令来设置访问存储桶的 S3 参数:

SELECT SET_CONFIG_PARAMETER('AWSAuth', 'accesskey:secretkey');
SELECT SET_CONFIG_PARAMETER('AWSRegion','us-east-1');
SELECT SET_CONFIG_PARAMETER('AWSEndpoint','<S3_IP>:9000');
SELECT SET_CONFIG_PARAMETER('AWSEnableHttps','0');

endpoint可能会有所不同,具体取决于 S3 存储桶位置选择的 S3 对象存储。

4. Vertica和Apache Hudi集成

要将 Vertica 与 Apache Hudi 集成,首先需要将 Apache Spark 与 Apache Hudi 集成,配置 jars,以及访问 AWS S3 的连接。 其次,将 Vertica 连接到 Apache Hudi。 然后对 S3 存储桶执行 Insert、Append、Update 等操作。
按照以下部分中的步骤将数据写入 Vertica。
在 Apache Spark 上配置 Apache Hudi 和 AWS S3
配置 Vertica 和 Apache Hudi 集成

4.1 在 Apache Spark 上配置 Apache Hudi 和 AWS S3

在 Apache Spark 机器中运行以下命令。
这会下载 Apache Hudi 包,配置 jar 文件,以及 AWS S3

/opt/spark/bin/spark-shell \
--conf "spark.serializer=org.apache.spark.serializer.KryoSerializer"\--packages org.apache.hudi:hudi-spark3-bundle_2.12:0.9.0,org.apache.spark:spark-avro_2.12:3.0.1

导入Hudi的读、写等所需的包:

import org.apache.hudi.QuickstartUtils._
import scala.collection.JavaConversions._
import org.apache.spark.sql.SaveMode._
import org.apache.hudi.DataSourceReadOptions._
import org.apache.hudi.DataSourceWriteOptions._
import org.apache.hudi.config.HoodieWriteConfig._

使用以下命令根据需要配置 Minio 访问密钥、Secret key、Endpoint 和其他 S3A 算法和路径。

spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "*****")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "*****")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "http://XXXX.9000")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")
sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")

创建变量来存储 MinIO 的表名和 S3 路径。

val tableName = “Trips”
val basepath = “s3a://apachehudi/vertica/”

准备数据,使用 Scala 在 Apache spark 中创建示例数据

val df = Seq(
("aaa","r1","d1",10,"US","20211001"),
("bbb","r2","d2",20,"Europe","20211002"),
("ccc","r3","d3",30,"India","20211003"),
("ddd","r4","d4",40,"Europe","20211004"),
("eee","r5","d5",50,"India","20211005"),
).toDF("uuid", "rider", "driver","fare","partitionpath","ts")

将数据写入 AWS S3 并验证此数据

df.write.format("org.apache.hudi").
options(getQuickstartWriteConfigs).
option(PRECOMBINE_FIELD_OPT_KEY, "ts").
option(RECORDKEY_FIELD_OPT_KEY, "uuid").
option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
option(TABLE_NAME, tableName).
mode(Overwrite).
save(basePath)

使用 Scala 运行以下命令以验证是否从 S3 存储桶中正确读取数据。

spark.read.format("hudi").load(basePath).createOrReplaceTempView("dta")
spark.sql("select _hoodie_commit_time, uuid, rider, driver, fare,ts, partitionpath from  dta order by uuid").show()

Vertica集成Apache Hudi重磅使用指南

4.2 配置 Vertica 和 Apache HUDI 集成

在 vertica 中创建一个外部表,其中包含来自 S3 上 Hudi 表的数据。 我们创建了“旅行”表。

CREATE EXTERNAL TABLE Trips
(
_hoodie_commit_time TimestampTz,
uuid varchar,
rider varchar,
driver varchar,
fare int,
ts varchar,
partitionpath varchar
)
AS COPY FROM
's3a://apachehudi/parquet/vertica/*/*.parquet' PARQUET;

运行以下命令以验证正在读取外部表:

Vertica集成Apache Hudi重磅使用指南

4.3 如何让 Vertica 查看更改的数据

以下部分包含为查看 Vertica 中更改的数据而执行的一些操作的示例。

4.3.1 写入数据

在这个例子中,我们使用 Scala 在 Apache spark 中运行了以下命令并附加了一些数据:

val df2 = Seq(
("fff","r6","d6",50,"India","20211005")
).toDF("uuid", "rider", "driver","fare","partitionpath","ts")

运行以下命令将此数据附加到 S3 上的 Hudi 表中:

df2.write.format("org.apache.hudi").
options(getQuickstartWriteConfigs).
option(PRECOMBINE_FIELD_OPT_KEY, "ts").
option(RECORDKEY_FIELD_OPT_KEY, "uuid").
option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
option(TABLE_NAME, tableName).
mode(Append).
save(basePath)

4.3.2 更新数据

在这个例子中,我们更新了一条 Hudi 表的记录。 需要导入数据以触发并更新数据:

val df3 = Seq(
("aaa","r1","d1",100,"US","20211001"),
("eee","r5","d5",500,"India","20211001")
).toDF("uuid", "rider", "driver","fare","partitionpath","ts")

运行以下命令将数据更新到 S3 上的 HUDI 表:

df3.write.format("org.apache.hudi").
options(getQuickstartWriteConfigs).
option(PRECOMBINE_FIELD_OPT_KEY, "ts").
option(RECORDKEY_FIELD_OPT_KEY, "uuid").
option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
option(TABLE_NAME, tableName).
mode(Append).
save(basePath)

以下是 spark.sql 的输出:

Vertica集成Apache Hudi重磅使用指南

以下是 Vertica 输出:

Vertica集成Apache Hudi重磅使用指南

4.3.3 创建和查看数据的历史快照

执行以下指向特定时间戳的 spark 命令:

val dd = spark.read
.format("hudi")
.option("as.of.instant", "20211007092600")
.load(basePath)

使用以下命令将数据写入 S3 中的 parquet:

dd.write.parquet("s3a://apachehudi/parquet/p2")

在此示例中,我们正在读取截至“20211007092600”日期的 Hudi 表快照。

dd.show

Vertica集成Apache Hudi重磅使用指南

通过在 parquet 文件上创建外部表从 Vertica 执行命令。

Vertica集成Apache Hudi重磅使用指南

以上就是Vertica集成Apache Hudi重磅使用指南的详细内容,更多关于Vertica集成Apache Hudi的资料请关注三水点靠木其它相关文章!

Servers 相关文章推荐
fastdfs+nginx集群搭建的实现
Mar 31 Servers
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
Apr 04 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
Mac电脑OS系统下安装Nginx的详细教程
Apr 14 Servers
如何通过cmd 连接阿里云服务器
Apr 18 Servers
Windows Server 2019 域控制器安装图文教程
Apr 28 Servers
使用Nginx的访问日志统计PV与UV
May 06 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 Servers
win10搭建配置ftp服务器的方法
Aug 05 Servers
Nginx虚拟主机的配置步骤过程全解
Mar 31 #Servers
Tomcat用户管理的优化配置详解
Kubernetes关键组件与结构组成介绍
配置Kubernetes外网访问集群
CKAD认证中部署k8s并配置Calico插件
Mar 31 #Servers
使用kubeadm命令行工具创建kubernetes集群
Mar 31 #Servers
Minikube搭建Kubernetes集群
You might like
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
Python入门必须知道的11个知识点
2018/03/21 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
数控技术学生的自我评价
2014/02/15 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
学生安全责任书模板
2014/07/25 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
撤诉状格式范本
2015/05/19 职场文书
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电
SpringBoot详解执行过程
2022/07/15 Java/Android