YARN 如何决定创建多少个容器? (为什么S3a和HDFS有区别?)
How does YARN decide to create how many containers? (Why the difference between S3a and HDFS?)
我正在使用当前版本的 Hadoop,运行 一些 TestDFSIO 基准测试 (v. 1.8) 来比较默认文件系统为 HDFS 的情况默认文件系统是 S3 存储桶(通过 S3a 使用)。
当读取默认文件系统为 S3a 的 100 x 1 MB 文件时,我观察到 YARN Web 中的最大容器数 UI 小于默认为 HDFS,S3a 大约慢 4 倍。
当读取默认文件系统为 S3a 的 1000 x 10 KB 文件时,我观察到 YARN Web UI 中的最大容器数至少为 比默认情况下 HDFS 的情况少 10 倍,S3a 大约慢 16 倍。 (例如,HDFS 默认情况下的测试执行时间为 50 秒,而 S3a 默认情况下的测试执行时间为 16 分钟。)
启动的地图任务的数量在每种情况下都符合预期,这方面没有区别。但是为什么 YARN 创建的容器数量至少减少10 倍(例如HDFS 上的117 个与S3a 上的8 个)?当集群的vcores、RAM、job的input splits、launched map tasks相同时,YARN如何决定创建多少个容器; 只有存储后端不同?
当 运行 相同的 TestDFSIO 作业时,期望 HDFS 与 Amazon S3(通过 S3a)之间的性能差异当然很好,我所追求的是了解 YARN 如何决定它在这些作业期间启动的最大容器,其中仅更改了默认文件系统,因为目前,当默认文件系统为 S3a 时,YARN 几乎没有使用 90% 的并行度(默认情况下它通常会这样做)文件系统是 HDFS)。
集群为15节点集群,有1个NameNode,1个ResourceManager(YARN),13个DataNode(工作节点)。每个节点有 128 GB RAM 和 48 核 CPU。这是一个专用的测试集群:在 TestDFSIO 测试运行期间,集群上没有其他任何东西运行。
对于 HDFS,dfs.blocksize
是 256m
,它使用 4 个硬盘(dfs.datanode.data.dir
设置为 file:///mnt/hadoopData1,file:///mnt/hadoopData2,file:///mnt/hadoopData3,file:///mnt/hadoopData4
)。
对于S3a,fs.s3a.block.size
设置为268435456
,即256m,与HDFS默认块大小相同。
Hadoop tmp 目录位于 SSD 上(通过在 core-site.xml
中将 hadoop.tmp.dir
设置为 /mnt/ssd1/tmp
,并在 mapred-site.xml
)
性能差异(默认 HDFS,与默认设置为 S3a)总结如下:
TestDFSIO v. 1.8 (READ)
fs.default.name # of Files x Size of File Launched Map Tasks Max # of containers observed in YARN Web UI Test exec time sec
============================= ========================= ================== =========================================== ==================
hdfs://hadoop1:9000 100 x 1 MB 100 117 19
hdfs://hadoop1:9000 1000 x 10 KB 1000 117 56
s3a://emre-hadoop-test-bucket 100 x 1 MB 100 60 78
s3a://emre-hadoop-test-bucket 1000 x 10 KB 1000 8 1012
长话短说,作为连接到 Amazon S3 或其他 S3 兼容对象存储的重要标准之一 YARN uses to decide how many containers to create is based on data locality. When using a non-HDFS file system, such as S3a,文件系统负责提供有关数据局部性的信息,因为在这样的话,none的数据在一个节点本地,每个节点都需要从网络中获取数据,或者从另一个角度来看,每个节点都具有相同的数据局部性。
上一段解释了我在 运行 Hadoop MapReduce 作业针对 Amazon S3 使用 S3a 文件系统时观察到的容器创建行为。为了解决这个问题,我已经开始着手打补丁,开发将通过 HADOOP-12878 进行跟踪。
另请参阅以下内容:
- SO question:hadoop/yarn and task parallelization on non-hdfs filesystems
- Mail list thread: hadoop/yarn and task parallelization on non-hdfs filesystems
我正在使用当前版本的 Hadoop,运行 一些 TestDFSIO 基准测试 (v. 1.8) 来比较默认文件系统为 HDFS 的情况默认文件系统是 S3 存储桶(通过 S3a 使用)。
当读取默认文件系统为 S3a 的 100 x 1 MB 文件时,我观察到 YARN Web 中的最大容器数 UI 小于默认为 HDFS,S3a 大约慢 4 倍。
当读取默认文件系统为 S3a 的 1000 x 10 KB 文件时,我观察到 YARN Web UI 中的最大容器数至少为 比默认情况下 HDFS 的情况少 10 倍,S3a 大约慢 16 倍。 (例如,HDFS 默认情况下的测试执行时间为 50 秒,而 S3a 默认情况下的测试执行时间为 16 分钟。)
启动的地图任务的数量在每种情况下都符合预期,这方面没有区别。但是为什么 YARN 创建的容器数量至少减少10 倍(例如HDFS 上的117 个与S3a 上的8 个)?当集群的vcores、RAM、job的input splits、launched map tasks相同时,YARN如何决定创建多少个容器; 只有存储后端不同?
当 运行 相同的 TestDFSIO 作业时,期望 HDFS 与 Amazon S3(通过 S3a)之间的性能差异当然很好,我所追求的是了解 YARN 如何决定它在这些作业期间启动的最大容器,其中仅更改了默认文件系统,因为目前,当默认文件系统为 S3a 时,YARN 几乎没有使用 90% 的并行度(默认情况下它通常会这样做)文件系统是 HDFS)。
集群为15节点集群,有1个NameNode,1个ResourceManager(YARN),13个DataNode(工作节点)。每个节点有 128 GB RAM 和 48 核 CPU。这是一个专用的测试集群:在 TestDFSIO 测试运行期间,集群上没有其他任何东西运行。
对于 HDFS,dfs.blocksize
是 256m
,它使用 4 个硬盘(dfs.datanode.data.dir
设置为 file:///mnt/hadoopData1,file:///mnt/hadoopData2,file:///mnt/hadoopData3,file:///mnt/hadoopData4
)。
对于S3a,fs.s3a.block.size
设置为268435456
,即256m,与HDFS默认块大小相同。
Hadoop tmp 目录位于 SSD 上(通过在 core-site.xml
中将 hadoop.tmp.dir
设置为 /mnt/ssd1/tmp
,并在 mapred-site.xml
)
性能差异(默认 HDFS,与默认设置为 S3a)总结如下:
TestDFSIO v. 1.8 (READ)
fs.default.name # of Files x Size of File Launched Map Tasks Max # of containers observed in YARN Web UI Test exec time sec
============================= ========================= ================== =========================================== ==================
hdfs://hadoop1:9000 100 x 1 MB 100 117 19
hdfs://hadoop1:9000 1000 x 10 KB 1000 117 56
s3a://emre-hadoop-test-bucket 100 x 1 MB 100 60 78
s3a://emre-hadoop-test-bucket 1000 x 10 KB 1000 8 1012
长话短说,作为连接到 Amazon S3 或其他 S3 兼容对象存储的重要标准之一 YARN uses to decide how many containers to create is based on data locality. When using a non-HDFS file system, such as S3a,文件系统负责提供有关数据局部性的信息,因为在这样的话,none的数据在一个节点本地,每个节点都需要从网络中获取数据,或者从另一个角度来看,每个节点都具有相同的数据局部性。
上一段解释了我在 运行 Hadoop MapReduce 作业针对 Amazon S3 使用 S3a 文件系统时观察到的容器创建行为。为了解决这个问题,我已经开始着手打补丁,开发将通过 HADOOP-12878 进行跟踪。
另请参阅以下内容:
- SO question:hadoop/yarn and task parallelization on non-hdfs filesystems
- Mail list thread: hadoop/yarn and task parallelization on non-hdfs filesystems