在Google Cloud中维护持久性HDFS

时间:2014-10-01 13:48:40

标签: google-compute-engine google-cloud-platform google-hadoop

我让我的学生使用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的群集来保留重新部署中的永久磁盘

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

$ 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商店的任何建议

谢谢,

麦克

1 个答案:

答案 0 :(得分: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}
> 

或者,如果您正在使用带有-e hadoop2_env.sh的bdutil,那么HDFS持久性应该已经无需进一步修改即可使用。