数据本地化的基础是Hadoop集群的正常运行,需完成以下配置:
JAVA_HOME环境变量;HADOOP_HOME环境变量;core-site.xml、hdfs-site.xml),包括NameNode/ DataNode数据目录(dfs.namenode.name.dir、dfs.datanode.data.dir)、块大小(dfs.blocksize)、副本数(dfs.replication);hdfs namenode -format)并启动集群(start-dfs.sh、start-yarn.sh)。YARN是Hadoop的资源管理器,需通过参数调整让任务优先调度到数据所在节点:
$HADOOP_HOME/etc/hadoop/yarn-site.xml,添加或修改以下属性:<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>3000</value> <!-- 单位:毫秒,任务等待数据本地化的最长时间 -->
</property>
<property>
<name>yarn.scheduler.capacity.rack-locality-additional-delay</name>
<value>-1</value> <!-- 禁用机架本地化的额外延迟,优先数据本地化 -->
</property>
这些参数确保YARN调度器在分配任务时,优先选择数据所在的节点;若等待超时(如3秒),则放宽至同一机架的节点。MapReduce作业的本地化行为由mapred-site.xml控制,需调整以下参数:
$HADOOP_HOME/etc/hadoop/mapred-site.xml(若不存在则从mapred-site.xml.template复制),添加或修改:<property>
<name>mapreduce.job.locality.wait</name>
<value>300000</value> <!-- 单位:毫秒,Map任务等待数据本地化的时间(默认300秒) -->
</property>
<property>
<name>mapreduce.reduce.locality.wait</name>
<value>300000</value> <!-- Reduce任务的本地化等待时间 -->
</property>
这些参数让Map/Reduce任务在数据所在节点执行,减少网络传输开销;若等待超时,则调度至其他节点。通过以下方式确认数据本地化是否生效:
yarn application -list获取正在运行的应用ID,再用yarn logs -applicationId <app_id>查看任务日志,检查“Locality Level”字段(如“NODE_LOCAL”表示数据本地化,“RACK_LOCAL”表示机架本地化,“ANY”表示跨节点)。hdfs dfsadmin -report,检查DataNode的数据块存储情况,确保数据均匀分布在各节点;若有大量数据集中在某节点,可优化机架感知配置(见下文)。若集群有多个机架,可通过机架感知让Hadoop更精准地将数据块存储在同一机架的节点上,进一步提升本地化效率:
$HADOOP_HOME/etc/hadoop/core-site.xml,添加机架拓扑脚本路径:<property>
<name>net.topology.script.file.name</name>
<value>/etc/hadoop/conf/topology.sh</value> <!-- 脚本路径 -->
</property>
topology.sh脚本(赋予执行权限chmod +x /etc/hadoop/conf/topology.sh),内容示例如下:#!/bin/bash
# 根据IP地址返回机架ID(示例:将192.168.1.x归为rack1,192.168.2.x归为rack2)
IP=$1
if [[ $IP =~ ^192\.168\.1\..* ]]; then
echo "rack1"
elif [[ $IP =~ ^192\.168\.2\..* ]]; then
echo "rack2"
else
echo "default-rack"
fi
$HADOOP_HOME/etc/hadoop/hdfs-site.xml,启用机架感知策略:<property>
<name>dfs.replication.policy</name>
<value>org.apache.hadoop.hdfs.server.namenode.RackAwareReplicationPolicy</value>
</property>
该配置让HDFS在复制数据块时,优先将副本存储在同一机架的不同节点,减少跨机架传输。通过以上步骤,Ubuntu下的Hadoop集群可实现数据本地化,显著降低网络传输开销,提升作业执行效率。需注意,配置完成后需重启Hadoop集群(stop-dfs.sh、stop-yarn.sh、start-dfs.sh、start-yarn.sh)使参数生效。