2013年1月3日 星期四

利用Maven 開發 Hadoop 系統,要注意的版本問題



圖片來源:自制


昨天犯了一個低級的錯誤,害我浪費了一整天的時間在檢查到底是Maven出錯,還是Mac 的Eclipse 有問題,還是我架設的artifactory沒設定好,結果最後發現的原因讓我吐血.....因此特別記錄起來提醒自己,希望大家不要跟我一樣犯同樣的錯誤...Orz...


昨天發生的問題就是我在Maven設定Hadoop相關Lib的版本(Hive,Hbase....等),以為大家的groupId應該都是一樣的,設定好後發現Eclipse 一直再噴Warning說缺檔案,但是最神奇的是去local Repository看,該有的檔案都存在,只是很明顯都是錯誤的jar檔(每個檔案都只有幾KB),所以我就開始懷疑是不是公司網路有檔?還是我Artifactory有設錯?甚至我都懷疑到Mac 的 Juno是不是還有Bug....混戰了一整天之後才發現原來是Hadoop某個版本之後groupId大搬風,所以我的設定根本是錯誤的....WTF....


首先是Hive的版本

0.8.0 之前的版本設定如下:

<dependency>
    <groupid>org.apache.hadoop.hive</groupid>
    <artifactid>hive-common</artifactid>
    <version>${hive.version}</version>
</dependency>


而0.8.0之後的版本設定如下:

<dependency>
    <groupid>org.apache.hive</groupid>
    <artifactid>hive-common</artifactid>
    <version>${hive.version}</version>
</dependency>


沒錯就是他搬家了~~~> <


再來是Zookeeper,這純粹是腦殘,我原本以為設定如下:

<dependency>
    <groupid>org.apache.zookeeper</groupid>
    <artifactid>zookeeper</artifactid>
    <version>${zookeeper.version}</version>
    <exclusions>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jdmk</groupId>
            <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jmx</groupId>
            <artifactId>jmxri</artifactId>
        </exclusion>
    </exclusions>
</dependency>

但是實際上應該是這樣:
<dependency>
    <groupid>org.apache.hadoop</groupid>
    <artifactid>zookeeper</artifactid>
    <version>${zookeeper.version}</version>
    <exclusions>
        <exclusion>
            <groupId>javax.jms</groupId>
            <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jdmk</groupId>
            <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jmx</groupId>
            <artifactId>jmxri</artifactId>
        </exclusion>
    </exclusions>
</dependency>



另外要注意的,就是Hbase cdh3 之前的版本會depend on thrift 0.2.0 但是在目前外面的public repository上是找不到的,所以我目前的解法就是把它exclude掉,然後另外include 0.5.0以後的thrift

<dependency>
    <groupid>org.apache.hbase</groupid>
    <artifactid>hbase</artifactid>
    <version>${hbase.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.thrift</groupId>
            <artifactId>thrift</artifactId>
        </exclusion>
    </exclusions>
</dependency>


<dependency>
    <groupid>org.apache.thrift</groupid>
    <artifactid>libthrift</artifactid>
    <version>0.5.0-cdh</version>
</dependency>



結論:

使用前請先參考Cloudrea 的Repositoty

https://repository.cloudera.com/artifactory/cloudera-repos

[1] Using the CDH3 Maven Repository

[2] Using the CDH4 Maven Repository


張貼留言