前言
在AWS EMR(Elastic MapReduce)中,可以通过设置Bootstrap Action来为Hadoop集群安装Ganglia来监视集群的运行状况。EMR在lauch所有instance之后会自动帮你下载Ganglia,为你安装,配置,启动,不用用户自己做任何设置工作,十分方便。然而“方便”的代价就是牺牲灵活行。在大多数情况下,EMR为咱们自动配置的ganglia环境已经足够好用了,足以应付我们的绝大多数需求。但是一旦我们遇到了奇怪的需求,需要自己配置ganglia,就麻烦了。最近,我就遇到了这么一个“奇怪”的需求:由于我的MapReduce任务运行时间比较短,也就1,2分钟,所以我需要ganglia监视系统性能时取数据的间隔能够密集一些。ganglia在默认条件下监视的间隔是15秒,所以如果我的任务一共只有1分钟,那么ganglia才会给我采集到4个点,这就没有意义了。所以我需要将监视间隔改成1秒。而EMR启动ganglia的Bootstrap脚本是没有任何参数的,所以我们不能通过EMR直接实现。经过艰苦的探索,我终于找到了解决这个问题的方法。本文就以“监视间隔改成1秒”为例,介绍一下在EMR中改变Ganglia配置的方法。
EMR配置和启动Ganglia的原理
首先介绍一下EMR是如何在Hadoop集群中安装,配置和启动Ganglia的。在EMR中启动Ganglia的方法很简单,就是在Bootstrap Action中添加一个Action, 脚本地址是:s3://elasticmapreduce/bootstrap-actions/install-ganglia。更详细的信息请看这里。这个install-ganglia是一个Ruby程序,EMR在一个instance启动后,会从S3上下载这个install-ganglia,然后在instance内执行。所以我们先看看这个install-ganglia里面到底写了些什么。我们可以通过这个地址把install-ganglia文件下载下来:https://s3.amazonaws.com/elasticmapreduce/bootstrap-actions/install-ganglia。这个文件里面的内容非常简单,就是根据你选择的hadoop的版本,选择一个对应的另外一个脚本的版本,然后执行这一行:
executor.run("hadoop fs -copyToLocal s3://#{BUCKET_NAME}/bootstrap-actions/ganglia/#{version_num}/ganglia-installer .")
也就是要再下载另外一个Ruby脚本来真正安装ganglia。我们同样把这个Ruby脚本文件也下载下来。假如我们选择的Hadoop版本是0.20.205,通过阅读install-ganglia脚本,我们知道对应的版本是2.0,所以我们下载脚本文件的地址就是: https://s3.amazonaws.com/elasticmapreduce/bootstrap-actions/ganglia/2.0/ganglia-installer。通过阅读,我们知道这个ganglia-installer脚本正是我们所需要的。
我们来看一看这个脚本中都干了什么。首先下载并解压ganglia:
def download_and_unzip_ganglia
run("mkdir -p ~/source")
run("cd ~/source && wget http://#{BUCKET_NAME}.s3.amazonaws.com/bootstrap-actions/ganglia/2.0/#{GANGLIA}.tar.gz")
run("cd ~/source && tar xvfz #{GANGLIA}.tar.gz")
end
然后就是一系列的配置。其中有两个部分是我们所关心的。配置gmond: