1

我让我的学生使用bdutil来创建Google Compute Engine集群,其中包含持久磁盘和HDFS作为默认文件系统。我们希望拥有永久磁盘,以便学生能够在数周内完成项目。但是,在重新部署集群之后,HDFS似乎不可用。在Google Cloud中维护持久HDFS

我的问题真的是“如何在群集的重新部署中维护持久的HDFS文件系统?”

这是我曾尝试

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

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

我然后删除和redeply集群与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存储可以跨重新部署集群将大大坚持任何建议表示赞赏

感谢,

Mike

回答

3

感谢您的详细报告!事实上,看起来你已经发现了一个引入了几个版本的bug,其中bdutil-0.35.2/libexec/configure_hadoop.sh不幸地在数据节点数据目录上对目录权限进行了修改,其中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持久性应该已经可以不作任何进一步的修改。