如何配置 Hadoop 以使每个数据节点使用不同的目录进行存储?
每个数据节点共享一个存储空间。我希望datanode1 使用dir1,datanode2 使用dir2。起初,我将所有数据节点配置为使用共享存储中的同一目录,结果发现只有一个数据节点在运行。
如何配置 Hadoop 以使每个数据节点使用不同的目录进行存储?
每个数据节点共享一个存储空间。我希望datanode1 使用dir1,datanode2 使用dir2。起初,我将所有数据节点配置为使用共享存储中的同一目录,结果发现只有一个数据节点在运行。
您需要为集群中的每个节点创建一个自定义 hdfs-site.xml 文件,并dfs.data.dir
适当配置数据目录属性 ( )。如果您当前也在为 hadoop 配置使用共享目录,那么您也需要修改您的操作方式。
有点痛苦,我想您可以尝试使用一些 shell 脚本来生成文件,或者使用诸如 Puppet 或 Chef 之类的工具。
一个问题回馈给您-您为什么要使用 NFS,您在某种程度上违背了数据局部性的观点-Hadoop 旨在将您的代码移动到数据所在的位置,而不是(如您的情况)代码和数据。
如果您使用 NFS 是因为它由一些具有数据冗余的 SAN 阵列支持,那么您再次给自己带来困难,假设您有足够大的集群并且配置正确,HDFS 将(如果已配置)为您管理数据复制. 从理论上讲,使用商品硬件的成本也应该低于使用昂贵的 SAN 的支持(我猜取决于您的设置/情况)
我不知道这是否是一种粗略的做法,但这就是我在namenode中自定义slaves.sh文件以实现为每个datanode实现不同目录结构的方式:
编辑在每个数据节点上执行的 ssh 远程命令$HADOOP_HOME/bin/slaves.sh
:
for slave in `cat "$HOSTLIST"|sed "s/#.*$//;/^$/d"`; do
# If the slave node is ap1001 (first datanode),
# Then use a different directory path for SSH command.
if [ $slave == "ap1001" ]
then
input=`/bin/echo $"${@// /\\ }"` >/dev/null 2>&1
# If the command type is start-dfs (start the datanodes)
# Then construct the start command for remote execution on datanode through ssh
/bin/echo $input | grep -i start
if [ $? -eq 0 ]
then
inputArg="cd /app2/configdata/hdp/hadoop-1.2.1 ; /app2/configdata/hdp/hadoop-1.2.1/bin/hadoop-daemon.sh --config /app2/configdata/hdp/hadoop-1.2.1/libexec/../conf start datanode"
else
# If the command type is stop-dfs (stop the datanodes)
# Then construct the stop command for remote execution on datanode through ssh
inputArg="cd /app2/configdata/hdp/hadoop-1.2.1 ; /app2/configdata/hdp/hadoop-1.2.1/bin/hadoop-daemon.sh --config /app2/configdata/hdp/hadoop-1.2.1/libexec/../conf stop datanode"
fi
ssh $HADOOP_SSH_OPTS $slave $inputArg 2>&1 &
else
# Use default command for remaining slaves.
ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
2>&1 | sed "s/^/$slave: /" &
fi
if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
sleep $HADOOP_SLAVE_SLEEP
fi
done
您可以通过创建如下软链接让数据节点和名称节点共享一个公共存储:host1:
lrwxrwxrwx 1 user user 39 Dec 2 17:30 /hadoop/hdfs/datanode -> /shared_storage/datanode1/
lrwxrwxrwx 1 user user 39 Dec 2 17:31 /hadoop/hdfs/namenode -> /shared_storage/namenode1/
主机2:
lrwxrwxrwx 1 user user 39 Dec 2 17:32 /hadoop/hdfs/datanode -> /shared_storage/datanode2/
lrwxrwxrwx 1 user user 39 Dec 2 17:32 /hadoop/hdfs/namenode -> /shared_storage/namenode2/
主机3
lrwxrwxrwx 1 user user 39 Dec 2 17:33 /hadoop/hdfs/datanode -> /shared_storage/datanode3/
lrwxrwxrwx 1 user user 39 Dec 2 17:32 /hadoop/hdfs/namenode -> /shared_storage/namenode3/
主机4:
lrwxrwxrwx 1 user user 39 Dec 2 17:33 /hadoop/hdfs/datanode -> /shared_storage/datanode4/
lrwxrwxrwx 1 user user 39 Dec 2 17:33 /hadoop/hdfs/namenode -> /shared_storage/namenode4/
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///hadoop/hdfs/datanode</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///hadoop/hdfs/datanode</value>
</property>