spark本地提交集羣運行踩過的坑
1.本地提交,集羣跑spark程序設置(scala)
val conf = new SparkConf().setAppName("SparkWordCount")
conf.setMaster("spark://hadoop-01:7077")
conf.setJars(Array("D:\\hadoop\\spark\\target\\zbs_com-1.0-SNAPSHOT.jar"))
問題1:
requirement failed: Can only call getServletHandlers on a running MetricsSystem
收到了請求但處理消息有問題。像是對象序列化後的id值不一致,感覺應該是兩邊jdk、或者spark版本不一致導致的。查看java -version,都是1.8,排除。spark版本,集羣是2.2.1,我本機是2.3.0,比集羣版本高。
解決辦法:統一Spark版本。將本機也改爲2.2.1版本,並修改環境變量,重啓電腦。即可以正常提交任務。
原文鏈接:https://blog.csdn.net/nazhidao/article/details/79979417
問題2
Intellij控制檯輸出警告:WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
這一行特別醒目
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
在sparkui界面的
Caused by: java.net.UnknownHostException: DESKTOP-J06F0SV
初始工作沒有接受任何資源;檢查你的集羣用戶界面以確保工人註冊並有足夠的資源
這是我的提交任務後的集羣信息:
網上說法
:
1.集羣配置
2.內存問題
3.我的問題是 :
這個是主機名 DESK(…)在電腦屬性(環境變量)處可以看到加到集羣的/etc/hosts裏
附代碼
最後修改的代碼:
package spark
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object spark_test {
def main(args: Array[String]): Unit = {
//ps:模板封裝成一個方法以後調用方法即可
//模板代碼
/*
需要創建SparkConf()對象 相當於MR中配置
必傳參數
setAppName() 設置任務的名稱 不傳默認是一個UUID產生名字
設置運行模式
不寫這個參數可以打包提交集羣
寫這個參數設置本地模式
setMaster() 傳入的參數有如下寫法
"local" --> 本地一個線程來進行任務處理
"local[數值]" --> 開始相應數值的線程來模擬spark集羣運行任務
"local[*]" --> 開始相應線程數來模擬spark集羣運行任務
兩者區別:
數值類型--> 使用當前數值個數來進行處理
* -->當前程序有多少空閒線程就用多少空閒線程處理
*/
// val spark=SparkSession
val conf = new SparkConf().setAppName("SparkWordCount")
conf.setMaster("spark://hadoop-01:7077")
conf.setJars(Array("D:\\hadoop\\spark\\target\\zbs_com-1.0-SNAPSHOT.jar"))
// conf.setExecutorEnv("executor-memory","128m")
val sc = new SparkContext(conf)
//通過sparkcontext對象就可以處理數據
//讀取文件 參數是一個String類型的字符串 傳入的是路徑
val lines: RDD[String] = sc.textFile("hdfs://192.168.182.201:9000/abc")
//切分數據
val words: RDD[String] = lines.flatMap(_.split(" "))
//將每一個單詞生成元組 (單詞,1)c
val tuples: RDD[(String, Int)] = words.map((_,1))
//spark中提供一個算子 reduceByKey 相同key 爲一組進行求和 計算value
val sumed: RDD[(String, Int)] = tuples.reduceByKey(_+_)
//對當前這個結果進行排序 sortBy 和scala中sotrBy是不一樣的 多了一個參數
//默認是升序 false就是降序
val sorted: RDD[(String, Int)] = sumed.sortBy(_._2,false)
//將數據提交到集羣存儲 無法返回值
sorted.saveAsTextFile("hdfs://hadoop-01:9000/out/12")
//本地模式
//一定要設置setMaster()
//可以直接打印
//println(sorted.collect.toBuffer)
//這種打印也可以
//sorted.foreach(println)
// val add1:RDD[Int] = sc.parallelize(List(1,2,3,4,5,6))
// val value:RDD[(Int,Int)] = add1.map((_,1))
// value.partitionBy()
// add1.mapPartitions()
//回收資源停止sc,結束任務
sc.stop()
}
}
dd1.map((_,1))
// value.partitionBy()
// add1.mapPartitions()
//回收資源停止sc,結束任務
sc.stop()
}
}