ToB企服应用市场:ToB评测及商务社交产业平台

标题: Hudi最强指南 — Hudi的安装部署(Linux) [打印本页]

作者: 宝塔山    时间: 2024-12-22 06:05
标题: Hudi最强指南 — Hudi的安装部署(Linux)
目次
前言
Hudi的先容
一、Hudi是什么?
二、Hudi的特点功能和上风
三、Hudi的使用场景
Hudi的搭建部署
一、准备
二、搭建
1)搭建JAVA环境和Hadoop环境
2)部署zookeeper
3)部署Spark on yarn
4)部署maven环境
5)部署Hudi环境
三、执行编译,构建maven
Hudi的简单使用
一、准存案例
二、启动spark-shell,设置启动序列化参数


前言

随着大数据技能的飞速发展,企业对于数据处理的效率和实时性的要求也越来越高。Hadoop作为大数据范畴的领军技能,长期以来一直承载着海量数据的存储和处理使命。然而,传统的Hadoop数据模子在处理更新和删除操作时的局限性,使得它难以满足实时数据湖等复杂场景的需求。
正是在如许的配景下,Hudi应运而生。Hudi,即Hadoop Upserts Deletes and Incrementals,是一个开源的数据存储层,它旨在解决Hadoop在处理更新和删除操作时的不敷,使得大规模分析数据集的实时更新和增量处理成为可能。
本文旨在具体先容如何搭建和部署Hudi,资助读者相识并掌握这一强盛的数据存储工具。我们将从环境准备、软件安装、设置调整、数据加载到性能优化等各个方面进行阐述,确保读者能够按照步骤顺利地搭建起本身的Hudi环境。
通过本文的学习,读者将能够相识到Hudi的根本原理和架构,掌握其安装和设置方法,并能够使用Hudi实现数据的实时更新和增量处理。无论是数据工程师、数据科学家还是大数据爱好者,都可以通过本文获得Hudi搭建和部署的实用知识和履历。
让我们一同走进Hudi的天下,探索它如何为实时数据湖的建设提供强盛的技能支持,并为企业带来更高效、更灵活的数据处理能力。
Hudi的先容

一、Hudi是什么?

Hudi(Hadoop Upserts Deletes and Incrementals)是一个开源的数据存储层,旨在优化Hadoop和HDFS上大规模分析数据集的更新、删除和增量处理。Hudi特别关注实时数据湖用例,使得数据工程师和数据科学家能够轻松地管理、查询和分析实时或几乎实时更新的数据集。

二、Hudi的特点功能和上风


三、Hudi的使用场景

1)近实时写入
减少碎片化工具的使用。
CDC 增量导入 RDBMS 数据。
限定小文件的大小和数量。

2)近实时分析
相对于秒级存储(Druid, OpenTSDB),节省资源。
提供分钟级别时效性,支撑更高效的查询。
Hudi作为lib,非常轻量。

3)增量 pipeline
区分arrivetime和event time处理延迟数据。
更短的调度interval减少端到端延迟(小时 -> 分钟) => Incremental Processing。

4)增量导出
替换部门Kafka的场景,数据导出到在线服务存储 e.g. ES。
Hudi的搭建部署

一、准备

准备下图的安装包:

具体准备要求:
1)确保安装了JAVA开发工具包(JDK),因为Hudi是基于Java开发的,因此JDK是必需的。确保安装了与Hudi兼容的JDK版本,并设置好环境变量,以便在命令行中能够直接使用。
2)由于Hudi依靠于Apache Hadoop和Apache Spark,因此在安装Hudi之前,需要先安装和设置这两个组件。
3)需要安装并设置 Apache Maven:
Maven是一个项目管理工具,用于主动化构建Java项目,并管理项目的依靠关系。安装Maven后,需要设置其环境变量,并确保可以在命令行中调用Maven命令。
   部署maven的原因:
  在搭建和部署Hudi的过程中,之以是需要搭建Maven环境,主要是因为Hudi项目本身是基于Java开发的,而且接纳了Maven作为项目管理工具。Maven在Java项目开发中扮演了重要的脚色,它提供了项目构建、依靠管理等功能,能够大大简化项目的开发和维护过程。
  
  具体来说,Maven通过定义项目对象模子(POM),资助开发者管理项目的构建过程、依靠关系、生命周期等。对于Hudi项目而言,Maven可以主动处理其所需的Java依靠库,包括其他Java项目或库,确保项目在编译、测试和运行时能够正确引用这些依靠。
  别的,Maven还提供了丰富的插件生态体系,这些插件可以扩展Maven的功能,实现诸如代码编译、打包、发布等操作。在Hudi的搭建和部署过程中,这些插件可以资助我们主动化地完成一些繁琐的使命,提高开发效率。
  
  因此,为了顺利搭建和部署Hudi,我们需要先搭建Maven环境,以便使用Maven的强盛功能来管理Hudi项目的构建和依靠关系。如许,我们可以确保Hudi项目在开发和运行过程中能够正确、高效地运行,为后续的数据处理和分析工作提供有力的支持。
  4)需要下载Hudi的发布版本
二、搭建

1)搭建JAVA环境和Hadoop环境

https://blog.csdn.net/2301_78038072/article/details/136498258
https://blog.csdn.net/2301_78038072/article/details/136498258
2)部署zookeeper

https://blog.csdn.net/2301_78038072/article/details/136505364
https://blog.csdn.net/2301_78038072/article/details/136505364
3)部署Spark on yarn

   生产生活中 因为数据量比较大,是以TB、PB级别的数据量,以是建议部署在yarn上
  https://blog.csdn.net/2301_78038072/article/details/136632914
https://blog.csdn.net/2301_78038072/article/details/136632914
4)部署maven环境

①解压缩安装包到/opt/module目次下
  1. tar -zxvf /opt/software/apache-maven-3.6.3-bin.tar.gz -C /opt/module/
复制代码
②设置maven的环境变量
  1. vim /etc/profile.d/bigdata_env.sh
复制代码
添加:
  1. #MAVEN_HOME
  2. export MAVEN_HOME=/opt/module/apache-maven-3.6.3
  3. export PATH=$PATH:$MAVEN_HOME/bin
复制代码
退出保存,刷新环境,使其见效:
  1. source /etc/profile
复制代码
③验证是否成功
  1. mvn -v
复制代码

④修改apache-maven-3.6.1/conf目次下的settings.xml文件
(1)添加maven本地堆栈路径
跳转到大概55行左右,添加内容:
  1. <localRepository>/opt/software/RepMaven</localRepository>
复制代码

(2)修改阿里云镜像
跳转到大概160行左右,添加内容:
  1. <mirror>
  2. <id>nexus-aliyun</id>
  3. <mirrorOf>central</mirrorOf>
  4. <name>Nexus aliyun</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  6. </mirror>
复制代码

5)部署Hudi环境

①解压缩安装包到/opt/module目次下
  1. tar -zxvf /opt/software/hudi-0.11.0.src.tgz -C /opt/module/
复制代码
②修改hudi-0.11.0文件夹目次下的pom.xml文件
(1)111行和113行左右 修改hadoop与hive版本兼容

(2)1170行左右 新增中心堆栈repository加速依靠下载
  1. <repository>
  2.         <id>nexus-aliyun</id>
  3.         <name>nexus-aliyun</name>
  4.         <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5.         <releases>
  6.             <enabled>true</enabled>
  7.         </releases>
  8.         <snapshots>
  9.             <enabled>false</enabled>
  10.         </snapshots>
  11. </repository>
复制代码

  修改源码兼容hadoop3 
  1. vim /opt/module/hudi-0.11.0/hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java
复制代码
113左右

④修改hudi-0.11.0/packaging/hudi-spark-bundle/文件夹目次下的pom.xml文件
  1. vim /opt/module/hudi-0.11.0/packaging/hudi-spark-bundle/pom.xml
复制代码
  解决spark模块依靠冲突
  (1)380行左右 hive
  1. <exclusions>
  2.         <exclusion>
  3.           <artifactId>guava</artifactId>
  4.           <groupId>com.google.guava</groupId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>org.eclipse.jetty</groupId>
  8.           <artifactId>*</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>org.pentaho</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14. </exclusions>
复制代码

(2)410行左右  hive-jdbc
  1. <exclusions>
  2.         <exclusion>
  3.           <groupId>javax.servlet</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>javax.servlet.jsp</groupId>
  8.           <artifactId>*</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>org.eclipse.jetty</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14. </exclusions>
复制代码

(3)430行左右 hive-metastore
  1. <exclusions>
  2.         <exclusion>
  3.           <groupId>javax.servlet</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>org.datanucleus</groupId>
  8.           <artifactId>datanucleus-core</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>javax.servlet.jsp</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14.         <exclusion>
  15.           <artifactId>guava</artifactId>
  16.           <groupId>com.google.guava</groupId>
  17.         </exclusion>
  18. </exclusions>
复制代码

(4)455行左右 hive-common
  1. <exclusions>
  2.         <exclusion>
  3.           <groupId>org.eclipse.jetty.orbit</groupId>
  4.           <artifactId>javax.servlet</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>org.eclipse.jetty</groupId>
  8.           <artifactId>*</artifactId>
  9.         </exclusion>
  10. </exclusions>
复制代码

(5) 在最后手动增加jetty (hive最下边,zookeeper上边)
   排除低版本jetty,添加hudi指定版本的jetty
  1.     <!-- 增加hudi配置版本的jetty -->
  2.     <dependency>
  3.       <groupId>org.eclipse.jetty</groupId>
  4.       <artifactId>jetty-server</artifactId>
  5.       <version>${jetty.version}</version>
  6.     </dependency>
  7.     <dependency>
  8.       <groupId>org.eclipse.jetty</groupId>
  9.       <artifactId>jetty-util</artifactId>
  10.       <version>${jetty.version}</version>
  11.     </dependency>
  12.     <dependency>
  13.       <groupId>org.eclipse.jetty</groupId>
  14.       <artifactId>jetty-webapp</artifactId>
  15.       <version>${jetty.version}</version>
  16.     </dependency>
  17.     <dependency>
  18.       <groupId>org.eclipse.jetty</groupId>
  19.       <artifactId>jetty-http</artifactId>
  20.       <version>${jetty.version}</version>
  21.     </dependency>
复制代码

⑤修改hudi-0.11.0/packaging/hudi-utilities-bundle/文件夹目次下的pom.xml文件
  1. vim /opt/module/hudi-0.11.0/packaging/hudi-utilities-bundle/pom.xml
复制代码
(1)350行左右 
  1.       <exclusions>
  2.         <exclusion>
  3.           <groupId>org.eclipse.jetty</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.       </exclusions>
复制代码

(2)361行左右
  1.       <exclusions>
  2.         <exclusion>
  3.           <groupId>org.eclipse.jetty</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.       </exclusions>
复制代码

(3)423行左右 hive-service
  1.       <exclusions>
  2.                 <exclusion>
  3.           <artifactId>servlet-api</artifactId>
  4.           <groupId>javax.servlet</groupId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <artifactId>guava</artifactId>
  8.           <groupId>com.google.guava</groupId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>org.eclipse.jetty</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14.         <exclusion>
  15.           <groupId>org.pentaho</groupId>
  16.           <artifactId>*</artifactId>
  17.         </exclusion>
  18.       </exclusions>
复制代码

(4)455行左右 hive-jdbc
  1.       <exclusions>
  2.         <exclusion>
  3.           <groupId>javax.servlet</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>javax.servlet.jsp</groupId>
  8.           <artifactId>*</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>org.eclipse.jetty</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14.       </exclusions>
复制代码

(5)476行左右 hive-metastore
  1.       <exclusions>
  2.         <exclusion>
  3.           <groupId>javax.servlet</groupId>
  4.           <artifactId>*</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>org.datanucleus</groupId>
  8.           <artifactId>datanucleus-core</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.           <groupId>javax.servlet.jsp</groupId>
  12.           <artifactId>*</artifactId>
  13.         </exclusion>
  14.         <exclusion>
  15.           <artifactId>guava</artifactId>
  16.           <groupId>com.google.guava</groupId>
  17.         </exclusion>
  18.       </exclusions>
复制代码

(6)501行左右 hive-common
  1.       <exclusions>
  2.         <exclusion>
  3.           <groupId>org.eclipse.jetty.orbit</groupId>
  4.           <artifactId>javax.servlet</artifactId>
  5.         </exclusion>
  6.         <exclusion>
  7.           <groupId>org.eclipse.jetty</groupId>
  8.           <artifactId>*</artifactId>
  9.         </exclusion>
  10.       </exclusions>
复制代码

(7)520行 最后增加hudi设置版本的jetty
  1.     <!-- 增加hudi配置版本的jetty -->
  2.     <dependency>
  3.       <groupId>org.eclipse.jetty</groupId>
  4.       <artifactId>jetty-server</artifactId>
  5.       <version>${jetty.version}</version>
  6.     </dependency>
  7.     <dependency>
  8.       <groupId>org.eclipse.jetty</groupId>
  9.       <artifactId>jetty-util</artifactId>
  10.       <version>${jetty.version}</version>
  11.     </dependency>
  12.     <dependency>
  13.       <groupId>org.eclipse.jetty</groupId>
  14.       <artifactId>jetty-webapp</artifactId>
  15.       <version>${jetty.version}</version>
  16.     </dependency>
  17.     <dependency>
  18.       <groupId>org.eclipse.jetty</groupId>
  19.       <artifactId>jetty-http</artifactId>
  20.       <version>${jetty.version}</version>
  21.     </dependency>
复制代码

三、执行编译,构建maven

  1. mvn clean package -DskipTests -Dspark3.0 -Dscala-2.12 -Dhadoop.version=3.1.3 -Pflink-bundle-shade-hive3
复制代码
  参数剖析:
    接下来就是等待编译,过程很漫长
………………
………………………………
………………………………………………
………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………………………
………………………………………………………………………………………………………………
就如许等啊等,你等了20分钟左右,出现了下面的画面,就证明你成功了

成功编译之后,进入Hudi自带的客户端
  1. hudi-cli/hudi-cli.sh
复制代码

Hudi的简单使用

一、准存案例

  1. import org.apache.hudi.QuickstartUtils._
  2. import scala.collection.JavaConversions._
  3. import org.apache.spark.sql.SaveMode._
  4. import org.apache.hudi.DataSourceReadOptions._
  5. import org.apache.hudi.DataSourceWriteOptions._
  6. import org.apache.hudi.config.HoodieWriteConfig._
  7. import org.apache.hudi.common.model.HoodieRecord
  8. val tableName = "hudi_trips_cow"
  9. val basePath = "file:///tmp/hudi_trips_cow"
  10. val dataGen = new DataGenerator
  11. val inserts = convertToStringList(dataGen.generateInserts(10))
  12. val df = spark.read.json(spark.sparkContext.parallelize(inserts, 2))
  13. df.write.format("hudi").
  14.   options(getQuickstartWriteConfigs).
  15.   option(PRECOMBINE_FIELD_OPT_KEY, "ts").
  16.   option(RECORDKEY_FIELD_OPT_KEY, "uuid").
  17.   option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
  18.   option(TABLE_NAME, tableName).
  19.   mode(Overwrite).
  20.   save(basePath)
  21. val tripsSnapshotDF = spark.read.format("hudi").load(basePath + "/*/*/*/*")
  22. tripsSnapshotDF.createOrReplaceTempView("hudi_trips_snapshot")
  23. spark.sql("select fare, begin_lon, begin_lat, ts from  hudi_trips_snapshot where fare > 20.0").show()
复制代码
二、将编译好的包拷贝到spark的jars目次中

  1. cp hudi-spark3.1-bundle_2.12-0.12.0.jar /opt/module/spark-3.0.3-yarn/jars
复制代码
三、启动spark-shell,设置启动序列化参数

  1. spark-shell --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" --conf "spark.HoodieRecord=org.apache.hudi.common.model.HoodieRecord"
复制代码

直接复制案例进入spark-shell内里,会得到



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4