- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图了解在 YARN 上运行 Spark 作业时核心数量与执行程序数量之间的关系。
测试环境如下:
网络:1Gb
Spark 版本:1.0.0
Hadoop 版本:2.4.0 (Hortonworks HDP 2.1)
Spark 作业流程:sc.textFile -> filter -> map -> filter -> mapToPair -> reduceByKey -> map -> saveAsTextFile
输入数据
输出
作业使用以下配置运行:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(每个数据节点的执行器数,使用与核心一样多)
--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(核心数减少)
--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(核心少,执行者多)
耗时:
50 分 15 秒
55 分 48 秒
31 分 23 秒
令我惊讶的是,(3) 更快。
我认为 (1) 会更快,因为在洗牌时执行者之间的通信会更少。
尽管 (1) 的核心数少于 (3),但核心数不是关键因素,因为 2) 确实表现良好。
(以下内容是在 pwilmot 的回答后添加的。)
相关信息,性能监控截屏如下:
该图大致分为两部分:
如图所示,(1) 可以使用给定的 CPU 能力。所以,这可能不是线程数的问题。
如何解释这个结果?
最佳答案
To hopefully make all of this a little more concrete, here’s a worked example of configuring a Spark app to use as much of the cluster aspossible: Imagine a cluster with six nodes running NodeManagers, eachequipped with 16 cores and 64GB of memory. The NodeManager capacities,yarn.nodemanager.resource.memory-mb andyarn.nodemanager.resource.cpu-vcores, should probably be set to 63 *1024 = 64512 (megabytes) and 15 respectively. We avoid allocating 100%of the resources to YARN containers because the node needs someresources to run the OS and Hadoop daemons. In this case, we leave agigabyte and a core for these system processes. Cloudera Manager helpsby accounting for these and configuring these YARN propertiesautomatically.
The likely first impulse would be to use --num-executors 6--executor-cores 15 --executor-memory 63G. However, this is the wrong approach because:
63GB + the executor memory overhead won’t fit within the 63GB capacityof the NodeManagers. The application master will take up a core on oneof the nodes, meaning that there won’t be room for a 15-core executoron that node. 15 cores per executor can lead to bad HDFS I/Othroughput.
A better option would be to use --num-executors 17--executor-cores 5 --executor-memory 19G. Why?
This config results in three executors on all nodes except for the onewith the AM, which will have two executors.--executor-memory was derived as (63/3 executors per node) = 21. 21 * 0.07 = 1.47. 21 – 1.47 ~ 19.
Cloudera 博客中的一篇文章给出了解释,How-to: Tune Your Apache Spark Jobs (Part 2) .
关于hadoop - Apache Spark : The number of cores vs. 执行者数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24622108/
所以我有一个排行榜,我每天使用以下查询有效地获取每个用户的分数: SELECT DATE(a.time) as time, a.userid, SUM(activity_weight) as weig
假设我有一个 ExecutorService(它可以是一个线程池,因此涉及到并发性),它在不同的时间执行一个任务,或者周期性地或者响应一些其他条件。要执行的任务如下: 如果此任务已在进行中,则什么也不
我正在运行的服务器应用程序收到多个任务请求,我想使用任务系统处理这些请求。 每个任务都表示为一个 Runnable,它将从线程池中请求 n 个线程,其中 n 小于或等于线程池大小。为了不线程过多导致
我有一个 long_task 函数,它运行大量 cpu 绑定(bind)计算,我想通过使用新的 asyncio 框架使其异步。生成的 long_task_async 函数使用 ProcessPoolE
Java 文档说 CompletableFuture:supplyAsync(Supplier supplier)在 ForkJoinPool#commonPool() 中运行任务而 Completa
我想了解 Spark Streaming 中的一个基本知识。我有 50 个 Kafka 主题分区和 5 个执行程序,我使用的是 DirectAPI,所以没有。 RDD 分区的数量将为 50。如何在 5
我的问题与 this one here 密切相关.正如在那里发布的那样,我希望主线程等到工作队列为空并且所有任务都已完成。然而,我的情况的问题是,每个任务都可能递归地导致提交新任务进行处理。这使得收集
我是一名优秀的程序员,十分优秀!