微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

文章目录

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类型、且需要用户注册要进行序列化的类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.@R_404_3977@HMSHandler=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 | 简书 |

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


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐