在Idea里面远程提交spark任务到Spark集群(StandAlone模式),调试代码
解决使用Navicat 打开 Linux远程连接mysql很慢的方法1.在linux 下暂时关闭 mysql服务service mysql stop2.找到目录 /usr 下的 my.cnf在最后一行加入 skip-name-resolve保存3.再次启动mysqlservice mysql start
·
背景:
在平时的 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.xml
、core-site.xml
、hdfs-site.xml
放到resource
下面,因为程序运行的时候需要这些环境 - 必须将该项目打包,并在
SparkConf
中指定 - 必须将本地
IP
,在SparkConf
中指定(而且这个IP
和Spark
集群的IP
要在一个网段) - 必须在
Spark
官网下载spark-2.2.0-bin-hadoop2.7.tgz
,解压,然后配置在本地环境变量中(而且Spark
版本要和Spark
集群的版本一致)
遇到的问题:
1、报错
Can only call getServletHandlers on a running MetricsSystem
原因: Spark
集群的 Worker
都挂掉了。
解决方法: 到 Spark
的 IP
+ 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"))
更多推荐
已为社区贡献3条内容
所有评论(0)