Spark大型电商项目实战-及其改良(1) 比对sparkSQL和纯RDD实现的结果
代码存在码云:https://coding.net/u/funcfans/p/sparkProject/git
代码主要学习https://blog.csdn.net/u012318074/article/category/6744423/1这里的
发现样例作为正式项目来说效率太低了,为了知识点而知识点.对原代码做了一定优化
第1个项目:用户访问session随机抽取统计
用户数量一般在100(测试环境)10的8次方(生产环境),不管是哪种都比访问数据少的多.一般这种数据量可以装入内存,使用Map一一映射,并广播这个变量,实现map join并防止数据倾斜
某些确定要过滤得数据(本例的访问数据要过滤访问时间和关键词,用户数据要过滤性别和年龄),就在sparkSQL初始化rdd阶段就过滤掉(按原例在访问数据和用户数据join之后才执行filter算子,这中间要过多少无效数据,还有后面的coalesce优化还要占用时间)
无法避免的数据倾斜(本例的所有join都满足map join优化条件,所以要优化的地方都是dintinct和bykey系算子),使用局部聚合的方式可以缓解倾斜
原例为了展示foreachPartition的重要性,故意把数据库的写入部分使用foreach算子进行操作,这个地方使用foreachPartition重写之后,执行效率提高了3倍(去年12月的执行数据,现在不知道咋地开这个项目会java heap space,大概是数据量调太多了),最后的foreach(Partition)算子是对数据库的I/O操作,量还不小,相比内部的运算来说,这个操作的执行时间太长了。大数据分析最好不要一次性导出大量数据,能在集群里面分析出信息量较少的结果导出最好
原先的性能数据没保存,现在还因为谜之bug的问题(其实就是数据量的问题,只是卡在flatMapToPair执行session随机抽取这个步骤一直没执行完上了)没有执行结果
第3个项目:不同地区的top10商品统计
这里数据处理都发生在集群内,导出的数据量少,可以加大数据量测试。
同样的,这个项目也是为知识点而知识点。所以要亲自实践一下,sparkSQL和纯RDD实现哪个快,顺带考查自己的RDD优化功底。
此处用的均为同一数据源
AreaTop3ProductSpark这个类,是作者的原例
AreaTop3ProductRDD这个类,是本人对业务的分析转换成的纯RDD实现
AreaTop3ProductRDDSpeedUp这个类,是对上一个类的进一步优化,观察优化效果
AreaTop3ProductSql这个类,是本人对业务的分析转换成的纯sparkSQL实现
结果如下:
| Job Id | Description | Submitted | Duration | Stages: Succeeded/Total | Tasks (for all stages): Succeeded/Total |
|---|---|---|---|---|---|
| 4 | collect at AreaTop3ProductSql.java:99 | 2019/01/29 11:19:04 | 5 s | 7/7 |
883/883 (2 failed)
|
| 3 | collect at AreaTop3ProductRDDSpeedUp.java:371 | 2019/01/29 11:19:02 | 0.8 s | 3/3 |
123/123
|
| 2 | collect at AreaTop3ProductRDDSpeedUp.java:212 | 2019/01/29 11:19:02 | 28 ms | 1/1 |
1/1
|
| 1 | collect at AreaTop3ProductRDD.java:353 | 2019/01/29 11:19:01 | 1 s | 7/7 |
247/247
|
| 0 | collect at AreaTop3ProductSpark.java:108 | 2019/01/29 11:18:45 | 14 s | 7/7 |
724/724 (2 failed)
|
(直接复制history server的html代码)
原例的执行效率最慢,纯SQL只快1.8倍,可见hivecontext中的dataframe和RDD相互转换耗费的时间不短;并且使用了sql的应用都有failed,进入内部可以发现,javaRDD步骤各有1个出现(Too many open files)错误,可见hivecontext需要与本地文件系统交互
纯RDD的执行时间均将近1秒,不过speedUp的优化效果很不稳定,12月的测试发现。某些数据下用了speedUp的地方反而会拖累执行效率
下节重点分析纯RDD的运行过程
Spark大型电商项目实战-及其改良(1) 比对sparkSQL和纯RDD实现的结果的更多相关文章
- Spark大型电商项目实战-及其改良之番外(1)-将spark前端页面效果高效拷贝至博客
Spark大型电商项目实战-及其改良这个系列的时间轴展示图一直在变....1-3篇是用图直接表示时间轴,用一段简陋的html代码表示时间表.第4篇开始才是用比较完整的前端效果,能移动.缩放时间轴,鼠标 ...
- Spark大型电商项目实战-及其改良(3) 分析sparkSQL语句的性能影响
之前的运行数据被清除了,只能再运行一次,对比一下sparkSQL语句的影响 纯SQL的时间 对应时间表 th:first-child,.table-bordered tbody:first-child ...
- Spark大型电商项目实战-及其改良(4) 单独运行程序发现的问题
之前的运行结果比对发现,有1个函数的作用在2个job里面是相同的,但是对应的计算时间却差太远 于是把4个job分开运行.虽说使用的数据不同,但是生成数据的生成器是相同的,数据排布差距不大,数据量也是相 ...
- Spark大型电商项目实战-及其改良(2) RDD优化效果不稳定的真正原因
首先看没有map join的第2任务: 时间线如下 接着是对应id的算子计算时间表 Stage Id Description Submitted Duration Tasks: Succeeded/T ...
- 16套java架构师,高并发,高可用,高性能,集群,大型分布式电商项目实战视频教程
16套Java架构师,集群,高可用,高可扩展,高性能,高并发,性能优化,设计模式,数据结构,虚拟机,微服务架构,日志分析,工作流,Jvm,Dubbo ,Spring boot,Spring cloud ...
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- SpringBoot电商项目实战 — ElasticSearch接入实现
如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...
- SpringBoot电商项目实战 — 前后端分离后的优雅部署及Nginx部署实现
在如今的SpringBoot微服务项目中,前后端分离已成为业界标准使用方式,通过使用nginx等代理方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多 ...
- C# 大型电商项目性能优化(一)
经过几个月的忙碌,我厂最近的电商平台项目终于上线,期间遇到的问题以及解决方案,也可以拿来和大家多做交流了. 我厂的项目大多采用C#.net,使用逐渐发展并流行起来的EF(Entity Framewor ...
随机推荐
- 安卓动态分析工具【Android】3D布局分析工具
https://blog.csdn.net/fancylovejava/article/details/45787729 https://blog.csdn.net/dunqiangjiaodemog ...
- Java中“==”和“equals()”的区别
“==”比较的是变量所指向的对象,当S1在内存中定义以后,再定义s2的时候s2所指向的值是定义s1时候所创建的,而不是又在内存创建了一个“Monday”. “equals”比较的是对象所指向的值,所以 ...
- iOS代码组件化--利用cocoaPods创建私有库
如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...
- 平安银行在开源技术选型上的思考和实践 RocketMQ
小结: 1. https://mp.weixin.qq.com/s/z_c5D8fvHaYvHSczm0nYFA 平安银行在开源技术选型上的思考和实践 平安银行·吴建峰 阿里巴巴中间件 3月7日 随着 ...
- c#4.8-4.11学习总结
4.8讲的是static 关键字.它用于修饰类 ,字段 ,属性,方法和构造方法等.被它修饰的类称为静态类,成员称为静态成员. 先说静态字段,它是普通字段前面加个static,它不属于任何对象,只属于 ...
- 关于php得到参数数据
通过GET得到参数数据 $_SERVER['QUERY_STRING'] 获取?后面的值 $_SERVER['SCRIPT_NAME'] 获取当前脚本的路径 具体参数通过_GET['参数']获得 fi ...
- 转载:Android RecyclerView 使用完全解析 体验艺术般的控件
转自:https://blog.csdn.net/lmj623565791/article/details/45059587
- service order
1: SRVO Service Order compress: 本地部署,客户能够看到后台代码,transaction type,改代码等. SVO1 Service Order ...
- python smtp 发邮件 添加附件
# -*- coding:utf-8 -*- # __author__ = 'justing' import os import smtplib from email.mime.multipart i ...
- 短信外部浏览器H5链接一键跳转微信打开任意站
今天讲讲微信跳转的那些事情,这项技术最早出现在在线广告上面,可以从外部引流到微信并打开微信内置浏览器然后打开一个指定的网页地址,在这个网页里面可以放任何想推广的内容,可以是引导文案.活动内容,或者是一 ...