我让我的学生使用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=false
和CREATE_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商店的任何建议
谢谢,
麦克
答案 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继续进行修复,并设置了它所需的权限(如果它还不匹配):
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只是躲避了:
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持久性应该已经无需进一步修改即可使用。