scala - 执行多个 Spark 作业
问题描述
我正在运行具有以下集群和应用程序配置的 Spark 作业:
总节点:3
Master Node Memory 7.5GB, 2 Cores
Worker Node1, Memory 15GB, 4 Cores
Worker Node2, Memory 15GB, 4 Cores
应用程序配置:
--master yarn --num-executors 2 --executor-cores 2 --executor-memory 2G
我正在尝试使用同一用户同时提交多个作业,但是我看到只有前两个提交的作业正在执行,第三个必须等待后续的交战。
19/11/19 08:30:49 WARN org.apache.spark.util.Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
19/11/19 08:30:49 WARN org.apache.spark.util.Utils: Service 'SparkUI' could not bind on port 4041. Attempting port 4042.
我发现正在为每个提交的作业创建 SparkUI,而我的集群一次只接受两个作业。此外,我观察到,一旦第一个提交的作业完成执行,它就会在端口 4042 上获取第三个作业。我的集群一次只接受两个工作可能有什么问题?
这是我的 Spark 会话代码:
val spark: SparkSession = {
val sparkSession = SparkSession
.builder()
.appName("Data Analytics")
.config("spark.scheduler.mode", "FAIR")
//.master("local[*]")
.getOrCreate()
sparkSession
}
我的进一步问题是:为什么 SparkSession 为每个作业创建 SparkUI 以及我们如何解决这个问题。有没有办法将同一个会话用于多个工作。
解决方案
您必须考虑几件事:执行 spark-submit 后,将创建一个 Spark 应用程序(客户端模式)并创建一个新驱动程序,并使用端口 4040 为驱动程序控制台使用一个新端口。那这是警告的原因,因为您正在尝试创建另一个应用程序和另一个驱动程序,但端口 4040 已被使用,因此它尝试使用 4041。Spark 作业不是 Spark 应用程序,是对应于的执行一个 Spark 动作,因此取决于您的程序执行的动作数量,将产生的作业数量。
在您的情况下,您正在尝试创建两个具有两个内核的执行程序,换句话说,您正在尝试创建两个每个具有两个内核的 JVM,除了驱动程序。因为您使用的是 Yarn,它会尝试为您的每个应用程序提供 4 个内核,并为每个驱动程序提供一个内核。
有关更多信息,请查看此链接: https ://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-scheduler-ActiveJob.html
推荐阅读
- windows - 在第一个查询结果上运行命令的批处理文件?
- python - 带有 Matplotlib 条形图的单击事件
- php - 如何使用 mongoose 或 mongodb 客户端从节点 js 关闭 mongodb 连接
- ruby-on-rails - 如何在 Rails 迁移中找到常量 id?
- php - Json可以调用SQL格式的(货币)查询吗?
- powershell - 如果条件匹配,则替换日志文件中的文本
- r - 将 ggplot2 与 for 循环结合以显示 R 中所有变量的频率
- python - 获取表格HTML数据时,如何获取没有文本值的``````标签在Selenium Python中的列表中占据位置?
- docker - 如何在 Docker 映像中保留 Jetbrains Teamcity 服务器实例的状态,以便在没有我的本地目录卷的情况下部署到其他人
- c# - 如何在事件处理程序中调用 android 特定代码