Apache spark 为Spark作业划分RDD
当我在Thread cluster中提交作业spark时,我看到spark UI,我得到了4个阶段的作业,但在所有节点中使用的内存都非常低,它显示使用了4 gb中的0个。我想这可能是因为我把它留在了默认分区中 s3中的文件大小范围介于1MB到100MB之间。大约有2700个文件,大小为Apache spark 为Spark作业划分RDD,apache-spark,yarn,Apache Spark,Yarn,当我在Thread cluster中提交作业spark时,我看到spark UI,我得到了4个阶段的作业,但在所有节点中使用的内存都非常低,它显示使用了4 gb中的0个。我想这可能是因为我把它留在了默认分区中 s3中的文件大小范围介于1MB到100MB之间。大约有2700个文件,大小为26 GB。在第二阶段中,2700个工作正在运行 是否值得重新划分约640个分区,是否会提高性能?或 分区是否比实际需要的粒度更细并不重要?或 我的提交参数需要解决吗 群集详细信息 具有10个节点的群集 总内存5
26 GB
。在第二阶段中,2700个工作正在运行
是否值得重新划分约640个分区,是否会提高性能?或分区是否比实际需要的粒度更细并不重要?或
我的提交参数需要解决吗 群集详细信息 具有10个节点的群集
总内存500 GB
总体vCores 64
实际上,它在64个内核中的17个上运行。我不想增加核心的数量,因为其他人可能会使用群集。由于以下原因,您需要进行分区和重新分区:
- 确保我们有足够的工作分配给集群中不同的核心(节点*每个节点的核心)。显然,我们需要调整执行器的数量、每个执行器的内核数和每个执行器的内存数,以实现预期目标
- 为了确保我们均匀地分配工作:分区越小,一个内核比所有其他内核有更多工作要做的可能性就越小。如果分区太大,歪斜分布会对总失效时间产生巨大影响
- 使分区保持可管理的大小。不要太大,也不要太小,这样我们就不会对GC过度征税。当我们使用非线性O时,更大的分区可能会有问题
- 对小分区的访问将产生太多的进程开销
- 确保你没有太多的遗嘱执行人。每个节点只有一个或很少的执行器就足够了。较少的执行者将具有较少的开销,因为它们在共享内存空间中工作,并且单个任务由线程而不是进程处理。启动一个进程需要大量的开销,但是线程是非常轻量级的李>
- 任务需要相互交谈。如果它们在同一个执行器中,则可以在内存中执行。如果它们在不同的执行器(进程)中,那么这种情况会在套接字上发生(开销)。如果这是通过多个节点进行的,则会通过传统的网络连接进行(更大的开销)
- 为执行者分配足够的内存。当使用Thread作为调度器时,默认情况下,它将根据执行器的内存而不是您声明使用的CPU来匹配执行器
我不知道您的情况是什么(您使节点名称不可见),但是如果您只有一个具有15个核心的节点,那么16个执行器就没有意义了。相反,设置一个执行器,每个执行器16个内核。顺便说一句,如果您使用的是
warn
,则可以将资源管理器设置为FAIR
,spark ui报告的内存使用量仅反映持久化RDD。如果您的作业从未持续使用RDD,则此值将保持为0,并且不会反映作业正在使用的内存。为了在集群上高效使用,需要将大文件拆分为更小的块,可以对其进行重新分区。例如,大型压缩文件、大型未压缩文件将自动拆分。
--excutor-memory 16 g
--num-executors 16
--executor-cores 1