如何配置hadoop,使每个datanode使用不同的目录?

jhkqcmku  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(331)

如何配置hadoop,使每个datanode使用不同的目录进行存储?
每个数据节点共享一个存储空间。我希望datanode1使用dir1,datanode2使用dir2。首先,我将所有datanode配置为在共享存储中使用同一个目录,结果发现只有一个datanode在运行。

eni9jsuy

eni9jsuy1#

您需要为集群中的每个节点提供一个自定义的hdfs-site.xml文件,其中包含data directory属性( dfs.data.dir )配置适当。如果您当前也在使用hadoop配置的共享目录,那么您也需要修改您的操作方式。
有点痛苦,我想您可以尝试使用一些shell脚本来生成文件,或者使用puppet或chef之类的工具。
现在又有一个问题摆在你面前——为什么要使用nfs,你在某种程度上破坏了数据局部性这一点——hadoop的设计目的是将代码移动到数据所在的位置,而不是(根据你的情况)同时移动代码和数据。
如果您使用nfs是因为它由一些具有数据冗余的san阵列支持,那么您又一次给自己制造了麻烦,hdfs将(如果配置)为您管理数据复制,前提是您有足够大的集群并且配置正确。从理论上讲,使用商品硬件的成本也应该比使用昂贵的san(我想这取决于您的设置/情况)低

dced5bon

dced5bon2#

通过创建如下软链接,可以让datanodes和namenodes共享一个公共存储: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/

在每个数据节点上的hdfs-site.xml中:

<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>
mo49yndu

mo49yndu3#

我不知道这是否是一种粗糙的方法,但这就是我在namenode中定制slaves.sh文件的方式,以实现每个datanode的不同目录结构:
编辑在中的每个datanode上执行的ssh remote命令 $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

相关问题