天天看點

Spark連接配接Hadoop讀取HDFS問題小結

spark與hadoop版本

我使用0.7.2的spark版本,且是pre-built過的版本,支援的hadoop版本是hadoop1。在http://spark-project.org/files/上能下載下傳的預編譯過的spark版本裡,凡是預編譯cdh4的壓縮包,下載下傳後解壓會中斷,檔案本身有問題。我在google論壇上發帖說明了這個問題:https://groups.google.com/forum/#!topic/spark-users/y4ij1458d18。是以我現在使用預編譯了1代hadoop的spark,來連接配接2代hadoop。按理說在編譯spark的時候,通過改動spark_home/project/sparkbuild.scala,可以指定要支援的hadoop版本:

解決方案

1. 受了https://groups.google.com/forum/#!topic/spark-users/xkj__psy-ea這個文章的啟發,替換了spark_home/lib_managed/jars下的hadoop-core-1.0.4.jar,換成了自己hadoop-client裡hadoop/lib下的hadoop-2-core.jar包。

2. 在spark_home/conf下要添加hadoop的配置檔案。我是添加了hadoop-site.xml和hadoop-default.xml兩個配置檔案。原因是,前者提供了連接配接的hdfs叢集資訊和賬戶密碼;後者提供了下面這個配置:

完成這兩步後,進入./spark-shell,運作下

能正常跑出結果的話就ok了。

其他問題

這邊再提供一個unable to load native-hadoop library 和 snappy native library not loaded的解決方案。這個問題主要是jre目錄下缺少了libhadoop.so和libsnappy.so兩個檔案。具體是,spark-shell依賴的是scala,scala依賴的是java_home下的jdk,libhadoop.so和libsnappy.so兩個檔案應該放到java_home/jre/lib/amd64下面。要注意的是要知道真正依賴到的java_home是哪一個,把兩個.so放對地方。這兩個so:libhadoop.so和libsnappy.so。前一個so可以在hadoop_home下找到,比如hadoop\lib\native\linux-amd64-64。第二個libsnappy.so需要下載下傳一個snappy-1.1.0.tar.gz,然後./configure,make編譯出來。snappy是google的一個壓縮算法,在hadoop

jira下https://issues.apache.org/jira/browse/hadoop-7206記錄了這次內建。

單替換了hadoop的core包後,可能還會出一些warn或者error的提示,主要牽扯到的是hadoop别的包的一些相容啊,版本提升的問題。具體問題具體再解決吧。

(全文完)