【问题标题】:Submitting pyspark script to a remote Spark server?将 pyspark 脚本提交到远程 Spark 服务器?
【发布时间】:2019-07-05 14:20:35
【问题描述】:

这可能是一个非常愚蠢的问题,但我无法通过 Google 找到答案。我编写了一个简单的 pyspark ETL 脚本,它读取 CSV 并将其写入 Parquet,如下所示:

spark = SparkSession.builder.getOrCreate()
sqlContext = SQLContext(spark.sparkContext)
df = sqlContext.read.csv(input_filename)
df.write.parquet(output_path)

为了运行它,我在 Docker 中启动了一个本地 Spark 集群:

$ docker run --network=host jupyter/pyspark-notebook

我运行 Python 脚本,它连接到这个本地 Spark 集群,一切都按预期工作。

现在我想在远程 Spark 集群 (AWS EMR) 上运行相同的脚本。我可以在初始化 Spark 上下文时在某处指定一个远程 IP 地址吗?还是我误解了 Spark 的工作原理?

【问题讨论】:

    标签: apache-spark pyspark amazon-emr


    【解决方案1】:

    您可以通过指定远程主机的 IP 地址来创建 Spark 会话。

    spark = SparkSession.builder.master("spark://<ip>:<port>").getOrCreate()
    

    对于 AWS EMR,不支持独立模式。您需要在客户端或集群模式下使用 yarn,并将 HADOOP_CONF_DIR 指向本地服务器上 /etc/hadoop/conf 中的所有文件都存在的位置。然后设置动态端口转发以连接到 EMR 集群。创建一个火花会话,如:

    spark = SparkSession.builder.master('yarn').config('spark.submit.deployMode', 'cluster').getOrCreate()
    

    参考https://aws.amazon.com/premiumsupport/knowledge-center/emr-submit-spark-job-remote-cluster/

    【讨论】:

    • 根据文档似乎不可能:“无法使用以下命令将 Spark 应用程序提交到远程 Amazon EMR 集群:SparkConf conf = new SparkConf().setMaster(” spark://:7077”).setAppName("字数");" - aws.amazon.com/premiumsupport/knowledge-center/…
    • 对不起,我似乎跳过了你问题的最后几行。您是否尝试过端口转发?您在提交作业时仍然遇到问题吗?
    • 编辑了答案以供将来参考。
    • 如果使用pyspark,deployMode应该是'cluster'还是'client'?
    • 如果是 Spark Standalone,则必须使用 client,因为 Python 应用程序的 Standalone 模式不支持 cluster。如果您使用的是 YARN,则取决于您的设置以及是将驱动程序部署在工作节点(集群)还是本地作为外部客户端(客户端)。在 cluster 模式下,客户端可以在 Application Master 上启动应用程序并离开,而在 client 模式下,Spark 驱动程序在客户端进程中运行,而 Application Master 是仅用于向 YARN 请求资源。
    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多