在Idea里面远程提交spark任务到Spark集群(StandAlone模式),调试代码

背景:

在平时的 Spark 开发中,若要将代码提交到 Spark 集群中,就必须打包,然后上传。这样非常繁琐,不方便调试。下面是在本地 Idea 中直接连接 Spark 集群,调试。

代码如下:

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
  * 本地访问Spark集群(StandAlone模式),调试代码
  */
object ExeFromSparkStandAlone {
  def main(args: Array[String]): Unit = {
	// 设置提交任务的用户
    System.setProperty("HADOOP_USER_NAME", "root")
	
    //读取hdfs的文件
    val path = "hdfs://node01:8020/stu/student.txt"

    val conf: SparkConf = new SparkConf().setAppName("ExeFromSparkStandAlone")
      .setMaster("spark://node01:7077")                       //Spark集群地址
      .set("spark.driver.host", "192.168.52.2")               //必须添加本地IP(运行Idea的机器)
      .setJars(List("E:\\IdeaProjects\\my001\\target\\my001-1.0-SNAPSHOT.jar"))  //必须添加jar,此jar包为该项目打包的

    val spark: SparkSession = SparkSession.builder.config(conf).getOrCreate()

    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")

    //读取文件
    val stuRDD: RDD[String] = sc.textFile(path)

    //RDD ===> DataFrame 需要隐式转换
    import spark.implicits._
    //split第二个参数为“-1”,代表不过滤空值
    val stuDF: DataFrame = stuRDD.map(_.split(",", -1))
      .map(line => Student(line(0).toInt, line(1), line(2), line(3).toInt, line(4))).toDF()

//    stuDF.printSchema()

    stuDF.show(100)

    //默认压缩格式为Snappy,数据格式为Parquet
//    stuDF.repartition(1).write.mode(SaveMode.Overwrite).parquet("E:\\data\\student")

    //设置压缩格式为gzip
//    stuDF.repartition(1).write.mode(SaveMode.Overwrite)
//      .option("compression","gzip").parquet("E:\\data\\student_gzip")

    //关闭资源
    spark.stop()
  }
  case class Student(id: Int, name: String, sex: String, age: Int, country: String)
}

注意事项:

  • 必须关闭自己电脑的防火墙
  • 设置提交任务的用户(非必须,看是否报错)
  • 读取的文件必须是 HDFS 上的
  • 必须把 yarn-site.xmlcore-site.xmlhdfs-site.xml 放到 resource 下面,因为程序运行的时候需要这些环境
  • 必须将该项目打包,并在 SparkConf 中指定
  • 必须将本地 IP,在 SparkConf 中指定(而且这个 IPSpark 集群的 IP 要在一个网段)
  • 必须在 Spark 官网下载 spark-2.2.0-bin-hadoop2.7.tgz ,解压,然后配置在本地环境变量中(而且 Spark 版本要和 Spark 集群的版本一致)

遇到的问题:

1、报错
Can only call getServletHandlers on a running MetricsSystem

原因: Spark 集群的 Worker 都挂掉了。

解决方法: 到 SparkIP + 8080 端口查看了一下,发现 Spark 集群的 Worker 都挂掉了(Alive Workers 是0),重启一下 Spark 集群就好了。
在这里插入图片描述

2、报错
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied

原因:在本地提交的用户名,它没有访问 hdfs 的权限,最简单的解决方法就是在代码里面设置用户是 root

解决方式:

System.setProperty("HADOOP_USER_NAME", "root")
3、报错
Exception in thread "main" java.lang.IllegalStateException

原因:在本地没有配置 SPARK_HOME 的环境变量。

解决方式:在 Spark 官网下载 spark-2.2.0-bin-hadoop2.7.tgz ,解压,然后配置在本地环境变量中(而且 Spark 版本要和 Spark 集群的版本一致)。

4、报错
org.apache.spark.SparkException: Failed to connect to driver!

原因:在代码中没有设置 driver host

解决方式:将本地 IP 地址在 SparkConf 中指定。

set("spark.driver.host", "192.168.52.2") 
5、报错
Lost task 0.0 in stage 0.0 (TID 0, 192.168.52.120, executor 1): 
java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy
to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq
in instance of org.apache.spark.rdd.MapPartitionsRDD

这个报错是最坑的一个,找了好长时间才解决这个bug。

解决方式:必须将该项目打包,并在 SparkConf 中指定。

setJars(List("E:\\IdeaProjects\\my001\\target\\my001-1.0-SNAPSHOT.jar"))
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值