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版本:
// Hadoop version to build against. For example, "0.20.2", "0.20.205.0", or
// "1.0.4" for Apache releases, or "0.20.2-cdh3u5" for Cloudera Hadoop.
val HADOOP_VERSION = "1.0.4"
val HADOOP_MAJOR_VERSION = "1"
// For Hadoop 2 versions such as "2.0.0-mr1-cdh4.1.1", set the HADOOP_MAJOR_VERSION to "2"
//val HADOOP_VERSION = "2.0.0-mr1-cdh4.1.1"
//val HADOOP_MAJOR_VERSION = "2"
解決方案
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集群信息和賬戶密碼;後者提供了下面這個配置:
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>
完成這兩步後,進入./spark-shell,運行下
val file = sc.textFile("hdfs://xxx")
file.count()
能正常跑出結果的話就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別的包的一些兼容啊,版本提升的問題。具體問題具體再解決吧。
(全文完)
Spark 的詳細介紹:請點這裡
Spark 的下載地址:請點這裡