【问题标题】:Hadoop performance modelingHadoop 性能建模
【发布时间】:2015-01-27 18:56:43
【问题描述】:

我正在研究 Hadoop 性能建模。 Hadoop 有 200 多个参数,因此无法手动设置它们。因此,我们经常使用默认参数值运行我们的 hadoop 作业(例如使用默认值 io.sort.mb、io.sort.record.percent、mapred.output.compress 等)。但是使用默认参数值会给我们带来次优性能。 Herodotos Herodotou (http://www.cs.duke.edu/starfish/files/vldb11-job-optimization.pdf) 在这方面做了一些工作来提高性能。但我对他们的工作有以下疑问--

  1. 他们正在为 MapReduce 作业的所有阶段(读取、映射、收集等)固定作业开始时的参数值(根据数据的比例假设)。我们是否可以根据运行时环境(如集群配置、底层文件系统等)在运行时为每个阶段设置不同的这些参数值,通过更改特定节点的 Hadoop 配置日志文件以从节点获得最佳性能?
  2. 他们正在为 Hadoop 核心使用白盒模型,它们仍然适用于 当前的 Hadoop (http://arxiv.org/pdf/1106.0940.pdf)?

【问题讨论】:

  • Priyan,我不会投票结束这个问题,因为我对 Hadoop 的了解不够,无法知道这是否是一个好问题,但看起来 (a) 你没有提供足够的细节您尝试过什么以及您正在尝试做什么,并且(b)您提出的问题过于宽泛。 (#1 看起来您想要文档页面,而不是问题的答案。)我建议您编辑您的问题以使其更具体。其他人可能会投票关闭它。
  • 现在,正确吗?
  • 是的,很好。我认为编辑是让 Ashrith 能够回答的原因。 (#2 对我来说仍然不是很清楚,如果您指的是白盒模型的通用概念。如果有 Hadoop 特定的白盒模型概念,那么可能 #2 很清楚。正如我所说,我不了解 Hadoop。但如果 Ashrith 回答了第 1 条,而您仍然对第 2 条有疑问,也许您应该发布一个关于第 2 条的单独 Stackoverflow 问题。)

标签: performance hadoop modeling


【解决方案1】:

不,您不能为每个节点的每个作业动态更改 MapReduce 参数。

配置节点集

您可以做的是在配置文件(通常位于/etc/hadoop/conf)中静态更改每个节点的配置参数,以便您可以通过不同的硬件配置充分利用集群。

示例:假设您有 20 个具有不同硬件配置的工作节点,例如:

  • 10 个,配置 128GB RAM,24 核
  • 10 个,配置 64GB RAM,12 个核心

在这种情况下,您可能希望配置每个相同的服务器以充分利用硬件,例如,您可能希望在具有更多 RAM 和核心的工作节点上运行更多子任务(映射器和缩减器),例如:

  • 具有 128GB RAM、24 核 => 36 个工作任务(映射器 + 减速器)的节点,每个工作任务的 JVM 堆约为 3GB。
  • 具有 64GB RAM、12 个内核的节点 => 18 个工作任务(映射器 + 减速器),每个工作任务的 JVM 堆大约为 3GB。

因此,您可能希望使用适当的参数分别配置节点集。

使用 ToolRunner 将配置参数动态传递给 Job:

此外,您可以动态更改每个作业的 MapReduce 作业参数,但这些参数将应用于整个集群,而不仅仅是一组节点。前提是您的 MapReduce 作业驱动程序扩展了 ToolRunner

ToolRunner 允许您解析generic hadoop command line arguments。您将能够使用 -D property.name=property.value 传递 MapReduce 配置参数。

您几乎可以将几乎所有的 hadoop 参数动态地传递给作业。但大多数通常动态地将 MapReduce 配置参数传递给作业是:

  • mapreduce.task.io.sort.mb
  • mapreduce.map.speculative
  • mapreduce.job.reduces
  • mapreduce.task.io.sort.factor
  • mapreduce.map.output.compress
  • mapreduce.map.outout.compress.codec
  • mapreduce.reduce.memory.mb
  • mapreduce.map.memory.mb

这是一个示例 terasort 作业,每个作业动态传递大量参数:


hadoop jar hadoop-mapreduce-examples.jar tearsort \
    
  -Ddfs.replication=1 -Dmapreduce.task.io.sort.mb=500 \
    
  -Dmapreduce.map.sort.splill.percent=0.9 \
    
  -Dmapreduce.reduce.shuffle.parallelcopies=10 \
    
  -Dmapreduce.reduce.shuffle.memory.limit.percent=0.1 \
    
  -Dmapreduce.reduce.shuffle.input.buffer.percent=0.95 \
    
  -Dmapreduce.reduce.input.buffer.percent=0.95 \
    
  -Dmapreduce.reduce.shuffle.merge.percent=0.95 \
    
  -Dmapreduce.reduce.merge.inmem.threshold=0 \
    
  -Dmapreduce.job.speculative.speculativecap=0.05 \
    
  -Dmapreduce.map.speculative=false \
    
  -Dmapreduce.map.reduce.speculative=false \

  -Dmapreduce.job.jvm.numtasks=-1 \
  -Dmapreduce.job.reduces=84 \

  -Dmapreduce.task.io.sort.factor=100 \
    
  -Dmapreduce.map.output.compress=true \

  -Dmapreduce.map.outout.compress.codec=\
        
    org.apache.hadoop.io.compress.SnappyCodec \
    
  -Dmapreduce.job.reduce.slowstart.completedmaps=0.4 \
    
  -Dmapreduce.reduce.merge.memtomem.enabled=fasle \
    
  -Dmapreduce.reduce.memory.totalbytes=12348030976 \
    
  -Dmapreduce.reduce.memory.mb=12288 \

  -Dmapreduce.reduce.java.opts=“-Xms11776m -Xmx11776m \
      
    -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode \
      
    -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=4” \

  -Dmapreduce.map.memory.mb=4096 \

  -Dmapreduce.map.java.opts=“-Xmx1356m” \
    
  /terasort-input /terasort-output

【讨论】:

  • 我想进一步了解您的第二点“您可以做什么......”意味着如果您在提交作业时不指定,那么 Hadoop 将使用本地节点配置日志在作业执行时访问参数值,您可以根据某些节点性能模型给出的建议在运行时使用 bash 脚本修改这些日志文件。还有一件事,Hadoop 是从每个作业阶段的日志中访问这些参数值,还是在节点上每个作业只访问一次?
  • Hadoop 守护程序仅在启动时从配置行读取属性一次,因此如果您更改了配置文件中的参数,您必须重新启动守护程序以强制它们读取新的配置参数。
  • 好的,有没有办法在每个阶段(读取、映射、收集溢出等阶段)中更改参数(与阶段无关的参数),因为如果我将停止在节点上运行的守护进程它不会恢复计算(它会重做所有阶段,Hadoop 可能会开始推测执行)并且性能会下降。
  • 覆盖每个作业的参数的一种方法是在作业的驱动程序类中设置它们或使用 ToolRunner 从命令行传入,如上所示。
  • 好的,但是这些阶段(如读取、映射、收集溢出等阶段)存在于一项工作中。
猜你喜欢
  • 2012-02-21
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多