2013-07-13 59 views
1

我正在研究一些訪問HBase的代碼,我正在編寫單元測試,創建一個MiniDFSCluster作爲測試設置的一部分。HBase:MiniDFSCluster.java在某些環境中失敗

(defn test-config [& options] 
    (let [testing-utility (HBaseTestingUtility.)] 
     (.startMiniCluster testing-utility 1) 
     (let [config (.getConfiguration testing-utility)] 
      (if (not= options nil) 
       (doseq [[key value] options] 
        (.set config key value))) 
      config))) 

;; For those who don't read Clojure, lines 2 and 3 cause 
;; the failure and are equivalent to the following Java 
;; 
;; HBaseTestingUtility testingUtility = new HBaseTestingUtility(); 
;; testingUtility.startMiniCluster(1); // blows up on Linux but not Mac OSX 

這將運行在Mac OSX上的Java HotSpot的罰款:

$ java -version 
java version "1.6.0_51" 
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-457-11M4509) 
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-457, mixed mode) 

$ lein test 

lein test hbase.config-test 

lein test hbase.table-test 
2013-07-12 17:44:13.488 java[27384:1203] Unable to load realm info from SCDynamicStore 
Starting DataNode 0 with dfs.data.dir: /Users/dwilliams/Desktop/Repos/mobiusinversion/hbase/target/test-data/fe0199fd-0168-48d9-98ce-b4a5e62d3257/dfscluster_bbad1095-58d1-4571-ba12-4d4f1c24203f/dfs/data/data1,/Users/dwilliams/Desktop/Repos/mobiusinversion/hbase/target/test-data/fe0199fd-0168-48d9-98ce-b4a5e62d3257/dfscluster_bbad1095-58d1-4571-ba12-4d4f1c24203f/dfs/data/data2 
Cluster is active 

Ran 11 tests containing 14 assertions. 
0 failures, 0 errors. 

但是,當這在Linux環境下運行時,會出現以下錯誤:

ERROR in (create-table) (MiniDFSCluster.java:426) 
Uncaught exception, not in assertion. 
expected: nil 
    actual: java.lang.NullPointerException: null 
at org.apache.hadoop.hdfs.MiniDFSCluster.startDataNodes (MiniDFSCluster.java:426) 
    org.apache.hadoop.hdfs.MiniDFSCluster.<init> (MiniDFSCluster.java:284) 
    org.apache.hadoop.hbase.HBaseTestingUtility.startMiniDFSCluster (HBaseTestingUtility.java:444) 
    org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster (HBaseTestingUtility.java:612) 
    org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster (HBaseTestingUtility.java:568) 
    org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster (HBaseTestingUtility.java:555) 

我提起特拉維斯-ci票,因爲這首先出現在那裏,我認爲這可能是由於他們的環境。

https://github.com/travis-ci/travis-ci/issues/1240

然而,特拉維斯支持討論後,我才得以重現在CentOS的錯誤。我在Linux上嘗試了Sun JDK和OpenJDK,並且都產生了相同的錯誤。這裏發生了什麼?這是一個微不足道的配置問題嗎?也許沒有在Mac OSX的ENV中設置的Linux ENV中設置的東西?

如果你想運行測試,請克隆回購

https://github.com/mobiusinversion/hbase

和運行雷音測試。非常感謝幫助!

更新:

提起這個HBASE吉拉票

https://issues.apache.org/jira/browse/HBASE-8944

回答

4

簡短的回答:設置 「umask 022」 之前運行測試。

長問題解答:這是一個常見的環境問題,從HBaseTestingUtility內部使用的Hadoop 1.x版本運行MiniDFSCluster。它已經在Hadoop 0.22+(包括2.0+,但目前不是1.x)中得到有效修復。

潛在的問題是https://issues.apache.org/jira/browse/HDFS-2556

當MiniDFSCluster啓動時,它會創建用於數據節點進程(配置爲「dfs.data.dir」)的臨時存儲目錄。這些將使用您當前設置的umask創建。當每個datanode啓動時,它檢查「dfs.data.dir」中配置的目錄都存在,並且目錄權限與期望值匹配(設置爲「dfs.datanode.data.dir.perm」)。如果目錄權限與期望值不符(默認爲「755」),則數據節點進程退出。

默認情況下,在Hadoop 1.x中,此值設置爲「755」,所以如果將umask設置爲「022」,則數據目錄將以正確的權限結束。但是,如果權限不匹配的預期值,數據管理部將中止,你會看到這樣的測試日誌文件中的以下錯誤:

WARN [main] datanode.DataNode(1577): Invalid directory in dfs.data.dir: Incorrect permission for /.../dfs/data/data2, expected: rwxr-xr-x, while actual: rwxrwxr-x 

在Hadoop中的更高版本,數據管理部將試圖改變目錄權限設置爲期望值,如果它們不匹配的話。只有在此操作失敗時,datanode纔會中止。 HDFS-2556建議將此更改反向移植到1.x版本,但尚未修復。