1

我让我的学生使用bdutil永久磁盘和 HDFS 作为默认文件系统创建一个 Google Compute Engine 集群。我们希望拥有永久性磁盘,以便学生可以在几周内完成项目。但是,重新部署集群后,HDFS 似乎无法使用。

我的问题实际上是“如何跨集群重新部署维护持久的 HDFS 文件系统?”

这是我尝试过的

在创建永久磁盘的初始部署中一切正常。我用命令创建一个目录

$ hadoop fs -mkdir /foo
$ hadoop fs –put foo.txt /foo/foo.txt
$ hadoop fs –cat /foo/foo.txt
foo

然后我删除并重新部署集群,DELETE_ATTACHED_PDS_ON_DELETE=falseCREATE_ATTACHED_PDS_ON_DEPLOY=false在重新部署过程中保留永久性磁盘

当我 ssh 进入重新部署的集群时,我可以看到我创建的文件

$ hadoop fs –ls /foo
Found 1 items
-rw-r--r--   3 mpcs supergroup          4 2014-10-01 13:16 /foo/foo.txt

但是,任何访问文件内容的尝试都会失败:

$ hadoop fs –cat /foo/foo.txt
cat: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Zero blocklocations for /foo/foo.txt. Name node is in safe mode

手动关闭安全代码无济于事

$ hadoop dfsadmin -safemode leave
Safe mode is OFF
$ hadoop fs –cat /foo/foo.txt
14/10/01 13:31:20 INFO hdfs.DFSClient: No node available for: blk_2908405986797013125_1002 file=/foo/foo.txt
14/10/01 13:31:20 INFO hdfs.DFSClient: Could not obtain blk_2908405986797013125_1002 from any node: java.io.IOException: No live nodes contain current block. Will get new block locations from namenode and retry...
*etc*

任何关于如何创建可以在重新部署集群时持续存在的 HDFS 存储的建议将不胜感激

谢谢,

麦克风

4

1 回答 1

3

感谢详细报告!实际上,您似乎发现了一个在几个版本中引入的错误,bdutil-0.35.2/libexec/configure_hadoop.sh不幸的是,该错误破坏了 datanode 数据目录上的目录权限,其设置为 775 与预期的默认值 755(对于 Hadoop 1.2.1)或 700 相比略微过于宽松(对于 Hadoop 2.4.1)。这会导致数据节点在重新启动时永远不会恢复,打印:

2014-10-01 20:37:59,810 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /mnt/pd1/hadoop/dfs/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
2014-10-01 20:37:59,811 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid.

如果您使用 Hadoop 1.2.1,您可以直接在损坏的重新部署的集群上运行的短期解决方法是运行:

./bdutil run_command -t all -- "chmod 755 /hadoop/dfs/data"
./bdutil run_command -t master -- "sudo -u hadoop /home/hadoop/hadoop-install/bin/stop-dfs.sh"
./bdutil run_command -t master -- "sudo -u hadoop /home/hadoop/hadoop-install/bin/start-dfs.sh"

事实证明,Hadoop 2 实际上通过让 DataNode 继续并设置它需要的权限(如果它不匹配)来解决这个问题:

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.hadoop/hadoop-common/2.2.0/org/apache/hadoop/util/DiskChecker.java#130

120  public static void More ...mkdirsWithExistsAndPermissionCheck(
121      LocalFileSystem localFS, Path dir, FsPermission expected)
122      throws IOException {
123    File directory = localFS.pathToFile(dir);
124    boolean created = false;
125
126    if (!directory.exists())
127      created = mkdirsWithExistsCheck(directory);
128
129    if (created || !localFS.getFileStatus(dir).getPermission().equals(expected))
130        localFS.setPermission(dir, expected);
131  }

而 Hadoop 1 刚刚退出:

https://github.com/apache/hadoop/blob/release-1.2.1/src/core/org/apache/hadoop/util/DiskChecker.java#L106

private static void checkPermission(Path dir, 
                                   FsPermission expected, FsPermission actual) 
throws IOException {
  // Check for permissions
  if (!actual.equals(expected)) {
    throw new IOException("Incorrect permission for " + dir + 
                          ", expected: " + expected + ", while actual: " + 
                          actual);
  }

}

我们将在下一个 bdutil 版本中使用显式设置修复此问题,dfs.datanode.data.dir.perm但与此同时,您还可以使用以下硬编码解决方法修补patch bdutil-0.35.2/libexec/configure_hdfs.sh tmpfix.diff

43a44,46
>   # Make sure the data dirs have the expected permissions.
>   chmod 755 ${HDFS_DATA_DIRS}
> 

或者,如果您将 bdutil 与 一起使用-e hadoop2_env.sh,那么 HDFS 持久性应该已经可以工作,无需任何进一步的修改。

于 2014-10-01T22:37:04.727 回答