spark分区
spark默认的partition的分区数是和本机CPU的核数保持一致;
bucket的数量和reduce的数量一致;buket的概念是map会将计算获得数据放到各个buket中,每个bucket和一个reduce对应;bucket的数量其实就是和partition数量。而且是每个mapper都会写入partition数量的bucket
在spark中shuffle分为两个阶段,分别为shuffle write以及shuffle fetch(read),前者是指写入buket,后者是指将buket数据传输到reduce节点;
我觉得shuffle就是意味着(数据)需要跨节点重排;1000-》100个之所以不需要shuffle就是因为需要得资源变少了,其实节点内部合并即可而不像也要重新调度(分区的本质就是数据重新分配);但是100-》1000则可能会引发重新分区;比如当前机器只有10个核,已经全部占用,想要扩容之能是对数据进行重排,部分数据要分派到别的节点(扩容)中去,这个时候就会引发shuffle;
在Map-Reduce的重排是指从Map数据项reduce节点汇聚,其实就是引发了一次跨节点重排;在 spark里面的重分区,coalesce函数和reduce的貌似类似,其实有本质差别,都是减少,但是coales的减少默认是在节点内部(shuffle=false),自行消化,reduce的一般都是需要跨机器(极端情况map-reduce都是一台机器可以避免);但是coalesce可以是扩容,只要指定shuffle=true即可实现。但是,但凡是shuffle,一般都是比较耗费性能,因为需要数据重新排序,调度以及跨节点传输。
分区有规则,默认的规则是hash以及区间分区,hash分区是为了能够利用并发进而提高计算效率;区间分区是为了需要计算的数据在物理上部署在一起,避免计算数据分布,还需要跨节点/进程运算,区间分区后,可以达到提高计算效率的目的;
还有就是可以自定义分区,按照需要对数据进行分区,比如数据如果想要写入到HFile中,为保证同一个regionServer的数据可以写到一个hfile中,可以自定义个分区规则,就是根据rowkey区间来进行分区,这个和区间分区比较类似,但是因为rowKey是byte[],而且还要判断给定的rowKey所落在的分区编号,所以需要进行额外的处理。
Job包含Stage包含Task,在spark世界里面,task就是mapper;上面讲述的mapper写入bucket其实就是task将数据写入到对应的分区文件中(每个task都会有一套分区文件),值为:
task数量 * partition数量
因为分区文件太过于碎小,spark又推出了 Consalidate技术,用于把同核的同分区的文件进行合并,这样文件数量就见小为
cpu core数量 * 分区值
Hash Shuffle和Sorted Shuffle,前者比较合适中小数据规模,因为不需要排序,所以当下计算速度会非常快,但是这种排序方式在大量数据情况下,将会形成大量的小文件,导致I/O处理频发,成为计算处理平静;sorted shuffle生成文件比较少,在海量数据的情况比较适合。
但是spark分区是需要成本,这里需要权衡,如果数据只是计算一次,到底有多少重分区的意义,因为数据重新分桶也是需要性能损耗。所以对于spark的重分区,掌握两个原则:如果是想要享受同步进行的快感,采用hash分区;否则,就像一次性计算之类的就不要再进行重分区了。
spark分区的更多相关文章
- 【Spark 深入学习-08】说说Spark分区原理及优化方法
本节内容 ------------------ · Spark为什么要分区 · Spark分区原则及方法 · Spark分区案例 · 参考资料 ------------------ 一.Spark为什 ...
- Spark学习之路 (十七)Spark分区
一.分区的概念 分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务 ...
- Spark(十一)Spark分区
一.分区的概念 分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务 ...
- Spark学习之路 (十七)Spark分区[转]
分区的概念 分区是RDD内部并行计算的一个计算单元,RDD的数据集在逻辑上被划分为多个分片,每一个分片称为分区,分区的格式决定了并行计算的粒度,而每个分区的数值计算都是在一个任务中进行的,因此任务的个 ...
- Hive和Spark分区策略
1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...
- Spark分区实例(teacher)
package URL1 import org.apache.spark.Partitioner import scala.collection.mutable class MyPartitioner ...
- 重要 | Spark分区并行度决定机制
最近经常有小伙伴在本公众号留言,核心问题都比较类似,就是虽然接触Spark有一段时间了,但是搞不明白一个问题,为什么我从HDFS上加载不同的文件时,打印的分区数不一样,并且好像spark.defaul ...
- Spark分区器浅析
分区器作用:决定该数据在哪个分区 概览: 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None 在分区器为None时RDD分区一般继承至父RDD分区 初始RDD分区数: 由集合创建,R ...
- spark 分区
http://stackoverflow.com/questions/39368516/number-of-partitions-of-spark-dataframe
随机推荐
- Linux用户和用户组管理 用户组管理命令
添加用户组命令:groupadd 命令格式: [root@localhost ~]# groupadd [选项] 组名 选项: 选项 选项说明 -g GID 指定组ID: 修改用户组命令:groupm ...
- Python编程-多进程一
一.python并发编程之多进程 1.multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在pyth ...
- Python3.4 用 pip 安装lxml时出现 “Unable to find vcvarsall.bat ”
我的python版本是Python 3.5 该问题的产生是在windows环境中,python 的 Setup需要调用一个vcvarsall.bat的文件,该文件需要安装c++编程环境才会有.网上的方 ...
- docker link
什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编 ...
- HBase-修改表结构
HBase修改表结构 package com.hbase.HBaseAdmin; import java.io.IOException; import org.apache.hadoop.conf.C ...
- POJ 3376 Finding Palindromes (tire树+扩展kmp)
很不错的一个题(注意string会超时) 题意:给你n串字符串,问你两两匹配形成n*n串字符串中有多少个回文串 题解:我们首先需要想到多串字符串存储需要trie树(关键),然后我们正序插入倒序匹配就可 ...
- nodejs 中 excel-export 使用介绍
1. 为了在nodejs 服务器端操作数据导出excel 格式用的 excel-export 包地址:https://github.com/functionscope/Node-Excel-Expo ...
- Launch an instance from a volume
从image boot,并且attach一个no-bootable volume: $ nova boot --flavor --image -af91-43d8-b5e6-a4506aa8f369 ...
- tensorflow笔记:多层CNN代码分析
tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...
- ansible实现发布、回滚功能
ansible的两篇博客,本来是打算合二为一的,发现只用一篇写,嗯,好鬼长.... 一向秉承简单为美的我于是忍痛割爱,一分为二了 ansible实现升级发布.回滚功能 1.应用场景 在实际生产环境中, ...