网站用户行为分析项目之会话切割(三)

0x00 文章内容

  1. 配置Kryo序列化机制
  2. 使用缓存机制缓存RDD
  3. 调整控制台日志级别

说明:本篇文章主要是对用户行为分析项目的小小调优及完善,后期还会进行代码的重构以及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类型、且需要用户注册要进行序列化的类ClassShuffle的数据量较大或者较为频繁时建议使用

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 总结

  1. 网站用户行为分析项目系列:
    网站用户行为分析项目之会话切割(一)
    网站用户行为分析项目之会话切割(二)
    网站用户行为分析项目之会话切割(三)
    网站用户行为分析项目之会话切割(四)=> 代码重构
    网站用户行为分析项目之会话切割(五)=> 切割会话代码重构
    未完待续!

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航
邵奈一 原创不易,如转载请标明出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值