環境介紹:
- Linux2.6.32-504.el6
- hadoop-2.7.3
- openjdk-1.7
問題:
測試機中已經有一套搭建好了的Hadoop集群,所以在往生產環境部署Hadoop集群時,直接將測試機中編譯好的Hadoop版本上傳到生產環境中即可,然后修改下配置文件集群就搭建成功了。但由於當時在搭建集群時沒有考慮使用snappy來對文件壓縮,所以在Hadoop的動態庫中就沒有Snappy的庫,導致在運行hadoop checknative -a檢查集群是否支持snappy時出現了如下情況:
可以明顯看到,在snappy那一項中顯示false。所以即使把snappy安裝好,Hadoop還是無法支持snappy
原因:
查找了很多博客,大多數都是說在Hadoop進行源碼編譯時沒有添加對snappy的支持。查看了下測試機上的Hadoop編譯好的版本,在lib目錄下是有snappy庫的,但在線上的版本就是無法支持snappy。最后發現原來測試機以前在部署好后也是沒有添加snappy的庫。snappy庫是最后安裝才添加的,而我當時拷貝的是以前編譯好的版本,所以就沒有snappy庫,無法支持sanppy。
解決方法:
1、安裝snappy
到官網http://code.google.com/p/snappy/ 或者到https://github.com/google/snappy下載源碼。目前最新的版本是1.1.7.由於測試環境中使用的是1.1.1,所以下載對應的1.1.1版本就好。
2、解壓安裝
解壓tar -zxvf snappy-1.1.1.tar.gz.然后用root用戶執行以下三步進行編譯安裝:
./configure make make install
默認安裝到/usr/local/lib/下。查看該目錄如下:
編譯過程中沒有報錯,並且可以看見以上動態庫,則表示snappy編譯安裝成功了。
3、重新編譯Hadoop動態庫
重新編譯Hadoop動態庫來支持snappy(在安裝snappy之后進行編譯),把重新編譯生成的Hadoop動態庫替換原來的動態庫。命令如下:
mvn package -Pdist,native -DskipTests -Dtar -Drequire.snappy
說明:-Drequire.snappy=/xxx/xxx/xxx 后面可以跟snappy安裝后的路徑。如果沒有指定路徑,則默認在/usr/local/lib下。
由於測試機上有已經編譯好了的動態庫所以拷貝到線上環境就好。拷貝到$HADOOP_HOME/lib目錄下。
4、檢測
執行hadoop checknative -a 看現在是否支持snappy,結果如下:
結束!