我已经设置了一个带有主服务器和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_ID
和AWS_Secret_Key
导出到ec2环境中。但是使用上面的代码,我的应用程序不起作用。以下是问题:
JSON文件未保存在S3中,我尝试过几次运行应用程序并重新加载S3页面但没有数据。应用程序在日志中没有任何错误地完成。此外,print(f)
和print(row.name)
不会在日志中打印出来。我需要修复什么才能在S3上获取JSON保存,无论如何我都要在日志上打印以进行调试?
目前我需要将csv文件放在worker节点中,以便应用程序可以读取csv文件。如何将文件放在另一个地方,比如主节点,当应用程序运行时,它会将csv文件拆分到所有工作节点,以便它们可以作为分布式系统并行上传?
非常感谢帮助。感谢您的帮助。
已更新
在将Logger调试之后,我发现了一个问题,即没有调用map函数upload_func()
或者应用程序无法进入此函数(Logger在函数调用之前和之后打印了消息)。如果你知道原因,请帮忙吗?
答案 0 :(得分:0)
你需要强制评估地图; spark只会按需执行。
df.rdd.map(upload_func).count()
应该这样做