Spark連接Hadoop讀取HDFS問題小結
Spark與hadoop版本
我使用0.7.2的Spark版本,且是pre-built過的版本,支持的hadoop版本是hadoop1。在https://spark-project.org/files/上能下載的預編譯過的spark版本裏,凡是預編譯cdh4的壓縮包,下載後解壓會中斷,文件本身有問題。我在google論壇上發帖說明了這個問題:https://groups.google.com/forum/。所以我現在使用預編譯了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/這個帖子的啟發,替換了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別的包的一些兼容啊,版本提升的問題。具體問題具體再解決吧。
(全文完)
最後更新:2017-04-03 15:21:46