Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 增加spark.executor.cores是否会加快洗牌速度_Apache Spark - Fatal编程技术网

Apache spark 增加spark.executor.cores是否会加快洗牌速度

Apache spark 增加spark.executor.cores是否会加快洗牌速度,apache-spark,Apache Spark,假设我们固定spark作业的内核总数和总内存大小,并且输入数据中有大量分区。比较这两种配置: 100个执行器、10G内存和每个执行器一个内核 20个执行器、50G内存和每个执行器5个内核 我的问题是: 有时我发现节点\本地任务从网络而不是内存/磁盘获取输入,这是否意味着同一台机器上的两个执行进程之间的通信 如果1为真,第二个会更快吗?因为洗牌可以更“本地处理” 如果只有地图任务,那么第二个任务是否与第一个任务一样快 我可以说,#executor和#executor cores之间的主要权衡是

假设我们固定spark作业的内核总数和总内存大小,并且输入数据中有大量分区。比较这两种配置:

  • 100个执行器、10G内存和每个执行器一个内核
  • 20个执行器、50G内存和每个执行器5个内核
我的问题是:

  • 有时我发现节点\本地任务从网络而不是内存/磁盘获取输入,这是否意味着同一台机器上的两个执行进程之间的通信
  • 如果1为真,第二个会更快吗?因为洗牌可以更“本地处理”
  • 如果只有地图任务,那么第二个任务是否与第一个任务一样快
  • 我可以说,
    #executor
    #executor cores
    之间的主要权衡是IO吗

  • 谢谢你。有时我发现节点\本地任务从网络而不是内存/磁盘获取输入,这是否意味着同一台机器上的两个执行进程之间的通信?

    节点\本地任务可能从同一节点中的其他执行器获取输入,或者需要从HDFS、缓存等系统检索输入。是的,节点\本地任务意味着同一节点中两个执行器进程之间的通信。 RACK_LOCAL表示数据位于另一个节点中,因此需要在执行之前传输数据

    Q2.如果1为真,第二个会更快吗?因为洗牌可以更“本地处理”

    • 100个执行器、10G内存和每个执行器一个内核
    • 20个执行器、50G内存和每个执行器5个内核

      1是正确的,但决定哪个选项更快取决于几个因素(执行器的数量与执行器核心的数量)

    Spark submit内存参数,如“执行器数量”和“执行器核心数量”属性,会影响Spark可以缓存的数据量,以及用于分组、聚合和,运行内存过多的执行器通常会导致过多的垃圾收集延迟

    cores属性控制执行器可以运行的并发任务数。据观察,每个执行器有五个任务可以实现全写吞吐量。每个执行器的大量内核会导致HDFS I/O吞吐量,从而显著降低应用程序的速度

    而使用单核和更少内存运行执行器则会丢掉在单个JVM中运行多个任务所带来的好处。例如,广播变量需要在每个执行器上复制一次,因此许多小执行器将产生更多的数据副本

    要通过Spark优化内存消耗,请确定数据集需要多少内存。为此,您可以创建一个数据帧,缓存它,并在Spark UI的“存储”选项卡中检查数据集大小。根据数据集大小和操作类型,您可以推导出执行器和核心的最佳数量

    或者- 通过使用spark.dynamicAllocation.enabled属性启用动态分配,可以避免设置所有这些内存属性。动态分配允许spark应用程序在待处理任务积压时请求执行者,并在空闲时释放执行者

    Q3。如果只有地图任务,第二个任务是否与第一个任务一样快?

    也许是的。根据Cloudera的建议。第二个选项比第一个好,但它取决于数据集的大小


    Q4.我能说#executor和#executor核心之间的主要权衡是IO吗?


    对此不确定,但建议尽可能多的执行器作为数据节点,并尽可能多地从集群中获取核心。

    Q4。我可以说,执行器和执行器核心之间的主要权衡是IO吗?

    主要的权衡是内存管理和IO。如果使用简单映射和reduces运行一些简单的多级DAG,您将在spark history中看到,4个节点(每个节点有2个核)并行处理的任务数与1个节点(每个节点有8个核)并行处理的任务数相同。在阶段开始时,每个初始任务加载都会发生反序列化

    最大的区别在于内存开销的减少。在具有大量ram的现代服务器中,这并不是什么大问题

    由于线程调度程序中的性能下降曲线,您很难发现有人推荐一个执行器使用5个以上的内核

    启动集群/执行器大小调整的经验法则如下:

    (上限(主机物理内核总数*1.15)-2)/executor.cores=每台主机的执行器数量

    从executor.cores=2开始是一个很好的安全赌注


    每个执行器的内存更多地取决于您的DAG和摄取量。

    不太可能。洗牌受网络IO的限制磁盘IO(写入随机文件)。第二部分将不受影响。您可能会看到更大执行器的一些其他好处(更好的广播,更低的总内存使用率)。