rdd分片 spark_Spark分区

91df070aa9a40645b65a5e43dbc19213.png

一、分区的概念

  分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个数,也是由RDD(准确来说是作业最后一个RDD)的分区数决定。

二、为什么要进行分区

  数据分区,在分布式集群里,网络通信的代价很大,减少网络传输可以极大提升性能。mapreduce框架的性能开支主要在io和网络传输,io因为要大量读写文件,它是不可避免的,但是网络传输是可以避免的,把大文件压缩变小文件, 从而减少网络传输,但是增加了cpu的计算负载。

  Spark里面io也是不可避免的,但是网络传输spark里面进行了优化:

  Spark把rdd进行分区(分片),放在集群上并行计算。同一个rdd分片100个,10个节点,平均一个节点10个分区,当进行sum型的计算的时候,先进行每个分区的sum,然后把sum值shuffle传输到主程序进行全局sum,所以进行sum型计算对网络传输非常小。但对于进行join型的计算的时候,需要把数据本身进行shuffle,网络开销很大。

spark是如何优化这个问题的呢?

  Spark把key-value rdd通过key的hashcode进行分区,而且保证相同的key存储在同一个节点上,这样对改rdd进行key聚合时,就不需要shuffle过程,我们进行mapreduce计算的时候为什么要进行shuffle?,就是说mapreduce里面网络传输主要在shuffle阶段,shuffle的根本原因是相同的key存在不同的节点上,按key进行聚合的时候不得不进行shuffle。shuffle是非常影响网络的,它要把所有的数据混在一起走网络,然后它才能把相同的key走到一起。要进行shuffle是存储决定的。

  Spark从这个教训中得到启发,spark会把key进行分区,也就是key的hashcode进行分区,相同的key,hashcode肯定是一样的,所以它进行分区的时候100t的数据分成10分,每部分10个t,它能确保相同的key肯定在一个分区里面,而且它能保证存储的时候相同的key能够存在同一个节点上。比如一个rdd分成了100份,集群有10个节点,所以每个节点存10份,每一分称为每个分区,spark能保证相同的key存在同一个节点上,实际上相同的key存在同一个分区。

  key的分布不均决定了有的分区大有的分区小。没法分区保证完全相等,但它会保证在一个接近的范围。所以mapreduce里面做的某些工作里边,spark就不需要shuffle了,spark解决网络传输这块的根本原理就是这个。

  进行join的时候是两个表,不可能把两个表都分区好,通常情况下是把用的频繁的大表事先进行分区,小表进行关联它的时候小表进行shuffle过程。

  大表不需要shuffle。

  需要在工作节点间进行数据混洗的转换极大地受益于分区。这样的转换是 cogroup,groupWith,join,leftOuterJoin,rightOuterJoin,groupByKey,reduceByKey,combineByKey 和lookup。

分区是可配置的,只要RDD是基于键值对的即可

三、Spark分区原则及方法

RDD分区的一个分区原则:尽可能是得分区的个数等于集群核心数目

无论是本地模式、Standalone模式、YARN模式或Mesos模式,我们都可以通过spark.default.parallelism来配置其默认分区个数,若没有设置该值,则根据不同的集群环境确定该值

3.1 本地模式

(1)默认方式

以下这种默认方式就一个分区

439bb001f6a7be7fe547d140441dbde4.png

结果

1ce68eb3bc182fbf4164c6003bb239a4.png

(2)手动设置

设置了几个分区就是几个分区

7c1e0aaf7e6f89fa23cb715a6a9d2ac3.png

结果

e02e51a1d86d76f69932ebb51293c2af.png

(3)跟local[n] 有关

n等于几默认就是几个分区

如果n=* 那么分区个数就等于cpu core的个数

9ffff467bb4ef4b7a07f77418128053a.png

结果

3ee46558ae7af1af4aecc4f3c60ef582.png

本机电脑查看cpu core,我的电脑--》右键管理--》设备管理器--》处理器

f6aab61d12d1e5bdbd9a9d539b741a21.png

(4)参数控制

9aee61edd70ab416daf9f6ed118d8a28.png

结果

2699d2752846eaa0171b4cb8977d8324.png

3.2 YARN模式

8292d5da53ed7487f381ca072c874ddd.png

进入defaultParallelism方法

1c3cda55f5da5df41ff479a8770174e0.png

继续进入defaultParallelism方法

5d10eafea3e9adbc1cad591d32c91f08.png

这个一个trait,其实现类是(Ctrl+h)

be06d6ee370e3fb6a9b2ad1429fb0197.png

进入TaskSchedulerImpl类找到defaultParallelism方法

0e861b70a0b12605b0989b62b9b71d70.png

继续进入defaultParallelism方法,又是一个trait,看其实现类

25bfcb6c0018fb7dc366a998dcb47337.png

Ctrl+h看SchedulerBackend类的实现类

ba5d5b8d1988e4d636fbc5136f2ec7e7.png

进入CoarseGrainedSchedulerBackend找到defaultParallelism

bebcd3963a9d3bc95814ff8480a20189.png

totalCoreCount.get()是所有executor使用的core总数,和2比较去较大值

如果正常的情况下,那你设置了多少就是多少

四、分区器

(1)如果是从HDFS里面读取出来的数据,不需要分区器。因为HDFS本来就分好区了。

   分区数我们是可以控制的,但是没必要有分区器。

(2)非key-value RDD分区,没必要设置分区器

val testRDD = sc.textFile("C:UsersAdministratorIdeaProjectsmysparksrcmainhello.txt").flatMap(line => line.split(",")).map(word => (word, 1)).partitionBy(new HashPartitioner(2))
没必要设置,但是非要设置也行。

(3)Key-value形式的时候,我们就有必要了。

HashPartitioner

val resultRDD = testRDD.reduceByKey(new HashPartitioner(2),(x:Int,y:Int) => x+ y)
//如果不设置默认也是HashPartitoiner,分区数跟spark.default.parallelism一样
println(resultRDD.partitioner)
println("resultRDD"+resultRDD.getNumPartitions)

RangePartitioner

val resultRDD = testRDD.reduceByKey((x:Int,y:Int) => x+ y)
val newresultRDD=resultRDD.partitionBy(new RangePartitioner[String,Int](3,resultRDD))
println(newresultRDD.partitioner)
println("newresultRDD"+newresultRDD.getNumPartitions)

注:按照范围进行分区的,如果是字符串,那么就按字典顺序的范围划分。如果是数字,就按数据自的范围划分

自定义分区

需要实现2个方法

class MyPartitoiner(val numParts:Int) extends  Partitioner{override def numPartitions: Int = numPartsoverride def getPartition(key: Any): Int = {val domain = new URL(key.toString).getHostval code = (domain.hashCode % numParts)if (code < 0) {code + numParts} else {code}}
}object DomainNamePartitioner {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("word count").setMaster("local")val sc = new SparkContext(conf)val urlRDD = sc.makeRDD(Seq(("http://baidu.com/test", 2),("http://baidu.com/index", 2), ("http://ali.com", 3), ("http://baidu.com/tmmmm", 4),("http://baidu.com/test", 4)))//Array[Array[(String, Int)]]// = Array(Array(),// Array((http://baidu.com/index,2), (http://baidu.com/tmmmm,4),// (http://baidu.com/test,4), (http://baidu.com/test,2), (http://ali.com,3)))val hashPartitionedRDD = urlRDD.partitionBy(new HashPartitioner(2))hashPartitionedRDD.glom().collect()//使用spark-shell --jar的方式将这个partitioner所在的jar包引进去,然后测试下面的代码// spark-shell --master spark://master:7077 --jars spark-rdd-1.0-SNAPSHOT.jarval partitionedRDD = urlRDD.partitionBy(new MyPartitoiner(2))val array = partitionedRDD.glom().collect()}
}

福利部分
《大数据成神之路》大纲

大数据成神之路​shimo.im
fd2286b07107277a3301f31800e012c2.png

《几百TJava和大数据资源下载》

资源下载​shimo.im

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5 防止脚本攻击,shell防ddos攻击脚本(二)

在上一篇shell防ddos攻击脚本(一)中,我给大家发了个脚本,那只是针对单机的,如果是在负载均衡下的话,很容易把自己的服务器ip给误封,所以这篇文章就给大家发个可以添加白名单的shell脚本.系统:centos 5.9 64位脚本内容:vi ip-dos-cc.sh#!/bin/bashnetstat -an| grep :80 |grep -…

python中配置opencv_在Windows中安装OpenCV-Python|四

目标 在本教程中&#xff0c;我们将学习在你的Windows系统中设置OpenCV-Python。 下面的步骤在装有Visual Studio 2010和Visual Studio 2012的Windows 7-64位计算机上进行了测试。屏幕截图展示的是VS2012。 从预编译的二进制文件安装OpenCV 下面的Python软件包将被下载并安装到…

uip UDPclient模式通信移植,当地port随机

现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************************************************************** 文件名称: udp_client.c* 功能: uIP UDP客户端相关函数* 作者: cp1300139.com* 创建时间: 20…

react如何遍历并比较_[前端进阶] 这可能是最通俗易懂的React 渲染原理及性能优化...

如今的前端&#xff0c;框架横行&#xff0c;出去面试问到框架是常有的事。我比较常用React&#xff0c; 这里就写了一篇 React 基础原理的内容&#xff0c; 面试基本上也就问这些&#xff0c; 分享给大家。React 是什么React是一个专注于构建用户界面的 Javascript Library.一…

运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt

离散数学包含及排斥原理第三章 集合与关系 * 一、有限集的计数 一个集合若其组成集合的元素个数是有限的&#xff0c;则称作有限集。 设A1、A2为素个数分别记为|A1|&#xff0c;|A2| P96有限集记数有如下几个性质&#xff1a; a)|A1∪A2| ≤ |A1||A2| b)|A1∩A2| ≤min( |A1|,|…

基于git的工作流程

本文针对的是追求极致、快速的产品响应团队的。以下的观点和内容都是围绕这个主题&#xff0c;暂时不涉及个人学习和团队学习。 在说工作流程之间&#xff0c;想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里&#xff0c;同时有好多事件要解决。有的是产品迭代&a…

c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

在C中&#xff0c;继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承&#xff0c;您可以重用&#xff0c;扩展或修改在其他类中定义的属性和行为。通过继承&#xff0c;可以实现函数重写以及多态。在C中&#xff0c;继承另一个类的成员的类称为派生类&#xff0…

超几何分布_常见概率分布

离散分布退化分布 若r.v. 只取常数值c&#xff0c;即 ,这时分布函数为&#xff1a; 把这种分布称为退化分布或者单点分布。伯努利分布 在一次实验中&#xff0c;事件A出现的概率为 ,不出现的概率为 ,若用 记事件A出现的次数&#xff0c;则 仅取值0或1&#xff0c;相应的…

spring 4.0 JUnit简单的Dao,Service测试

1.AbstractTransactionalJUnit4SpringContextTests 和AbstractJUnit4SpringContextTests。我们在测试用例类要继承两种中的一个。 AbstractTransactionalJUnit4SpringContextTests提供了数据库自动回滚&#xff0c;也就是说测试前和测试后数据库是一样的 AbstractJUnit4SpringC…

云起智慧中心连接华为_【转发】华为智慧屏HiLink控制联动,操作指南来了!

本文转自华为智慧生活APP -> 智能 -> 酷玩页面华为智慧屏HiLink控制联动&#xff0c;操作指南来了&#xff01;一、基本控制通过华为智慧生活APP&#xff0c;您可以对已绑定华为账号的智慧屏进行基本控制&#xff0c;操作指南如下&#xff1a;① 在智慧屏上登录华为账号&…

中小学电教信息计算机管理员职责,中小学电教教师岗位职责

第1篇&#xff1a;电教教师岗位职责电教教师岗位目标责任书一、根据学校工作计划制定学校电教工作计划。二、根据学校需要&#xff0c;收集、编制电教教材和资料。三、管理好电教教室、器材和设施&#xff0c;严格执行器材的使用归还制度。四、电教器材使用设置合理&#xff0c…

python编程口诀_少儿Python编程中的算术与技巧

在儿童Python中&#xff0c;使用数值进行基本运算的情况很常见。加、减、乘、除都是内置的。加法和减法通过和-号执行。 在Python shell提示中可以输入基本的算术表达式&#xff0c;将它当作一个计算机来使用。像计算器一样&#xff0c;Python接受一组操作&#xff0c;当按下En…

struts学习

Structs2配置文件概述&#xff1a; <constant name"" value""></constant>详解&#xff1a;&#xff08;两个看不见的value都是设置true/false&#xff09; package的相关使用&#xff1a; &#xff08;name是包名。action相当于以前的servl…

里怎么做页眉页脚_这年头县城里在家做的电商利润怎么样

这年头县城里在家做的电商利润怎么样 mcfg6ek这年头县城里在家做的电商利润怎么样 通过上面的信息大家是否已经对多用户商城有什么优势有所了解了呢&#xff0c;如果还想了解更多多用户商城的信息&#xff0c;站进行查看咨询哦。店系统怎么进行推广。店系统的推广方式介绍我们都…

计算机如果算积分排名,超级电脑预测英超积分榜:蓝军守住第4 曼联无缘欧冠...

还有6天的时间&#xff0c;2019-20赛季的英超联赛就要重启了。虽然冠军的悬念已经不大&#xff0c;但欧冠席位以及降级名额仍有很大的变数&#xff0c;这让外界仍无比期待接下来的比赛。今日&#xff0c;超级计算机对剩余的比赛做了预测&#xff0c;并算出了最终的积分榜&#…

环形队列出队的元素怎么输出出来_队列:队列在线程池等有限资源池中的应用...

我们知道&#xff0c;CPU资源是有限的&#xff0c;任务的处理速度与线程个数并不是线性正相关的。相反&#xff0c;过多的线程反而会导致CPU频繁切换&#xff0c;处理性能下降。所以&#xff0c;线程池的大小一般都是综合考虑要处理任务的特点和硬件环境&#xff0c;来事先设置…

★★★常用的【兼容IE和火狐FF】等浏览器的js方法★★★★★★★★

这是一篇收集的文档&#xff0c;介绍了网页上常用的IE/火狐兼容性该页的做法&#xff0c;并给出了代码&#xff0c;相当实用了。为了方便大家阅读代码&#xff0c;以下以 IE 代替 Internet Explorer&#xff0c;以 MF/FF 代替 Mozzila Firefox 。 以下进入正题&#xff1a; 一、…

英语答题测试的软件叫什么,英语做题软件哪个好 有答案解析的英语做题软件分享...

对于一些即将参与重要英语考试的考生来说&#xff0c;每天刷题练习肯定是不可避免的事情&#xff0c;但如果你想要更高效的刷题&#xff0c;让自己的刷题时间更有价值&#xff0c;那就来看看推荐给你的这些英语做题软件。类型&#xff1a;学习 语言&#xff1a;简体中文星级&am…

raid卡组不同raid_RAID磁盘阵列是如何运作的?

本文编辑&#xff1a;意哥专业指导&#xff1a;葵芳一凡 RAID是英文Redundant Array of Independent Disks的缩写&#xff0c;中文简称为独立冗余磁盘阵列。简单的说&#xff0c;RAID是一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组…

java 析构函数_C++虚函数

码字不易&#xff0c;欢迎给个赞&#xff01;C虚函数是多态性实现的重要方式&#xff0c;当某个虚函数通过指针或者引用调用时&#xff0c;编译器产生的代码直到运行时才能确定到底调用哪个版本的函数。被调用的函数是与绑定到指针或者引用上的对象的动态类型相匹配的那个。因此…