Spark大型电商项目实战-及其改良(1) 比对sparkSQL和纯RDD实现的结果

摘要:
代码云:https://coding.net/u/funcfans/p/sparkProject/git代码的主要学习https://blog.csdn.net/u012318074/article/category/6744423/1这里的发现示例作为正式项目效率太低。知识点是针对知识点的。原始代码经过了一定程度的优化。项目1:访问会话的用户数量通常为100(测试环境)

代码存在码云: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 IdDescriptionSubmittedDurationStages: Succeeded/TotalTasks (for all stages): Succeeded/Total
4collect at AreaTop3ProductSql.java:992019/01/29 11:19:045 s7/7
883/883 (2 failed)
 
 
3collect at AreaTop3ProductRDDSpeedUp.java:3712019/01/29 11:19:020.8 s3/3
123/123
 
 
2collect at AreaTop3ProductRDDSpeedUp.java:2122019/01/29 11:19:0228 ms1/1
1/1
 
 
1collect at AreaTop3ProductRDD.java:3532019/01/29 11:19:011 s7/7
247/247
 
 
0collect at AreaTop3ProductSpark.java:1082019/01/29 11:18:4514 s7/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实现的结果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于pocsuite的使用给25岁男人的忠告:有种责任感.下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据库高并发的设计

参考博文 现在公司要做一个数据库方案,总体目标是要存约 200T 的数据,机器不是问题。http://topic.csdn.net/u/20100317/12/fecc83b6-4849-48cf-a20b-24d552fd1cd0_2.html如何构建千万用户级别后台数据库架构设计的思路http://www.mysqlops.com/2011/11/22...

LVM 数据迁移

当用作LVM的某磁盘需挪作他用时,我们需要把该磁盘上的数据迁移到其它磁盘 数据迁移有两种方式:1.手动选择迁移位置、2.不选择迁移位置 1.手动选择迁移位置 首先我们查看一下当前pv 空间 [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 ce...

flutter DataTable数据表格

数据表显示原始数据集。它们通常出现在桌面企业产品中。DataTable Widget实现这个组件 文档:https://api.flutter.dev/flutter/material/DataTable-class.html import 'package:flutter/material.dart'; import './model/post.dar...

Cesium原理篇:3D Tiles(3)个人总结

个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范       我非常喜欢glTF的整体设计,概括有四点:第一,数据块(Buffer)连续,保证了读写性能;第二,提供了视图(View)和访问器(Accessor)的概念,在不损失数据块完整性的前提下提供类型信息和读...

详细解释VB连接access几种方法数据库

在VB在,连接ACCESS数据库的方法主要表现在以下三种 使用ADO对象。通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 Data Link文件 使用ODBC数据源名称 使用连接字符串 使用数据环境设计器创建数据库连接 首先加入环境引用。 然后...

laravel查询数据库获取结果如何判断是否为空?

laravel 查询数据库获取结果如何判断是否为空? 大家使用的场景是这样的: 1 $users = DB::table('users')->where('id',$id)->get(); 2 3 if($users){ 4 //有数据 5 }else{ 6 //没数据 7 } 8 或 9 if(is_...