我已按照本文中的说明在多节点群集上设置了Spark:https://medium.com/ymedialabs-innovation/apache-spark-on-a-multi-node-cluster-b75967c8cb2b
Web界面验证了工作人员都处于“活动”状态。我还测试了可以启动spark壳,执行Scala命令并在http://MASTER-HOSTNAME:4041上查看作业结果。
在Python中,我可以通过将master设置为local[*]
来创建pyspark上下文而无需指定master。以下是我创建的用于测试的基本Python脚本。
# spark-basic.py
from pyspark import SparkConf
from pyspark import SparkContext
conf = SparkConf()
#conf.setMaster('spark://<MASTER-HOSTNAME>:7077')
conf.setMaster('local[*]')
conf.setAppName('spark-basic')
sc = SparkContext(conf=conf)
def mod(x):
import numpy as np
return (x, np.mod(x, 2))
rdd = sc.parallelize(range(1000)).map(mod).take(10)
print(rdd)
为什么不能像许多this这样的在线教程中所述,将母版设置为'spark://<MASTER-HOSTNAME>:7077'
?我尝试时遇到的错误相当长,但这是其中的一部分(希望该错误消息的这一部分足以帮助他人,但我也可以始终将整个内容粘贴在这里):
19/05/01 14:29:17 WARN StandaloneAppClient$ClientEndpoint: Failed to
connect to master MASTER-HOSTNAME:7077
org.apache.spark.SparkException: Exception thrown in awaitResult
at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:77)
at org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse(RpcTimeout.scala:75)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59)
at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59)
at scala.PartialFunction$OrElse.apply(PartialFunction.scala:167)
at org.apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:83)
at org.apache.spark.rpc.RpcEnv.setupEndpointRefByURI(RpcEnv.scala:100)
at org.apache.spark.rpc.RpcEnv.setupEndpointRef(RpcEnv.scala:108)
at org.apache.spark.deploy.client.StandaloneAppClient$ClientEndpoint$$anonfun$tryRegisterAllMasters$1$$anon$1.run(StandaloneAppClient.scala:106)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readUTF(DataInputStream.java:609)
at java.io.DataInputStream.readUTF(DataInputStream.java:564)
at org.apache.spark.rpc.netty.RequestMessage$.readRpcAddress(NettyRpcEnv.scala:593)
然后是一个后续问题-有关系吗?如果仅将主服务器设置为local[*]
,是否仍能获得Spark集群的全部功能?我怎么知道我正在利用Spark集群来提高性能? (对不起,我是对此的新手。我尝试疯狂地搜索互联网,但没有找到任何对我有帮助的东西。如果有人可以指出我一些有用的资源来帮助我,那也很棒!我的终极目标目标是使用Spark集群在Python中快速处理非常大的数据集。)
最后的跟进问题-我不断收到19/04/30 13:19:24 WARN TaskSetManager: Stage 0 contains a task of very large size (5786 KB). The maximum recommended task size is 100 KB.
警告,基于this问题,看来我在所有数据操作中都需要使用parallelize
方法。这个方法返回一个RDD,当前我所有的代码都被编写来处理pyspark DataFrame对象。只是检查-我是否需要重写我的所有代码以操纵RDD才能利用Spark集群?
答案 0 :(得分:-2)
取决于您从何处运行脚本。 您是要在笔记本电脑还是主节点上运行它?
从主节点运行:您将必须设置SPARK_HOME env变量以指向您的spark lib安装。
如果您是从笔记本电脑上运行的:
确保SPARK_HOME指向正确的lib。
后续问题Q1:这很棘手,因为您可以在同一节点上运行bot从属服务器和master。并配置spark以在主从配置中运行。
配置spark以优化性能: 尽管开箱即用的火花配置非常好。但是要优化其性能,您必须专门调整一些属性 1. spark.executor.cores 2. spark.executor.memory 3. spark.driver.cores 4. spark.driver.memory
此外,您希望群集尽可能地靠近,这意味着在相同的放置组中。尽管在处理大型数据集时不需要使用hdfs并将中间结果保存在hdfs上。您可能还想使用像yarn这样的资源管理器(同样不需要,spark附带了)。 (这还需要进行其他配置调整)。
如果您自己将数据传送到从属设备,并且还使用了更多的随机操作。那么您想考虑使用优质的serializer
跟进第二季度:好吧,通常,您不会将所有数据从主机发送到从机,但需要大量的资源自行构建。为此,您必须将ur数据放入x个小文件中,并让从站通过读取api读取它们。
我是否需要重写代码才能使用RDD?这取决于您使用的spark版本。 dataframe在2.0中引入。