備註:服務器上安裝的hadoop2.6.0、spark-1.5.2、scala-2.11.7,服務器上RDD操作沒有問題
windows本地配置eclipse-spark開發環境:
1、從spark 官網下載的都是使用Scala2.10編譯的,別的版本很少編譯過,用scala2.11.7報如下錯誤
Description Resource Path Location Type
More than one scala library found in the build path (D:/scala-SDK-4.3.0-vfinal-2.11-win32.win32.x86_64/eclipse/plugins/org.scala-lang.scala-library_2.11.7.v20150622-112736-1fbce4612c.jar, C:/Users/Administrator/Downloads/spark-assembly-1.5.2-hadoop2.6.0.jar).At least one has an incompatible version. Please update the project build path so it contains only one compatible scala library. spark-mllib Unknown Scala Classpath Problem
解決辦法如下:
安裝scala2.10.4,然後做如下配置eclipse環境
到這裏eclipse配置已經弄完,spark也能夠訪問本地(當前的win7)的文件來進行RDD操作,但不能訪問HDFS上的數據,繼續往下解決問題
2、HDFS的9000端口連接不上,報如下錯誤
(1)設置win7下的telnetclient,默認沒法使用
(2)關閉防火牆 (service iptables stop),在win7下能訪問8080端口
(3)本地telnet一下看能否與hdfs的9000相通
經過驗證,到這還是訪問不了9000端口的
(4)修改spark服務器與防火牆相關的配置
1>>確保hadoop的hdfs配置的都是hostname
2>>chkconfig iptables off 這個命令需要重啓才生效,在這我沒有修改iptables文件(網上有一些人說linux默認關閉9000端口,不允許遠程登錄,所以需要修改/etc/sysconfig/iptables 文件,添加以下內容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT)
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT)
3>>在spark機器上的hosts裏把不相干的host映射配置刪除掉
把這行註釋掉::: localhost localhost.localdomain localhost6 localhost6.localdomain6 之後,只剩如下
在當天晚上的時候我雖然全都按以上操作完了,可是還是telnet不通9000端口,但是第二天起來開機本想繼續第一天的問題,發現能telnet過去了,在這初步猜測是:service iptables stop是不是有些端口沒有關掉?還是因爲hosts文件裏有一些干擾配置項。
(5)telnet測試通過,信息如下
(6)HDFS上的數據spark也能正常訪問
package com.panguoyuan.rdd
import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.SparkContext._
object test01 {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("test01")
conf.setMaster("local")
val sc = new SparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)
// 2.1節
// 2.1.1 RDD 創建操作
val data = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
val distData = sc.parallelize(data, 3)
println(distData.distinct())
// val distFile1 = sc.textFile("data.txt") // 本地當前目錄下的文件
val distFile2 = sc.textFile("hdfs://master1:9000/wk01/input/file2.txt") // HDFS 文件
// val distFile3 = sc.textFile("file:/input/data.txt") // 本地指定目錄下的文件
// val distFile4 = sc.textFile("/input/data.txt") // 本地指定目錄下的文件
println(distFile2.collect().toList)
}
}