1

私はhadoopでJUnitテストを試みていますが、MiniDFSCluster、MiniMRCluster、およびJUnitを使用してローカルのmini-hadoop環境で実行するテストケースを作成しました。

ただし、次のエラーが発生します。

 WARNING: Metrics system not started: Cannot locate configuration: tried hadoop-metrics2-datanode.properties, hadoop-metrics2.properties
Dec 18, 2012 4:42:29 PM org.apache.hadoop.hdfs.server.datanode.DataNode makeInstance
WARNING: Invalid directory in dfs.data.dir: Incorrect permission for build/test/data/dfs/data/data1, expected: rwxr-xr-x, while actual: rwxrwxr-x
Dec 18, 2012 4:42:29 PM org.apache.hadoop.hdfs.server.datanode.DataNode makeInstance
WARNING: Invalid directory in dfs.data.dir: Incorrect permission for build/test/data/dfs/data/data2, expected: rwxr-xr-x, while actual: rwxrwxr-x
Dec 18, 2012 4:42:29 PM org.apache.hadoop.hdfs.server.datanode.DataNode makeInstance
SEVERE: All directories in dfs.data.dir are invalid.

これは、まだ保留中のHDFSバグhttps://issues.apache.org/jira/browse/HDFS-2556のように見えます。

使用しているHadoopのバージョンを変更できないので、Hadoopにこれらのアクセス許可を強制的に受け入れる方法はありますか?

試しました:System.setProperty( "dfs.datanode.data.dir.perm"、 "775"); しかし、hadoopはそれらを無視します。

また、権限を手動で変更することはできません。ミニクラスターは実行のたびに権限を再作成するようです。

Hadoopを変更したりバージョンを変更したりせずにこれを克服する方法はありますか?ありがとう。

4

1 に答える 1

0

https://www.mail-archive.com/issues@hbase.apache.org/msg52961.htmlに記載されている回避策を使用できます 。

更新: リンクからのコード フラグメント (リンクがダウンした場合)

    try {
        Process process = Runtime.getRuntime().exec("/bin/sh -c umask");
        BufferedReader br = new BufferedReader(new
                InputStreamReader(process.getInputStream()));
        int rc = process.waitFor();
        if (rc == 0) {
            String umask = br.readLine();

            int umaskBits = Integer.parseInt(umask, 8);
            int permBits = 0777 & ~umaskBits;
            String perms = Integer.toString(permBits, 8);

            log.info("Setting dfs.datanode.data.dir.perm to " + perms);
            hBaseTestingUtility.getConfiguration().set("dfs.datanode.data.dir.perm", perms);
        } else {
            log.warn("Failed running umask command in a shell, nonzero return value ");
        }
    } catch (Exception e) {
        // ignore errors, we might not be running on POSIX, or "sh" might not be on the path
        log.warn("Couldn't get umask", e);
    }
于 2014-08-11T21:21:43.283 に答える