【Spark分布式内存计算框架——离线综合实战】2. 业务需求

news2024/11/27 2:27:07

1.3 业务需求

对广告数据进行初步ETL处理和业务报表统计分析,整体业务需求如下图所示:
在这里插入图片描述
两个主要方面的业务:
第一个、数据【ETL 处理】

  • 依据IP地址,调用第三方库解析为省份province和城市city;
  • 将ETL后数据保存至PARQUET文件(分区)或Hive 分区表中;

第二个、数据【业务报表】

  • 读取Hive Table中广告数据,按照业务报表需求统计分析,使用DSL编程或SQL编程;
  • 将业务报表数据最终存储MySQL Table表中,便于前端展示;

上述两个业务功能的实现,使用SparkSQL进行完成,最终使用Oozie和Hue进行可视化操作调用程序ETL和Report自动执行。

1.4 环境搭建

整个综合实战主要结合广告业务数据及简单报表需求,熟悉SparkCore和SparkSQL如何进行离线数据处理分析,整合其他大数据框架综合应用,需要准备大数据环境及应用开发环境。

大数据环境
通过上述业务需求分析可知,涉及到如下软件安装,全部安装在一台虚拟机中,部署伪分布式环境,建议虚拟机内存大小至少为4GB。

1)、基础软件:jdk1.8.0_241、scala-2.12.10、MySQL-8.0.19
2)、大数据软件: hadoop-2.6.0-cdh5.16.2 、 hive-1.1.0-cdh5.16.2 、 spark-2.4.5-bin-cdh5.16.2-2.11 、oozie-4.1.0-cdh5.16.2、hue-3.9.0-cdh5.16.2

针对此离线综合实战来说,大数据环境已经部署完成,打开虚拟机【spark-node01】,进入快照管理,选择恢复至【7、Spark 离线综合实战】即可。
在这里插入图片描述
启动各个框架服务命令如下,开发程序代码时为本地模式LocalMode运行,测试生产部署为YARN集群模式运行,集成Hive用于进行表的元数据管理,使用Oozie和Hue调度执行程序:

# Start HDFS
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
# Start YARN
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
# Start MRHistoryServer
mr-jobhistory-daemon.sh start historyserver
# Start Spark HistoryServer
/export/server/spark/sbin/start-history-server.sh
# Start Oozie和Hue
oozied.sh start
hue-daemon.sh start
# Start HiveMetaStore 和 HiveServer2
hive-daemon.sh metastore
# Start Spark JDBC/ODBC ThriftServer
/export/server/spark/sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000 \
--hiveconf hive.server2.thrift.bind.host=node1.itcast.cn \
--master local[2]
# Start Beeline
/export/server/spark/bin/beeline -u jdbc:hive2://node1.itcast.cn:10000 -n root -p 123456

启动SparkSQL JDBC/ODBC ThriftServer 分布式SQL引擎,使用beeline命令行客户端连接(也可以使用其他可视化工具连接),方便对Hive表数据管理及开发测试。

应用开发环境
在前面创建Maven Project工程,创建Maven Module模块,pom.xml文件中添加相关依赖:

<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
<repository>
<id>jboss</id>
<url>http://repository.jboss.com/nexus/content/groups/public</url>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<scala.version>2.11.12</scala.version>
<scala.binary.version>2.11</scala.binary.version>
<spark.version>2.4.5</spark.version>
<hadoop.version>2.6.0-cdh5.16.2</hadoop.version>
<mysql.version>8.0.19</mysql.version>
</properties>
<dependencies>
<!-- 依赖Scala语言 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- Spark Core 依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- Spark SQL 依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- Spark SQL 与 Hive 集成 依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- Hadoop Client 依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- MySQL Client 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 根据ip转换为省市区 -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 管理配置文件 -->
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
</dependencies>
<build>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<!-- Maven 编译的插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

按照应用开发分层结构,需要在src源码目录下创建相关目录和包,具体如下:
在这里插入图片描述
在使用IDEA开发应用时,建议从本地文件系统LocalFS加载数据和应用运行在本地模式LocalMode,开发完成以后测试时从HDFS加载数据和应用运行YARN集群,所以需要通过属性配置文件:【config.properties】,控制应用程序数据加载与运行模式。

1.5 项目初始化

如上述业务分析所示,构建Spark应用的项目,首先需要考虑两个方面初始化:

第一个方面、构建SparkSession实例对象,数据加载、运行模式及集成Hive;
在这里插入图片描述
第二个方面、属性配置文件,存储应用中相关配置,方便开发、测试及生产环境修改;
在这里插入图片描述
接下来首先加载获取属性文件中属性值,再构建SparkSession实例对象,为后续业务开发做好基础。

加载属性文件
对于一个完整的工程来说,如果所有的配置都指定到代码里,就会造成:
在这里插入图片描述
综上所述,需要一个配置文件工具类,来专门获取配置文件的内容。Typesafe的Config库,纯Java写成、零外部依赖、代码精简、功能灵活、API友好。支持Java properties、JSON、JSON超集格式以及环境变量,它也是Akka的配置管理库。默认加载classpath下的application.conf,application.json和application.properties文件,通过ConfigFactory.load()加载,也可指定文件地址,添加Maven依赖至pom.xml文件:

<!-- 管理配置文件 -->
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.2.1</version>
</dependency>

属性配置文件【config.properties】内容如下:

# local mode
app.is.local=true
app.spark.master=local[4]
## Hive MetaStore
app.is.hive=true
app.hive.metastore.uris=thrift://node1.itcast.cn:9083
# mysql config
mysql.jdbc.driver=com.mysql.cj.jdbc.Driver
mysql.jdbc.url=jdbc:mysql://node1.itcast.cn:3306/?serverTimezone=UTC&characterEncoding=utf8&useUnicod
e=true
mysql.jdbc.username=root
mysql.jdbc.password=123456
# 广告业务数据存储路径
datas.path=dataset/pmt.json
##datas.path=hdfs://node1.itcast.cn:8020/spark/dataset/pmt.json
# 字典数据
ipdata.region.path=dataset/ip2region.db
##ipdata.region.path=hdfs://node1.itcast.cn:8020/spark/dataset/ip2region.db

其中应用开发本地模式运行时,从本地文件系统【当前工程目录下dataset】加载数据,测试生产时从HDFS文件系统【/spark/dataset】加载数据。
在这里插入图片描述
编写加载属性文件工具类:ApplicationConfig,位于【cn.itcast.spark.config】包,具体代码如下:

package cn.itcast.spark.config
import com.typesafe.config.{Config, ConfigFactory}
/**
* 加载应用Application属性配置文件config.properties获取属性值
*/
object ApplicationConfig {
// 加载属性文件
private val config: Config = ConfigFactory.load("config.properties")
/*
运行模式,开发测试为本地模式,测试生产通过--master传递
*/
lazy val APP_LOCAL_MODE: Boolean = config.getBoolean("app.is.local")
lazy val APP_SPARK_MASTER: String = config.getString("app.spark.master")
/*
是否集成Hive及Hive MetaStore地址信息
*/
lazy val APP_IS_HIVE: Boolean = config.getBoolean("app.is.hive")
lazy val APP_HIVE_META_STORE_URLS: String = config.getString("app.hive.metastore.uris")
/*
数据库连接四要素信息
*/
lazy val MYSQL_JDBC_DRIVER: String = config.getString("mysql.jdbc.driver")
lazy val MYSQL_JDBC_URL: String = config.getString("mysql.jdbc.url")
lazy val MYSQL_JDBC_USERNAME: String = config.getString("mysql.jdbc.username")
lazy val MYSQL_JDBC_PASSWORD: String = config.getString("mysql.jdbc.password")
// 数据文件存储路径
lazy val DATAS_PATH: String = config.getString("datas.path")
// 解析IP地址字典数据文件存储路径
lazy val IPS_DATA_REGION_PATH: String = config.getString("ipdata.region.path")
}

每个属性变量前使用lazy,当第一次使用变量时,才会进行初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消费升级趋势下,平台如何在广告电商模式中攫取新流量

如今电商平台飞速发展&#xff0c;越来越多的人加入电商运营的行列&#xff0c;同行竞争逐渐变得激烈起来&#xff0c;为了能够让平台有更多的展现机会&#xff0c;提升平台的商品转化率&#xff0c;大家都很重视平台的优化&#xff0c;因为一个好的平台可以给自身带来更多的流…

比特数据结构与算法(第四章_上)树和二叉树和堆的概念及结构

1.树概念及结构1.1树的概念树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n > 0&#xff09;个有限节点组成的一个具有层次关系的集合。那么为什么叫 "树" 呢&#xff1f; &#xff08;节点也可以称结点&#xff0c;建议称结点&#xff0c;和结构体对…

REDIS中的缓存穿透,缓存击穿,缓存雪崩原因以及解决方案

需求引入一般在项目的开发中,都是使用关系型数据库来进行数据的存储&#xff0c;通常不会存在什么高并发的情况&#xff0c;可是一旦涉及大数据量的需求&#xff0c;比如商品抢购&#xff0c;网页活动导致的主页访问量瞬间增大&#xff0c;单一使用关系型数据库来保存数据的系统…

多孔弹性材料中传播的膨胀波方法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

海量并发低延时 RTC-CDN 系统架构设计(下)

上半部分内容&#xff1a;海量并发低延时 RTC-CDN 系统架构设计&#xff08;上&#xff09;低延时 RTC-CDN 系统的架构传统 CDN 直播发展多年&#xff0c;为了优化延时&#xff0c;业界基本上朝两大优化方向&#xff1a;优化传输层协议和在传输层协议的基础上优化应用层协议。R…

Hadoop环境搭建(1)

一、在已安装的虚拟机上面进行修改&#xff08;以CentOS 7为例&#xff09;①修改主机名查看自己主机名&#xff0c;命令hostname第一种修改主机名方法&#xff0c;命令vi /etc/hostname第二种修改主机名方法&#xff0c;命令hostnamectl set -hostname 自定义主机名可以更改为…

简单介绍如何使用robotium进行自动化测试

创建一个简单的工程作为被测程序&#xff0c;运行后显示如下界面&#xff1a; 2.创建一个Test Project 1). 打开eclipse&#xff0c;选择File->New->Project…->Android Test Project&#xff0c;点击Next。 2). 在Test Project Name中输入测试工程的名称&#xff…

华为HCIP-Datacom认证题库(H12-821)

第一套&#xff08;100题&#xff09; 1. &#xff08;单选题&#xff09;下面关于0SPF的特殊区域&#xff0c;描述错误的是: A.Totally Stub Area允许ABR发布缺省的三类LSA,不接受五类LSA和细化三类LSA B.NSSA Area和Stub区域的不同在于该区域允许自治系统外部路由的引入&…

「实践总结」订单超时自动取消

在进行开发的过程中&#xff0c;在开发的时候&#xff0c;有遇到相关的延时支付相关的问题&#xff0c;在解决延时支付的相关的问题的时候&#xff0c;会有很多种的解决办法&#xff0c;现在就讲对应的解决办法先进行相关的总结操作&#xff1b;「引言」在开发中&#xff0c;往…

mysql索引失效的几种情况

失效的几种情况 1、select * from xxx 2、索引列上有计算 3、索引列上有函数 4、like左边包含‘%’ 5、使用or关键字 6、not in和not exists 7、order by 8、不满足最左匹配原则 给code、age和name这3个字段建好联合索引&#xff1a;idx_code_age_name。 该索引字段的顺…

ChatGPT告诉你:项目管理能干到60岁吗?

早上好&#xff0c;我是老原。这段时间最火的莫过于ChatGPT&#xff0c;从文章创作到论文写作&#xff0c;甚至编程序&#xff0c;简直厉害的不要不要的。本以为过几天热度就自然消退了&#xff0c;结果是愈演愈烈&#xff0c;热度未减……大家也从一开始得玩乐心态&#xff0c…

注意,这本2区SCI期刊最快18天录用,还差一步录用只因犯了这个错

发表案例分享&#xff1a; 2区医学综合类SCI&#xff0c;仅18天录用&#xff0c;录用后28天见刊 2023.02.10 | 见刊 2023.01.13 | Accepted 2023.01.11 | 提交返修稿 2022.12.26 | 提交论文至期刊部系统 录用截图来源&#xff1a;期刊部投稿系统 见刊截图来源&#xff1a…

npm link

正文npm link的用法假如我们想自己开发一个依赖包&#xff0c;以便在多个项目中使用。一种可行的方法&#xff0c;也是npm给我们提供的标准做法&#xff0c;那就是我们独立开发好这个 "依赖包"&#xff0c;然后将它直接发布到 npm镜像站 上去&#xff0c;等以后想在其…

熟读阿里总结的 Java10w 字总结,15 天拿下 5 个大厂 offer(阿里,美团,字节...)

Java 面试都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它也是可以决定一次面试的成败的&#xff0c;那么在面试的时候你会如何介绍自己、熟练…

Sms多平台短信服务商系统~完成阿里云短信服务发送可自行配置

1.项目中引入Maven 阿里云地址 不同编程语言都有对应的SDK,你们下载自己需要的即可。 pom.xml中添加maven坐标 <!--阿里云短信服务--><dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-dysmsapi20170525</artifactId>…

八、CSS新特性二

文章目录一、CSS3多背景和圆角二、怪异盒子模型三、多列属性四、H5多列布局瀑布流五、CSS3线性渐变5.1 线性渐变5.2 径向渐变六、CSS3过渡动画七、CSS3 2D八、CSS3动画一、CSS3多背景和圆角 css3多背景&#xff0c;表示CSS3中可以添加多个背景。 CSS3圆角 border-radius: 0px;…

日本机载激光雷达测深进展(二)机载激光雷达测深经验

日本海岸警卫队海洋情报部&#xff08;JHOD&#xff09;拥有14年的机载激光雷达测深(ALB)经验。由于ALB调查高效率和高分辨率&#xff0c;JHOD已将ALB应用于各种用途&#xff0c;如制图、海啸受灾港口的恢复重建、安全监测和火山活动研究。本文简要描述了JHOD激光雷达测深系统的…

基于Hibernate对数据库表的单表查询

基于Hibernate对数据库表的单表查询 1.依赖 1.1jar包 1.2配置文件。persistence.xml <?xml version"1.0" encoding"UTF-8"?> <persistence version"2.1"xmlns"http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi"…

docker 部署centos7.9并打包成docker

下载centos基础镜像 docker pull centos:centos7 运行镜像 docker run -itd --name centos-test -p 60001:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it ebec90068696 /bin/bash 配置容器信息 安装ssh服务和网络必须软件 yum install net-to…

Linux基础命令-pstree树状显示进程信息

Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…