sparksql中的shuffle问题,怎么将shuffle过程的读写放到内存里啊?

baidu_38620855 2018-01-16 04:41:37
如上图,shuffle的读写是发生在NODE_LOCAL中的,也就是发生在本地节点,但这样会产生I/O消耗,对性能有影响,所以我想让shuffle的读写在内存中完成,该怎么修改呢???我查阅了资料,说将spark.shuffle.spill=false就可以让shuffle过程全部在内存中进行,但这样修改后没有作用啊,求大神指点一下,我用的spark版本是2.1.0,急求解答,感激不尽!!!
...全文
1518 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pucheung 2018-08-23
  • 打赏
  • 举报
回复
shuffle 是必须经过磁盘io的
spark.shuffle.spill=false 除非你的内存够用,数据足够小,否则将会导致oom
baidu_38620855 2018-01-18
  • 打赏
  • 举报
回复
引用 6 楼 Dante_003 的回复:
首先你要明确两点 1.shuffle本来就在内存中read和write(内存不够才会spill到硬盘) 2.node local、process、rack这个属性不是shuffle的,是计算节点和数据的关系 你百度一些spark的内存管理和spark shuffle过程的资料
谢谢你。大兄弟,再问你些问题,我查阅了一些资料,但资源配置这块还是不太确定。 我的spark集群配置如下:集群一共6个节点,每个节点给spark分配的内存是8G内存,每个节点分配4个CPU core。启动sparksql时:命令如下: spark-sql --master spark://ip:7077 --executor-memory 4g --num-executors 2 --executor-cores 2 这样写意思是不是就是spark下每个节点有两个executor,每个executor有4g内存和2个CPU core,所以spark集群一共有12个executor。这样配置对吗? 还有就是spark.sql.shuffle.partitions参数设置的问题,这个值默认为200,资料说这个值设置的一般偏小,我需要修改吗? 求大哥解答下
baidu_38620855 2018-01-17
  • 打赏
  • 举报
回复
引用 4 楼 Dante_003 的回复:
shuffle是你计算逻辑中,要把一个节点的数据发送到另外一个节点进行计算 例如orderbykey这样的计算,首先第一步每台集群上的数据map出key和value,第二部将key集中在一个节点上才能排序,这时就会有其它节点向一个节点发送那个key value的数据。 shuffle read就是整个计算逻辑中所有节点数据传输的总和。 和你计算时数据的node local、process、rack属性没有关系。
sort-based的shuffle,会把输入的记录根据目标分区id(partition ids)进行排序。然后写入单个的map输出文件中。为了读取map的输出部分,Reducers获取此文件的连续区域 。当map输出的数据太大而内存无法存放时,输出的排序子集可以保存到磁盘,这些磁盘文件被合并后,生成最终的输出文件。 这是我找的一段资料。从这段话中,当map输出的数据内存可以存放时,不就不用保存到磁盘了吗?而且spark的特点就是数据交互不会走硬盘,所以说数据传输是可以走内存的啊,正是因为这样spark的速度才比hadoop快的多啊
码太狼 2018-01-17
  • 打赏
  • 举报
回复
shuffle是你计算逻辑中,要把一个节点的数据发送到另外一个节点进行计算 例如orderbykey这样的计算,首先第一步每台集群上的数据map出key和value,第二部将key集中在一个节点上才能排序,这时就会有其它节点向一个节点发送那个key value的数据。 shuffle read就是整个计算逻辑中所有节点数据传输的总和。 和你计算时数据的node local、process、rack属性没有关系。
baidu_38620855 2018-01-17
  • 打赏
  • 举报
回复
引用 2 楼 Dante_003 的回复:
hadoop、spark中的shuffle就是跨节点的数据传输,比如排序、repartition等,需要将一个节点的数据移动到另外一个节点上。 跟在本地、内存没有关系,你如果说的是内存中的计算,你可以把原始数据或者某一个stage的结果cache到内存,方法是cache()
我已经把数据都放在内存里的,但我感觉shuffle过程中计算和数据写到本地节点去了,这样速度不就慢了么,所以我想把这部分操作也放到内存中,但不知道怎么弄
码太狼 2018-01-17
  • 打赏
  • 举报
回复
首先你要明确两点 1.shuffle本来就在内存中read和write(内存不够才会spill到硬盘) 2.node local、process、rack这个属性不是shuffle的,是计算节点和数据的关系 你百度一些spark的内存管理和spark shuffle过程的资料
码太狼 2018-01-16
  • 打赏
  • 举报
回复
hadoop、spark中的shuffle就是跨节点的数据传输,比如排序、repartition等,需要将一个节点的数据移动到另外一个节点上。 跟在本地、内存没有关系,你如果说的是内存中的计算,你可以把原始数据或者某一个stage的结果cache到内存,方法是cache()
baidu_38620855 2018-01-16
  • 打赏
  • 举报
回复
图片在这呢

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧