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
Apache spark 为Spark作业划分RDD_Apache Spark_Yarn - Fatal编程技术网

Apache spark 为Spark作业划分RDD

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

当我在Thread cluster中提交作业spark时,我看到spark UI,我得到了4个阶段的作业,但在所有节点中使用的内存都非常低,它显示使用了4 gb中的0个。我想这可能是因为我把它留在了默认分区中

s3中的文件大小范围介于1MB到100MB之间。大约有2700个文件,大小为
26 GB
。在第二阶段中,2700个工作正在运行

是否值得重新划分约640个分区,是否会提高性能?或
分区是否比实际需要的粒度更细并不重要?或
我的提交参数需要解决吗

群集详细信息

具有10个节点的群集
总内存500 GB
总体vCores 64


实际上,它在64个内核中的17个上运行。我不想增加核心的数量,因为其他人可能会使用群集。

由于以下原因,您需要进行分区和重新分区:

  • 确保我们有足够的工作分配给集群中不同的核心(节点*每个节点的核心)。显然,我们需要调整执行器的数量、每个执行器的内核数和每个执行器的内存数,以实现预期目标
  • 为了确保我们均匀地分配工作:分区越小,一个内核比所有其他内核有更多工作要做的可能性就越小。如果分区太大,歪斜分布会对总失效时间产生巨大影响
  • 使分区保持可管理的大小。不要太大,也不要太小,这样我们就不会对GC过度征税。当我们使用非线性O时,更大的分区可能会有问题
  • 对小分区的访问将产生太多的进程开销
正如你可能已经注意到的,将会有一个金发区。测试将帮助您确定理想的分区大小

请注意,分区比核心多得多是可以的。将要分配任务的分区排队是我设计的目标

另外,请确保正确配置spark作业,否则:

  • 确保你没有太多的遗嘱执行人。每个节点只有一个或很少的执行器就足够了。较少的执行者将具有较少的开销,因为它们在共享内存空间中工作,并且单个任务由线程而不是进程处理。启动一个进程需要大量的开销,但是线程是非常轻量级的
  • 任务需要相互交谈。如果它们在同一个执行器中,则可以在内存中执行。如果它们在不同的执行器(进程)中,那么这种情况会在套接字上发生(开销)。如果这是通过多个节点进行的,则会通过传统的网络连接进行(更大的开销)
  • 为执行者分配足够的内存。当使用Thread作为调度器时,默认情况下,它将根据执行器的内存而不是您声明使用的CPU来匹配执行器

我不知道您的情况是什么(您使节点名称不可见),但是如果您只有一个具有15个核心的节点,那么16个执行器就没有意义了。相反,设置一个执行器,每个执行器16个内核。

顺便说一句,如果您使用的是
warn
,则可以将资源管理器设置为
FAIR
,spark ui报告的内存使用量仅反映持久化RDD。如果您的作业从未持续使用RDD,则此值将保持为0,并且不会反映作业正在使用的内存。为了在集群上高效使用,需要将大文件拆分为更小的块,可以对其进行重新分区。例如,大型压缩文件、大型未压缩文件将自动拆分。
--excutor-memory 16 g
--num-executors 16
--executor-cores 1