Apache Spark独立设置

时间:2019-01-27 11:26:16

标签: scala apache-spark

我有一个Apache Spark独立安装程序。 我希望启动3个工人并行运行: 我使用下面的命令。

./start-master.sh 
SPARK_WORKER_INSTANCES=3 SPARK_WORKER_CORES=2 ./start-slaves.sh

我尝试运行一些作业,以下是apache UI结果:

enter image description here

忽略最后三个失败的应用程序:以下是我的问题:

  1. 为什么我要求在Spark中以3个内核中的每一个启动3个内核,但为什么我只有一个工人显示在UI中?
  2. 我想对输入的RDD进行分区,以获得更好的性能。因此,对于前两份无保留的工作,我的时间为2.7分钟。在这里,我的Scala源代码具有以下内容。

    val tweets = sc.textFile("/Users/soft/Downloads/tweets").map(parseTweet).persist()

在第三份工作(4.3分钟)中,我经历了以下事情:

  val tweets = sc.textFile("/Users/soft/Downloads/tweets",8).map(parseTweet).persist()

我希望使用更多的分区可以缩短时间(8)。为什么这与预期相反?

2 个答案:

答案 0 :(得分:0)

  1. 显然,您只有一个活跃的工作人员,您需要通过检查火花记录来调查为什么未报告其他工作人员的原因。

  2. 更多分区并不总是意味着应用程序运行速度更快,您需要检查如何从源数据创建分区,已分区的数据量以及正在重新整理多少数据,等等。< / p>

答案 1 :(得分:0)

如果您在本地计算机上运行,​​则仅输出一个具有多个CPU的单一工作程序是很正常的。它仍然会为您分配计算机中可用CPU的任务。

根据可用资源的数量,将自动对文件进行分区,在大多数情况下,分区文件运行良好。 Spark(以及对文件进行分区)经常会带来一些开销,尤其是在一台机器上,Spark会增加很多开销,这会降低您的处理速度。附加值附带了计算机集群上的大量数据。

假设您正在启动独立集群,我建议使用配置文件来设置集群并使用start-all.sh来启动集群。

  1. 首先在您的spark/conf/slaves(从spark/conf/slaves.template复制)中添加您的工作程序节点的IP(或服务器名称)。
  2. 配置spark/conf/spark-defaults.conf(从spark/conf/spark-defaults.conf.template复制),至少将主节点设置为运行主节点的服务器。
  3. 使用spark-env.sh(从spark-env.sh.template复制)来配置每个工作线程的核心数,内存等:
export SPARK_WORKER_CORES="2"
export SPARK_WORKER_MEMORY="6g"
export SPARK_DRIVER_MEMORY="4g"
export SPARK_REPL_MEM="4g"
  1. 由于它是独立的(而不是托管在Hadoop环境中),因此您需要将配置(或完整的spark目录)共享(或复制)到集群中的所有节点。此外,您正在处理的数据也必须在所有节点上都可用,例如直接从存储桶或共享驱动器中获取。

如@skjagini所建议,请检出spark/logs/中的各种日志文件以查看发生了什么。每个节点将写入自己的日志文件。

有关所有选项,请参见https://spark.apache.org/docs/latest/spark-standalone.html

我们有这样的设置运行了几年,效果很好!