2012-12-18 2 views
1

hadoop에서 JUnit 테스트를 시도하고 있습니다. MiniDFSCluster, MiniMRCluster 및 JUnit을 사용하여 로컬 mini-hadoop 환경에서 실행하는 테스트 사례를 작성했습니다.HDFS-2556 극복 : 유닛 테스트 디렉토리 및 사용 권한

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 버전을 변경할 수 없기 때문에 이러한 사용 권한을 허용하기 위해 강제로 사용하는 방법이 있습니까?

시도 : System.setProperty ("dfs.datanode.data.dir.perm", "775"); 하지만 hadoop은 무시합니다.

또한 권한을 수동으로 변경할 수 없으며 미니 클러스터는 모든 실행을 다시 생성합니다.

버전을 변경하거나 버전을 변경하지 않고이를 극복 할 수있는 방법이 있습니까? 감사합니다. .

+0

또한 하둡 당신의 특정 버전을 게시하시기 바랍니다 사용하고 있습니다. 해결책은''MiniDFSCluster''가 적절한''dfs.datanode.data.dir.perm''을 사용하도록 설정하는 것입니다. 그러나이 기능은 일부 구형/유지 보수/안정 릴리스에는 없습니다. –

+0

이 문제는 1.0.4와 1.1.1에서 모두 발생했습니다. 어떤 속성 버전이이 속성을 존중하는지 알려주실 수 있습니까? – ApriOri

+1

이 속성은 추가되었으며 버전 2.x + 또는 CDH3 (1.x + 백 포트) 및 CDH4 (2.x + 백 포트)와 같은 다른 Apache Hadoop 배포본에 있습니다. 이를 설정하려면 시스템 등록 정보를 통하지 않고 MiniDFSCluster 생성자에 전달한 구성 객체에 직접 설정해야합니다. –

답변

0

당신은 여기에 제공된 해결 방법을 사용할 수 있습니다 https://www.mail-archive.com/[email protected]/msg52961.html

UPDATE : (링크가 다운 될 경우) 링크에서 코드 조각

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); 
    } 
+0

당신은 아마 당신의 대답이 아무도 도움이 될 것입니다 때문에 링크가 내려 간다면 당신의 답변에 링크의 일부를 제공해야합니다. – Rapptz