当 Spark 在 Docker 容器内以独立模式运行时,我遇到了一个非常奇怪的内存问题(这是很多人最有可能会说的;-))。我们的设置如下:我们有一个 Docker 容器,其中有一个以独立模式运行 Spark 的 Spring boot 应用程序。这个 Spring boot 应用程序还包含一些计划任务(由 Spring 管理)。这些任务会触发 Spark 作业。Spark 作业会抓取 SQL 数据库,对数据进行一些混洗,然后将结果写入不同的 SQL 表(写入结果不经过 Spark)。我们当前的数据集非常小(表包含几百万行)。
问题在于,运行 Docker 容器的 Docker 主机(CentOS VM)在一段时间后会因为内存耗尽而崩溃。我目前将 Spark 内存使用限制为 512M(我已经设置了执行程序和驱动程序内存),并且在 Spark UI 中我可以看到最大的作业仅占用大约 10 MB 的内存。我知道 Spark 在拥有 8GB 或更多可用内存时运行效果最佳。我也尝试过,但结果是一样的。
进一步挖掘后,我注意到 Spark 耗尽了机器上的所有缓冲区/缓存内存。通过强制 Linux 删除缓存(echo 2 > /proc/sys/vm/drop_caches)(清除目录项和 inode)来手动清除此内容后,缓存使用率大幅下降,但如果我不继续定期执行此操作,我会发现缓存使用率缓慢上升,直到缓冲区/缓存中的所有内存都被使用。
有谁知道我可能做错了什么/这里发生了什么?
非常感谢您的帮助!
docker apache-spark apache-spark-sql apache-spark-standalone
我在由三个节点组成的集群上运行一个火花流应用程序,每个节点都有一个工作程序和三个执行程序(因此总共有9个执行程序)。我正在使用Spark版本2.3.2和Spark独立群集管理器。
调查工作计算机完全停机时的最近一个问题,我可以看到由于以下原因,火花流作业已停止:
18/10/08 11:53:03 ERROR TaskSetManager: Task 122 in stage 413804.1 failed 8 times; aborting job
Run Code Online (Sandbox Code Playgroud)
由于同一阶段中的一项任务失败了8次,因此该作业被中止。这是预期的行为。
提到的任务失败,原因如下:
18/10/08 11:53:03 INFO DAGScheduler: ShuffleMapStage 413804 (flatMapToPair at MessageReducer.java:30) failed in 3.817 s due to Job aborted due to stage failure: Task 122 in stage 413804.1 failed 8 times, most recent failure: Lost task 122.7 in stage 413804.1 (TID 223071001, 10.12.101.60, executor 1): java.lang.Exception: Could not compute split, block input-39-1539013586600 of RDD 1793044 not found
org.apache.spark.SparkException: Job aborted due to stage …Run Code Online (Sandbox Code Playgroud) executor apache-spark spark-streaming apache-spark-standalone
209/5000 您好,我想在我的代码 scala 中添加选项“--deploy-mode cluster”:
val sparkConf = new SparkConfig ().setMaster ("spark: //192.168.60.80:7077")
Run Code Online (Sandbox Code Playgroud)
不使用shell(命令.\Spark-submit)
我想在 Scala 中使用“ spark.submit.deployMode ”
我们正在使用具有 8 个核心和 32GB RAM 的 Spark 独立集群,以及具有相同配置的 3 节点集群。
有时流批处理会在不到 1 秒的时间内完成。有时需要超过 10 秒,此时控制台中会出现下面的日志。
2016-03-29 11:35:25,044 INFO TaskSchedulerImpl:59 - Removed TaskSet 18.0, whose tasks have all completed, from pool
2016-03-29 11:35:25,044 INFO DAGScheduler:59 - Job 18 finished: foreachRDD at EventProcessor.java:87, took 1.128755 s
2016-03-29 11:35:31,471 INFO JobScheduler:59 - Added jobs for time 1459231530000 ms
2016-03-29 11:35:35,004 INFO JobScheduler:59 - Added jobs for time 1459231535000 ms
2016-03-29 11:35:40,004 INFO JobScheduler:59 - Added jobs for time 1459231540000 ms
2016-03-29 11:35:45,136 INFO …Run Code Online (Sandbox Code Playgroud) 我一直在使用spark独立非集群模式在pyspark中开发.这些天,我想探讨更多关于spark的集群模式.我在互联网上搜索,发现我可能需要一个集群管理器来使用Apache Mesos或Spark Standalone在不同的机器上运行集群.但是,我无法轻易找到图片的细节.
我应该如何从系统设计的角度进行设置,以便在多个Windows机器(或多个Windows vms)中运行spark集群.
我正在尝试在Windows 10上安装Spark 1.6.1,到目前为止,我已经完成了以下工作...
当我火花回家并运行bin \ spark-shell时,我得到了
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
我必须缺少一些东西,无论如何我都看不到如何从Windows环境运行bash脚本。但是希望我不需要仅仅为了使这个工作而理解。我一直在关注这个人的教程-https: //hernandezpaul.wordpress.com/2016/01/24/apache-spark-installation-on-windows-10/。任何帮助,将不胜感激。
我们有一个包含多个测试套件的大项目,每个测试套件平均有 3 个测试。
\n\n对于我们的单元测试,我们使用 Spark Standalone,因此没有 Yarn 作为资源管理器。\n每个测试套件:
\n\n启动 Spark 会话:
\n\n implicit val spark = SparkSession\n .builder()\n .config(sparkConf)\n .getOrCreate()\nRun Code Online (Sandbox Code Playgroud)\n\n延伸BeforeAndAfterAll:
class MyTestsSpec extends WordSpec\n with Matchers\n with BeforeAndAfterAll {\n...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n并重新定义 afterAll :
\n\n override def afterAll: Unit = {\n try {\n spark.stop()\n } finally {\n super.afterAll\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n我们的解决方案在 Jenkins 中有一个 CI 作业,并且 Jenkins 作业开始经常不稳定,因为测试因以下错误而失败:
\n\nMessage d'erreur\nJob 9 cancelled because SparkContext was shut down\nPile d'ex\xc3\xa9cution\norg.apache.spark.SparkException: Job 9 cancelled …Run Code Online (Sandbox Code Playgroud) 我在 spark-shell 中运行自动数据处理脚本时遇到了这个问题。前几次迭代工作正常,但迟早会遇到这个错误。我用谷歌搜索了这个问题,但没有找到完全匹配的。其他类似问题不在 spark 上下文中。我想这可能与JVM版本有关,但我不知道如何解决问题。
我在 spark 独立集群中使用了 2 台机器。
一号机Java信息:
java 10.0.2 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
2号机Java信息:
openjdk 10.0.2 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
错误信息:
WARN TaskSetManager:66 - Lost task 3.0 in stage 28.0 (TID 1368, 169.254.115.145, executor 1):
java.lang.NoSuchMethodError: sun.nio.ch.DirectBuffer.cleaner()Lsun/misc/Cleaner;
at org.apache.spark.storage.StorageUtils$.cleanDirectBuffer(StorageUtils.scala:212)
at org.apache.spark.storage.StorageUtils$.dispose(StorageUtils.scala:207)
at org.apache.spark.storage.StorageUtils.dispose(StorageUtils.scala)
at org.apache.spark.io.NioBufferedFileInputStream.close(NioBufferedFileInputStream.java:130)
at java.base/java.io.FilterInputStream.close(FilterInputStream.java:180)
at org.apache.spark.io.ReadAheadInputStream.close(ReadAheadInputStream.java:400)
at org.apache.spark.util.collection.unsafe.sort.UnsafeSorterSpillReader.close(UnsafeSorterSpillReader.java:152)
at …
每次启动 Spark Standalone 的 master 时,我都必须spark-env.sh根据应用程序更改一组不同的配置 ( )。到目前为止,spark-env.sh每次需要覆盖/更改其中的任何变量时我都会进行编辑。
有没有办法让sbin/start-master.sh我在执行时可以从外部传递conf 文件?
我正在尝试在本地托管一个 Spark 独立集群。我有两台连接在 LAN 上的异构计算机。下面列出的架构的每个部分都在 docker 上运行。我有以下配置
我使用一个测试应用程序来打开一个文件并计算其行数。当文件复制到所有工作人员上并且我使用时,该应用程序可以工作SparkContext.readText()
但是,当我在工作人员上访问该文件时,该文件仅存在于SparkContext.parallelize()工作人员上时,我会显示以下内容:
INFO StandaloneSchedulerBackend: Granted executor ID app-20180116210619-0007/4 on hostPort 172.17.0.3:6598 with 4 cores, 1024.0 MB RAM
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now RUNNING
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now EXITED (Command exited with code 1)
INFO StandaloneSchedulerBackend: Executor app-20180116210619-0007/4 removed: Command exited with code 1
INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20180116210619-0007/5 on worker-20180116205132-172.17.0.3-6598 (172.17.0.3:6598) with 4 …Run Code Online (Sandbox Code Playgroud) 我使用的是在独立模式下配置的 Spark 2.2.0 集群。Cluster有2个八核机器。该集群专用于 Spark 作业,没有其他进程使用它们。我有大约 8 个 Spark Streaming 应用程序在这个集群上运行。
我将 SPARK_WORKER_CORES(在 spark-env.sh 中)明确设置为 8,并使用 total-executor-cores 设置为每个应用程序分配一个内核。此配置降低了在多个任务上并行工作的能力。如果一个 stage 在一个有 200 个分区的分区 RDD 上工作,则一次只执行一个任务。我想让 Spark 做的是为每个作业启动单独的线程并并行处理。但是我找不到单独的 Spark 设置来控制线程数。
因此,我决定尝试将每台机器上的内核数量(即 spark-env.sh 中的 SPARK_WORKER_CORES)增加到 1000。然后我为每个 Spark 应用程序提供了 100 个内核。我发现 spark 这次开始并行处理 100 个分区,表明正在使用 100 个线程。
我不确定这是否是影响 Spark 作业使用的线程数的正确方法。
streaming distributed-computing apache-spark apache-spark-standalone
到目前为止,我只在YARN作为资源管理器的Hadoop集群上使用了Spark。在这种类型的集群中,我确切地知道要运行多少个执行程序以及资源管理的工作方式。但是,知道我正在尝试使用独立Spark集群,我有些困惑。纠正我在哪里我错了。
在本文中,默认情况下,辅助节点使用该节点的所有内存减去1 GB。但我知道通过使用SPARK_WORKER_MEMORY,我们可以使用更少的内存。例如,如果节点的总内存为32 GB,但我指定了16 GB,那么Spark worker是否在该节点上使用的内存不会超过16 GB?
但是执行者呢?让我们说如果我要在每个节点上运行2个执行程序,是否可以通过将期间的执行程序内存指定spark-submit为的一半来执行此操作SPARK_WORKER_MEMORY,是否要在每个节点上运行4个执行程序,通过将执行程序内存指定为四分之一的值来执行此操作SPARK_WORKER_MEMORY?
如果是这样的话,我认为,除了执行程序内存外,我还必须正确指定执行程序核心。例如,如果我要在一个工人上运行4个执行程序,则必须将执行程序核心指定为SPARK_WORKER_CORES?的四分之一。如果我指定一个更大的数字会怎样?我的意思是,如果我将执行程序的内存指定为内存的四分之一SPARK_WORKER_MEMORY,但是执行程序的核心仅是内存的一半SPARK_WORKER_CORES?在这种情况下,我将让2或4个执行程序在该节点上运行吗?
hadoop scala cluster-computing apache-spark apache-spark-standalone
apache-spark ×12
scala ×5
windows ×2
docker ×1
executor ×1
git ×1
hadoop ×1
mesos ×1
sbt ×1
scalatest ×1
spark-shell ×1
spark-submit ×1
streaming ×1