我正在使用m3.2xlarge实例类型运行EMR cluster5.18。输入文件的格式为.gz,文件大小小于200MB。该集群有200个节点,总输入文件约为2500-3k。作业要花很长时间才能执行,有时在最后阶段会介于两者之间。
在运行pyspark应用程序时,以下是我在aws控制台上可以看到的阶段:
ID Status Description Duration stages Tasks
5 Running parquet at NativeMethodAccessorImpl.java:0 15 min 0 / 2 0 / 2,157
4 Succeeded run at ThreadPoolExecutor.java:1149 1 s 1 / 1 1 / 1
3 Succeeded json at NativeMethodAccessorImpl.java:0 15 min 1 / 1 1,957 / 1,957
2 Succeeded text at NativeMethodAccessorImpl.java:0 19 s 1 / 1 2,543 / 2,543
1 Succeeded load at NativeMethodAccessorImpl.java:0 2 s 1 / 1 2 / 2
0 Succeeded load at NativeMethodAccessorImpl.java:0 11 s 1 / 1 1 / 1
代码段:
in_files = open("input.txt", "r")
logs = in_files.read().splitlines()
df= spark.read.text(logs)
df_rdd= df.rdd.flatMap(lambda row: function_name(row.value))
df = spark.read.json(df_rdd)
-----
Other transformation like adding removing columns, & perforing a join against csv data set
-----
df.write.parquet(out_path, mode='append', partitionBy='day')
我遇到的问题是工作太慢了,最慢的步骤是上面提到的#3和#5。因此,有人可以帮我理解AWS控制台中显示的各个步骤吗?我的代码中有什么我可以改进的地方,以使此工作更快地运行? 我已经读过* .gz文件是不可拆分的,那么有什么办法可以解决这个问题?另外,当我在作业运行时随机检查一些节点时,CPU使用率正在100%运行。 请告知我是否需要其他详细信息。