1. 程式人生 > >使用IDEA遠端除錯位於Yarn-Client模式下的Spark叢集相關配置

使用IDEA遠端除錯位於Yarn-Client模式下的Spark叢集相關配置

環境介紹

我使用的是基於Ambari 的 HDP-2.6.1.0-129的Hadoop環境
1.Spark 1.6.3
2.Scala 2.10.6(可以使用2.11以後的 版本)
開發環境是IDEA 2017.2版本,使用sbt進行編譯。

新建工程

使用IDEA進行工程建立在此不贅述,需要注意的是如果在建立工程時沒有選擇正確的scala版本,可以在專案內的build.sbt檔案中修改為正確的scala版本

依賴配置

sbt需要配置的依賴較為簡單,我們這一次編寫的demo是一個計算Pi的近似值的spark軟體,所以只需要新增本地與Spark Yarn通訊的依賴

name
:= "SparkDemo_2_10_6" version := "0.1" scalaVersion := "2.10.6" name := "SparkXScalaDemo" libraryDependencies ++= Seq( "org.apache.spark" % "spark-yarn_2.10" % "1.6.3" )

如上面所示,在libraryDependencies裡新增spark-yarn_2.10依賴,如果你的scala版本是2.11則應該新增spark-yarn_2.11
注意spark-core依賴已經被整合進入yarn依賴中,無需再新增

程式碼設定

聯絡Yarn叢集需要你提供你的HDP叢集的配置,所以去Ambari下把伺服器的配置檔案下載下來
我把全部的HDP配置檔案都下載進來了
然後需要將這些配置檔案放進一個Source或者Res資料夾,注意要去Project Structure中進行設定

完成了這些就能保證IDEA能夠正常與Spark叢集通訊

然後是程式碼編寫,我們的示例程式碼如下

import org.apache.spark.{SparkConf, SparkContext}

import scala.math.random
object SparkPi{
  def main(args:Array[String]){
    val conf = new SparkConf().setAppName
("Spark Pi") System.setProperty("hadoop.home.dir","C:\\Users\\sha0w\\hadoop-bin") System.setProperty("HADOOP_USER_NAME", "hdfs") conf.setMaster("yarn-client").setAppName("SparkPi") conf.setJars(List("C:\\Users\\sha0w\\IdeaProjects\\SparkDemo_2_10_6\\target\\scala-2.10\\sparkxscalademo_2.10-0.1.jar")) conf.set("spark.yarn.preserve.staging.files","false") conf.set("spark.yarn.jar", "hdfs://yourID:port/apps/spark/spark-assembly-1.6.3.2.6.1.0-129-hadoop2.7.3.2.6.1.0-129.jar") //這部分需要指定對應的assembly包在HDFS內的地址,類似於Kylin使用Spark引擎的設定,這個包可以在/usr/hdp/current/spark-client/lib中找到 conf.set("HDP_VERSION","2.6.1.0-129") conf.set("spark.yarn.dist.files", "yarn-site.xml") conf.set("yarn.resourcemanager.hostname", "packone168") val spark =new SparkContext(conf) val slices = if(args.length > 0) args(0).toInt else 2 val n = 100000 * slices val count = spark.parallelize(1 to n, slices).map { i => val x = random * 2 - 1 val y = random * 2 - 1 if(x*x + y*y <1) 1 else 0 }.reduce(_ + _) println("Pi is roughly "+ 4.0 * count / n) spark.stop() } }

這些配置我是儘可能詳細地配置,有心人可以嘗試減少一些看能不能使用,關鍵是conf.setMaster("yarn-client")設定為叢集連結模式

小問題

17/08/26 11:42:49 INFO client.RMProxy: Connecting to ResourceManager at packone168/10.0.86.168:8050
17/08/26 11:43:09 INFO ipc.Client: Retrying connect to server: packone168/10.0.86.168:8050. Already tried 0 time(s); maxRetries=45
17/08/26 11:43:29 INFO ipc.Client: Retrying connect to server: packone168/10.0.86.168:8050. Already tried 1 time(s); maxRetries=45
17/08/26 11:43:49 INFO ipc.Client: Retrying connect to server: packone168/10.0.86.168:8050. Already tried 2 time(s); maxRetries=45
17/08/26 11:44:09 INFO ipc.Client: Retrying connect to server: packone168/10.0.86.168:8050. Already tried 3 time(s); maxRetries=45
17/08/26 11:44:29 INFO ipc.Client: Retrying connect to server: packone168/10.0.86.168:8050. Already tried 4 time(s); maxRetries=45

可能是因為我是用手機熱點測試的,等下週一上班拿內網測試一下連結。

結語

發現網上講這個遠端除錯的都是stand alone模式,我又比較怕麻煩,所以這是我自己摸索出來的連線Client的設定方法,希望大家多多指教。