6.2.2 重要对象初始化
跟踪startTracker()函数内部的执行过程,可定位到它最终创建了一个JobTracker对象。该对象对一些重要对象进行了初始化,具体如表6-1所示。
其中,RPC Server相关内容已在第4章进行了介绍,JobHistoryServer和TaskScheduler将分别在6.2.4节和6.7节介绍,而在本小节中重点分析ACLsManager、HttpServer和DNSToSwitchMapper三个类。
(1)ACLsManager类
它是权限管理类,提供了checkAccess方法以对用户的各种操作进行权限检查。比如,用户提交作业后,JobTracker.submitJob函数中包含以下代码检查用户是否可以提交作业:
try{
aclsManager.checkAccess(job, ugi, Operation.SUBMIT_JOB);
}catch(IOException ioe){
LOG.warn("Access denied for user"+job.getJobConf().getUser()
+".Ignoring job"+jobId, ioe);
job.fail();
throw ioe;
}
该类涉及两种权限:队列权限和作业权限,分别由QueueManager类和JobACLsManager类进行管理。
1)QueueManager类:队列权限管理类。在Hadoop中,队列权限包括两部分:作业提交权限(哪些用户可向队列中提交作业)和作业管理权限(哪些用户可以管理该队列中的作业),分别由参数mapred.queue.<queue-name>.acl-submit-job和mapred.queue.<queue-name>.acl-administer-jobs指定,具体在配置文件mapred-queue-acls.xml中设置。
2)JobACLsManager类:作业权限管理类。用户提交作业时,可设定该作业的查看权限和修改权限,分别由参数mapreduce.job.acl-view-job和mapreduce.job.acl-modify-job指定。
作业查看权限主要用于限制访问作业相关的敏感信息,这些信息包括:
❑作业级别的Counter。
❑任务级别的Counter。
❑任务的诊断信息。
❑TaskTracker的web UI上显示的log信息。
❑JobTracker的web UI上显示的job.xml文件。
作业修改权限主要用于防止其他用户修改自己作业的信息,这些信息包括:
❑杀掉作业。
❑杀掉/终止任务。
❑修改作业的优先级。
(2)HttpServer类
Hadoop对外提供Web服务的HTTP服务器,它封装了轻量级开源Web服务器Jetty[1]。
(3)DNSToSwitchMapper接口
该接口定义了将DNS名称或者节点IP地址转换成网络位置的规则。Hadoop以层次树的方式定义节点的网络位置,并依据该位置存取数据或者调度任务。比如,一个节点nodeX在数据中心dcX中的机架rackX上,可以这样表示它的物理位置:/dcX/rackX/nodeX。
默认情况下,Hadoop提供了一个默认实现ScriptBasedMapping,它允许用户通过编写一个脚本(通过参数topology.script.file.name指定)定义转换规则。下面举例说明ScriptBasedMapping的使用方法。
步骤1 用户将节点与网络位置映射关系放到目录${HADOOP_HOME}/conf下的topology.data文件中,形式如下:
node1/dc1/rack1
node2/dc1/rack1
node3/dc1/rack1
node4/dc2/rack2
步骤2 编写Shell脚本node2rack.sh,内容如下:
!/bin/bash
HADOOP_CONF=${HADOOP_HOME}/conf
while[$#-gt 0];do
nodeArg=$1
exec<${HADOOP_CONF}/topology.data
result=""
while read line;do
ar=($line)
if["${ar[0]}"="$nodeArg"];then
result="${ar[1]}"
fi
done
shift
if[-z"$result"];then
echo-n"/default/rack"
else
echo-n"$result"
fi
done
步骤3 在core-site.xml中添加配置选项,具体如下:
<property>
<name>topology.script.file.name</name>
<value>/opt/scripts/node2rack.sh</value>
</property>
当然,用户也可以实现DNSToSwitchMapper接口,并通过配置参数topology.node.switch.mapping.impl指定对应的实现类。
[1]http://jetty. codehaus.org/jetty/