当出现Kafka单个分区数据量很大,但每个分区的数据量很平均的情况时,我们往往采用下面两种方案增加并行度:

l  增加Kafka分区数量

l  对拉取过来的数据执行repartition

但是针对这种情况,前者的改动直接影响所有使用消费队列的模型性能,后者则存在一个shuffle的性能消耗。有没有既不会发生shuffle,又能成倍提升性能的方法呢?

/*
推荐使用Scala的并行集合:
在上述场景中存在的情况是,单核数据量很大,但是又由于分区数量限制导致多核无法分配到数据。因此如果使用foreachPartition算子,就可以获取到每个分区的数据集,对这些数据集使用多线程并行执行。
*/ //具体代码如下:
rdd.foreachPartition(datas=>{
//使用一个集合创建对应的并行集合
val seqPar = datas.toSeq.par
//为并行集合设置线程池,默认的参数是CPU的核数
seqPar.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool())
//执行遍历逻辑,自动实现多线程并行
seqPar.foreach{...}
}) //经本地测试,该方法有效。但没有测试复杂的逻辑,如:多个遍历算子、Kafka场景等 

如果Spark会优先为每个executor拉取数据,就可以通过设置executor num=Kafka分区数,然后为每个executor设置多个cpu core的方式实现成倍的处理速度。

经实验,Spark在拉取Kafka数据时,不管Cpu核数多少,会优先为每个executor分配一份Kafka分区,只有当总executor数量<Kafka分区时,才会分配多份数据到同一个节点上。

以下是我使用10个节点,每个节点分配4个线程拉取一个分区数量为10的Kafka时,Task的分布情况:

可以看到,数据被很好的分散到了十个节点上。并且在这个测试模型中,我使用了并行集合执行累加器操作。可以看到,并行集合并没有造成数据丢失,而是正常的执行了计算逻辑。

可惜从少量的数据中看不出并行集合带来的提升。此外,关于该方案是否适用于复杂逻辑和持久稳定运行,还需要后续观察。

Scala——的并行集合的更多相关文章

  1. scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合

    1 流 Stream stream是一个集合.这个集合,可以用于存放无穷多个元素,但是这无穷个元素并不会一次性生产出来,而是需要用到多大的区间,就会动态的生产,末尾元素遵循lazy规则(即:要使用结果 ...

  2. 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))

    1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...

  3. 11. Scala数据结构(下)-集合操作

    11.1 集合元素的映射-map映射操作 11.1.1 看一个实际需求 要求:请将List(3,5,8)中所有的元素都*2,将其结果放到一个新的集合中返回,即返回一个新的List(6,10,16),请 ...

  4. Scala学习十三——集合

    一.本章要点 所有集合都扩展自Iterable特质; 集合有三大类,分别为序列,集和映射; 对于几乎所有集合类,Scala都同时提供可变和不可变的版本; Scala列表要么是空的,要么拥有一头一尾,其 ...

  5. Programming In Scala笔记-第十七章、Scala中的集合类型

    本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...

  6. scala的多种集合的使用(1)之集合层级结构与分类

    一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...

  7. C#编程(五十八)----------并行集合

    并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行访问.经常要做的就是对一些队列进行加锁-解锁,然后执行类似插入,删除等等互斥操作. .NET4提供了一些封装好的支持并行操作数据 ...

  8. 9、scala函数式编程-集合操作

    一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

  9. C#高级编程五十八天----并行集合

    并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作 ...

随机推荐

  1. [Java网络安全系列面试题]常见web攻击有哪些?

    搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. 1. XSS 1.1 什么是 ...

  2. 单片机的 HexToStr HexToBcd BcdToStr 几个转换函数

    今天写单片机一个程序 要检查一些数据,想发到串口调试的软件上在电脑上查看 有些转换函数 想网上找一个 看看都是很多的垃圾文章 很多的程序都不能用,那些发文章的人也不用心 所以我还是自己动手写一下吧 写 ...

  3. Django 支付宝付款接口的使用

    我们在开发的过程中经常会碰到调用微信或者支付宝接口进行付款,付款完成之后,如果用户绑定了我的账号,我只要有活动了,就要给这个关注我的用户推动消息,让用户知道,比如说,我们经常会关注一些公众号,然后这些 ...

  4. Django之路由层和视图层详解

    路由层 首先我们来看一下,路由层都有哪些东西,其实你看django很人性化,将所有的介绍都放在了简介里面,不信,你看

  5. 被问到到http的时候你就这么回答!

    大家好,我是标题党,啊不,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 什么是互 ...

  6. demo08-js条件运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Netty中ChannelHandler的生命周期

    在使用Netty进行网络编程的时候,通常需要在网络连接的不同阶段进行相应的操作,比如在连接建立时,客户端向服务端发起认证,在接收到数据时对数据内容进行解析等等.那么,连接的不同阶段在netty中如何表 ...

  8. 动态规划-Minimum Cost to Merge Stones

    2019-07-07 15:48:46 问题描述: 问题求解: 最初看到这个问题的时候第一反应就是这个题目和打破气球的题目很类似. 但是我尝试了使用dp将问题直接转为直接合并到一个堆问题复杂度迅速提高 ...

  9. GitHub 热点速览 Vol.13:近 40k star 计算机论文项目再霸 GitHub Trending 榜

    作者:HelloGitHub-小鱼干 摘要:"潮流是个轮回",这句话用来形容上周的 GitHub Trending 最贴切不过.无论是已经获得近 40k 的高星项目 Papers ...

  10. [概率] HDU 2019 Multi-University Training Contest 10 - Valentine's Day

    Valentine's Day Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others ...