在具有pyspark

时间:2019-05-01 20:37:04

标签: python apache-spark pyspark

我已按照本文中的说明在多节点群集上设置了Spark:https://medium.com/ymedialabs-innovation/apache-spark-on-a-multi-node-cluster-b75967c8cb2b

我使用http://MASTER-IP:8080/

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集群?

1 个答案:

答案 0 :(得分:-2)

取决于您从何处运行脚本。 您是要在笔记本电脑还是主节点上运行它?

  • 从主节点运行:您将必须设置SPARK_HOME env变量以指向您的spark lib安装。

  • 如果您是从笔记本电脑上运行的:

  • 确保SPARK_HOME指向正确的lib。

  • 将所有配置从:〜/ SPARK_HOME复制到本地SPARK_HOME

后续问题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中引入。