文章目录
0x00 文章内容
- 配置Kryo序列化机制
- 使用缓存机制缓存RDD
- 调整控制台日志级别
说明:本篇文章主要是对用户行为分析项目的小小调优及完善,后期还会进行代码的重构以及Debug过程。
0x01 配置Kryo序列化机制
1. 情景解析
a. 回顾第一篇文章:网站用户行为分析项目之会话切割(一),我们当初序列化TrackerLog
类时,实现的接口是Java自带的,自带的接口性能不好。而且,当我们误删或者修改了类,然后重新编译后,重新生成的类又是没有实现Serializable
的,此时又要修改一次,很麻烦。
b. 开启Kryo序列化机制的方式有三种:
- 在
spark-default.conf
添加配置项:
spark.serializer
=>org.apache.spark.serializer.KryoSerializer
- 代码里添加:
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
- 执行时添加参数
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer
c. 我们这里演示直接写在代码里,加上之后可以将之前写在代码里的序列化代码删掉了
d. 序列化机制Java与Kryo的对比
类别 | 优点 | 缺点 | 备注 |
---|---|---|---|
java | 兼容性好、和Scala更好融合 | 序列化性能较低、占用内存空间大(一般是Kryo序列化机制的10倍) | 默认的序列化机制 |
Kryo | 序列化速度快、占用空间小(即更紧凑) | 不支持所有的Serializable类型、且需要用户注册要进行序列化的类Class | Shuffle的数据量较大或者较为频繁时建议使用 |
0x02 使用缓存机制缓存RDD
1. 缓存RDD
a. 回顾SessionCutETL
代码
val parsedLogRDD: RDD[TrackerLog] = rawRDD.flatMap( line => RawLogParserUtil.parse(line))
.filter(trackerLog => logTypeSet.contains(trackerLog.getLogType.toString))
val cookieGroupRDD: RDD[(String, Iterable[TrackerLog])] = parsedLogRDD.groupBy(trackerLog => trackerLog.getCookie.toString)
parsedLogRDD.map((null, _)).saveAsNewAPIHadoopFile(trackerLogOutputPath,
classOf[Void], classOf[TrackerLog], classOf[AvroParquetOutputFormat[TrackerLog]]
)
我们发现parsedLogRDD在多处都会使用到,此时我们可以用到缓存机制,提高我们的性能,如:
但如果parsedLogRDD数据量很大的时候,内存会不足,所以我们可以设置一个缓存策略,我们此处使用persist:
//缓存parsedLogRDD
parsedLogRDD.persist(StorageLevel.MEMORY_AND_DISK)
0x03 调整控制台日志级别
1. 调整控制台日志级别的方式
为了让显示结果更简洁,我们可以设置控制台打印的类型。
方法一:
在代码里加上这句:
sc.setLogLevel("ERROR")
但是会发现只会不打印执行代码之后的,而在结果之前的还是会打印处理,不是很简介,所以,我们可以用另外一种方式。
方法二:
新建一个log4j.properties
,放于resources
2. 编写log4j.properties文件
a. 完整文件
log4j.rootCategory=ERROR, 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
log4j.logger.org.apache.spark.repl.Main=WARN
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
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
b. 加入到项目的resource
文件夹,尝试执行代码,会发现IDEA下面的控制台显示的内容简介了很多。
c. 其实,此文件就是$SPARK_HOME/conf
路径下的log4j.properties.template
,只是修改了名字然后将注释去掉,将log4j.rootCategory=INFO, console
的INFO改成了ERROR而已。
2. 调整控制台日志级别
0xFF 总结
- 网站用户行为分析项目系列:
网站用户行为分析项目之会话切割(一)
网站用户行为分析项目之会话切割(二)
网站用户行为分析项目之会话切割(三)
网站用户行为分析项目之会话切割(四)=> 代码重构
网站用户行为分析项目之会话切割(五)=> 切割会话代码重构
未完待续!
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。