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 相关文章推荐
基于Nginx实现限制某IP短时间访问次数
Mar 31 Servers
Nginx配置https的实现
Nov 27 Servers
关于Nginx中虚拟主机的一些冷门知识小结
Mar 03 Servers
Shell脚本一键安装Nginx服务自定义Nginx版本
Mar 20 Servers
Apache Hudi的多版本清理服务彻底讲解
Mar 31 Servers
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
Apr 07 Servers
centos7安装mysql5.7经验记录
May 02 Servers
Tomcat弱口令复现及利用
May 06 Servers
tomcat正常启动但网页却无法访问的几种解决方法
May 06 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python实现简易Web爬虫详解
2018/01/03 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python保留小数位的三种实现方法
2020/01/07 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
django 实现简单的插入视频
2020/04/07 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
故意伤害辩护词
2015/05/21 职场文书
居安思危观后感
2015/06/11 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android