PySpark - Spark集群EC2 - 无法保存到S3

时间:2016-12-06 02:25:17

标签: amazon-s3 pyspark apache-spark-sql spark-dataframe pyspark-sql

我已经设置了一个带有主服务器和2个从服务器的spark集群(我正在使用Spark Standalone)。群集与一些示例一起运行良好,但不适用于我的应用程序。我的应用程序工作流程是,它将读取csv - >提取csv中的每一行以及标题 - >转换为JSON - >保存到S3。这是我的代码:

def upload_func(row):
    f = row.toJSON()
    f.saveAsTextFile("s3n://spark_data/"+ row.name +".json")
    print(f)
    print(row.name)

if __name__ == "__main__":
    spark = SparkSession \
        .builder \
        .appName("Python Spark SQL data source example") \
        .getOrCreate()
    df = spark.read.csv("sample.csv", header=True, mode="DROPMALFORMED")
    df.rdd.map(upload_func)

我还将AWS_Key_IDAWS_Secret_Key导出到ec2环境中。但是使用上面的代码,我的应用程序不起作用。以下是问题:

  1. JSON文件未保存在S3中,我尝试过几次运行应用程序并重新加载S3页面但没有数据。应用程序在日志中没有任何错误地完成。此外,print(f)print(row.name)不会在日志中打印出来。我需要修复什么才能在S3上获取JSON保存,无论如何我都要在日志上打印以进行调试?

  2. 目前我需要将csv文件放在worker节点中,以便应用程序可以读取csv文件。如何将文件放在另一个地方,比如主节点,当应用程序运行时,它会将csv文件拆分到所有工作节点,以便它们可以作为分布式系统并行上传?

  3. 非常感谢帮助。感谢您的帮助。

    已更新

    在将Logger调试之后,我发现了一个问题,即没有调用map函数upload_func()或者应用程序无法进入此函数(Logger在函数调用之前和之后打印了消息)。如果你知道原因,请帮忙吗?

1 个答案:

答案 0 :(得分:0)

你需要强制评估地图; spark只会按需执行。

df.rdd.map(upload_func).count()应该这样做