【Spark分布式内存计算框架——离线综合实战】3. SparkSession 工具类、广告数据 ETL

news2024/9/25 15:26:18

SparkSession 工具类

在项目工程【cn.itcast.spark.utils】包下创建工具类:SparkUtils,专门构建SparkSession实例对象,具体步骤如下:

  1. 构建SparkConf对象、设置通用相关属性
  2. 判断应用是否本地模式运行,如果是设置值master
  3. 创建SparkSession.Builder对象,传递SparkConf
  4. 判断应用是否集成Hive,如果集成,设置HiveMetaStore地址
  5. 获取SparkSession实例对象

具体编程代码如下所示:

package cn.itcast.spark.utils
import cn.itcast.spark.config.ApplicationConfig
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
/**
* 构建SparkSession实例对象工具类,加载配置属性
*/
object SparkUtils {
/**
* 构建SparkSession实例对象
* @param clazz 应用Class对象,获取应用类名称
* @return SparkSession实例
*/
def createSparkSession(clazz: Class[_]): SparkSession = {
// 1. 构建SparkConf对象
val sparkConf: SparkConf = new SparkConf()
.setAppName(clazz.getSimpleName.stripSuffix("$"))
// 设置输出文件算法
.set("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", "2")
.set("spark.debug.maxToStringFields", "20000")
// 2. 判断应用是否本地模式运行,如果是设置值
if(ApplicationConfig.APP_LOCAL_MODE){
sparkConf
.setMaster(ApplicationConfig.APP_SPARK_MASTER)
// 设置Shuffle时分区数目
.set("spark.sql.shuffle.partitions", "4")
}
// 3. 创建SparkSession.Builder对象
var builder: SparkSession.Builder = SparkSession.builder()
.config(sparkConf)
// 4. 判断应用是否集成Hive,如果集成,设置HiveMetaStore地址
if(ApplicationConfig.APP_IS_HIVE){
builder = builder
.enableHiveSupport()
.config("hive.metastore.uris", ApplicationConfig.APP_HIVE_META_STORE_URLS)
.config("hive.exec.dynamic.partition.mode", "nonstrict")
}
// 5. 获取SparkSession实例对象
val session: SparkSession = builder.getOrCreate()
// 6. 返回实例
session
}
}

其中应用开发本地模式运行时,设置SparkSQL Shuffle Partitions数目为4,方便快速运行,在测试和生成环境使用spark-submit提交应用时,通过–conf指定此属性的值。

配置log4j日志文件
Spark中提供了log4j的方式记录日志,可以在【$SPARK_HOME/conf/】下,将【log4j.properties.template】文件copy为【log4j.properties】来启用log4j配置,将其放置Project工程【scr/main/resouces】下面,具体内容如下,随时调整日志级别:

# Set everything to be logged to the console
log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=WARN
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with H
ive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
# Parquet related logging
log4j.logger.org.apache.parquet.CorruptStatistics=ERROR
log4j.logger.parquet.CorruptStatistics=ERROR

开始应用时,设置【log4j.rootCategory】为【INFO、DEBUG】,方便查看错误信息。

第二章 广告数据 ETL

实际企业项目中,往往收集到数据,需要进一步进行ETL处理操作,保存至数据仓库中,此【综合实战】对广告数据中IP地址解析为省份和城市,最终存储至Hive分区表中,业务逻辑如下:
在这里插入图片描述
其中涉及两个核心步骤:

  • 第一个、IP地址解析,使用第三方库完成;
  • 第二个、存储ETL数据至Hive分区表,采用列式Parquet存储;

2.1 IP 地址解析

解析IP地址为【省份、城市】,推荐使用【ip2region】第三方工具库, 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java、php、c、python、nodejs、golang、c#等查询绑定和Binary、B树、内存三种查询算法。

官网网址:https://gitee.com/lionsoul/ip2region/,Ip2region特性具有如下四个方面的特性:
1)、99.9%准确率
在这里插入图片描述
2)、标准化的数据格式
在这里插入图片描述
3)、体积小
包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。

4)、查询速度快
在这里插入图片描述
引入使用IP2Region第三方库:

  • 第一步、复制IP数据集【ip2region.db】到工程下的【dataset】目录
    在这里插入图片描述

  • 第二步、在Maven中添加依赖

<!-- 根据ip转换为省市区 -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
  • 第三步、ip2region的使用
    在这里插入图片描述

范例演示:传入IP地址解析获取省份和城市,代码思路如下:

a. 创建DbSearch对象,传递字典文件
b. 依据IP地址解析
c. 分割字符串,获取省份和城市

具体代码ConvertIpTest.scala:

package cn.itcast.spark.test.ip
import org.lionsoul.ip2region.{DataBlock, DbConfig, DbSearcher}
/**
* 测试使用ip2Region工具库解析IP地址为省份和城市
*/
object ConvertIpTest {
def main(args: Array[String]): Unit = {
// a. 创建DbSearch对象,传递字典文件
val dbSearcher = new DbSearcher(new DbConfig(), "dataset/ip2region.db")
// b. 依据IP地址解析
val dataBlock: DataBlock = dbSearcher.btreeSearch("182.92.208.23")
// 中国|0|海南省|海口市|教育网
val region: String = dataBlock.getRegion
println(s"$region")
// c. 分割字符串,获取省份和城市
val Array(_, _, province, city, _) = region.split("\\|")
println(s"省份 = $province, 城市 = $city")
}
}

运行结果如下:
在这里插入图片描述

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

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

相关文章

04 DC-DC变换器(DCDC Converter / Switched-mode Power Supply)简介

文章目录0、DC-DC变换器概述1、DC-DC变换器的基本结构BuckBoostBuck-BoostBoost-Buck小结2、换流与特性分析分析Buck电路分析Boost电路分析Buck-Boost电路&#xff08;前级Buck后级Boost&#xff09;分析Cuk电路&#xff08;前级Boost后级Buck组合&#xff09;小结3、换流与特性…

OAuth2在项目的应用-扫码登录

业界提供了OAUTH的多种实现如PHP、JavaScript&#xff0c;Java&#xff0c;Ruby等各种语言开发包&#xff0c;Oauth协议目前发展到2.0版本&#xff0c;1.0版本过于复杂&#xff0c;2.0版本已得到广泛应用。参考&#xff1a;https://baike.baidu.com/item/oAuth/7153134?fralad…

2020蓝桥杯真题含2天数(填空题) C语言/C++

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝特别喜欢 2&#xff0c;今年是公元 2020 年&#xff0c;他特别高兴&#xff0c;因为每天日历上都可以看到 2。 如果日历中只显示年月日&#xff0c;请问从公元 …

转录组丨limma差异表达分析,绘制火山图和热图

limma差异表达分析 本篇笔记的内容是在R语言中利用limma包进行差异表达分析&#xff0c;主要针对转录组测序得到的基因表达数据进行下游分析&#xff0c;并将分析结果可视化&#xff0c;绘制火山图和热图 文章目录limma差异表达分析[toc]环境部署与安装输入数据准备差异表达分析…

java JMM 内存屏障

内存屏障的目的 每个CPU都会有自己的缓存&#xff08;有的甚至L1,L2,L3&#xff09;&#xff0c;缓存的目的就是为了提高性能&#xff0c;避免每次都要向内存取。但是这样的弊端也很明显&#xff1a;不能实时的和内存发生信息交换&#xff0c;分在不同CPU执行的不同线程对同一…

你真的需要文档管理软件吗?

什么是文档管理软件&#xff1f; 文档管理软件 (DMS) 是一种数字解决方案&#xff0c;可帮助组织处理、捕获、存储、管理和跟踪文档。 通过严格管理您的关键业务信息&#xff0c;您可以开发以稳定、可预测、可衡量的方式启动、执行和完成的流程。 如果没有功能齐全的文档管理软…

堆-优先队列priorityqueue原理和应用

java中PriorityQueue优先队列 优先队列 &#xff1a;底层是用数组实现的二叉堆&#xff0c;因为堆通常分为大顶堆或者小顶堆&#xff0c;所以优先队列可以获取每次出来的都是最大或者最小元素&#xff08;对象可以实现比较器&#xff0c;Java优先级队列默认每次取出来的为最小元…

RocketMQ-NameServer详解

RocketMQ 路由管理 服务注册及服务发现由NameServer提供。 服务发现&#xff1a; 分布式服务 SOA&#xff08;全称&#xff1a;Service Oriented Architecture 面向服务的架构&#xff09;构体系中会有服务注册中心&#xff0c;分布式服务 SOA 的注册中心主要提供服务调用的解析…

10套“2023年软考备考资料”送给你

距离软考考试越来越近了&#xff0c;备考的形势越发紧张了。考点那么多&#xff0c;我们需要抓出常考的大部分知识点。 ​为此&#xff0c;为大家整理了《2023年软考免费备考资料》&#xff0c;内含软考各科目不同类型共10套备考资料。 ​ 第1套&#xff1a;早鸟学习计划&am…

华为OD机试题,用 Java 解【密室逃生游戏】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

使用matlab生成符合哈工大学报的图片格式

前言 去年投稿了哈尔滨工业大学学报&#xff0c;因为模板问题没有过于要求投稿的细节&#xff0c;所以出图都是按照自己的风格来的。录用前的最后要求时需要修改图片格式&#xff0c;具体是表示成函数图&#xff0c;并且横纵坐标保持相同的精确位数。我想那么多图片我咋搞呀&a…

Elasticsearch(一)——部署

最近遇到一个需求&#xff0c;需要用到Elasticsearch&#xff0c;于是开始学习Elasticsearch。 我是个学东西先学实操再理论的人。所以开始着手安装Elasticsearch&#xff0c;并进行记录。 目录一、Elasticsearch部署Windows安装1 下载2 解压3 配置文件3.1 jvm.options3.2 elas…

没有公网IP,如何实现内网用友ERP的外网访问 ?

用友是全球领先的企业云服务与软件提供商&#xff0c;在财务、人力、供应链、采购、制造、营销、研发、项目、资产、协同等领域为客户提供数字化、智能化、社会化的企业云服务产品与解决方案。 U8C是用友针对成长型、创新型企业&#xff0c;提供企业级ERP整体解决方案。在系统…

【软件测试】自动化测试的追求,水土不服?看看资深测试咋说的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 大部分测试初学者入…

mysql存储位置 、数据类型

在线版 mysql0.80 版本 数据库存放位置默认为:C:\ProgramData\MySQL\MySQL Server 8.0 mysql数据类型(来自黑马) 数据类型大小描述备注TINYINT1 byte小整数值SMALLINT2 bytes大整数值MEDIUMINT3 bytes大整数值INT或INTEGER4 bytes大整数值age intBIGINT8 bytes极大整数值F…

MQRabbitMQ

介绍 MQ&#xff0c;中文是消息队列&#xff08;MessageQueue&#xff09;&#xff0c;字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 几种常见MQ的对比 RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java…

车载开发知识交流【学习路线】

前言 在2023国内百废待兴&#xff1b;经济复苏的号召一直在响应&#xff0c;这对于压抑了三年的人民来说无疑是福音。这篇我们主要说一下拉动经济的其中大板块——车企&#xff1b;我们知道我们最大的经济除了房地产&#xff0c;第二就是车企。而在造车领域中也不断的加入了许…

CF1692C Where‘s the Bishop? 题解

CF1692C Wheres the Bishop? 题解题目链接字面描述题面翻译题目描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692C 字面描述 题面翻译 题目描述 有一个888\times888的棋盘&#xff0c;列编号从…

【Android视频号② 搜索用户】

上一节我们已经拿到了视频号个人主页信息 但是发现传过来的用户名是一个以V2开头的数据 接下来我们就需要根据用户名去获取V2数据 DDMS问题 上一节根据ddms 可以很好的定位到视频号触发点 但是很多人会遇到一个问题就是 Monitor 使用 如果打开报错 需要装Java1.8 版本太高了…

运维排查篇 | Linux 连接跟踪表满了怎么处理

nf_conntrack (在老版本的 Linux 内核中叫 ip_conntrack )是一个内核模块&#xff0c;用于跟踪一个网络连接的状态 一旦内核 netfilter 模块 conntrack 相关参数配置不合理&#xff0c;导致 nf_conntrack table full &#xff0c;就会出现丢包、连接无法建立的问题 这个问题其…