我正在研究hadoop性能建模。hadoop有200多个参数,所以手动设置它们是不可能的。因此,我们经常使用默认参数值运行hadoop作业(比如使用默认值io.sort.mb、io.sort.record.percent、mapred.output.compress等)。但使用默认参数值会给我们带来次优的性能。希罗多德在这方面做了一些工作(http://www.cs.duke.edu/starfish/files/vldb11-job-optimization.pdf)提高绩效。但我对他们的工作有以下怀疑--
在mapreduce作业的所有阶段(读取、Map、收集等),它们在作业开始时(根据数据的比例假设)固定参数值。通过改变特定节点的hadoop配置日志文件,可以在运行时根据运行时环境(如集群配置、底层文件系统等)为每个阶段设置不同的参数值,从而从一个节点获得最佳性能吗?
他们使用的是hadoop核心的白盒模型,他们是否仍然适用于当前的hadoop(http://arxiv.org/pdf/1106.0940.pdf) ?
1条答案
按热度按时间ws51t4hk1#
不,无法动态更改每个节点每个作业的mapreduce参数。
配置节点集
相反,您可以在配置文件中静态地更改每个节点的配置参数(通常位于
/etc/hadoop/conf
),这样您就可以使用不同的h/w配置最大限度地利用集群。示例:假设您有20个具有不同硬件配置的工作节点,例如:
10个,配置128gb ram,24核
10个64gb ram,12核
在这种情况下,您可能希望配置每个相同的服务器以充分利用硬件,例如,您可能希望在具有更多ram和内核的工作节点上运行更多子任务(Map器和还原器),例如:
具有128gb ram、24核=>36个工作任务(Map器+还原器)的节点,每个工作任务的jvm堆大约为3gb。
具有64gb ram、12核=>18个工作任务(Map器+还原器)的节点,每个工作任务的jvm堆大约为3gb。
因此,您需要使用适当的参数分别配置节点集。
使用toolrunner将配置参数动态传递给作业:
此外,您可以动态更改每个作业的mapreduce作业参数,但这些参数将应用于整个集群,而不仅仅应用于一组节点。提供mapreduce作业驱动程序扩展toolrunner。
toolrunner允许您解析通用hadoop命令行参数。您可以使用
-D property.name=property.value
.几乎可以将所有hadoop参数动态地传递给作业。但最常见的动态传递给作业的mapreduce配置参数是:
mapreduce.task.io.sort.mb
mapreduce.map.speculative
mapreduce.job.reducesmapreduce.task.io.sort.factor
mapreduce.map.output.compressmapreduce.map.outout.compress.codec
mapreduce.reduce.memory.mbmapreduce.map.memory.mb
下面是一个例子terasort
每个作业动态传递大量参数的作业: