Amazon web services 在AWS EMR Spark cluster中有效读取数据

Amazon web services 在AWS EMR Spark cluster中有效读取数据,amazon-web-services,apache-spark,amazon-s3,apache-spark-sql,amazon-emr,Amazon Web Services,Apache Spark,Amazon S3,Apache Spark Sql,Amazon Emr,我正在尝试熟悉Amazon大数据工具,我想对S3中的数据进行预处理,以便最终将其用于机器学习 我正在努力理解如何有效地将数据读入AWS EMR Spark群集 我有一个Scala脚本,它需要很多时间来运行,大部分时间都被Spark的explode+pivot占用在我的数据上,然后使用Spark CSV写入文件 但在我看来,即使是读取原始数据文件也会占用太多时间 然后,我创建了一个脚本,仅用于从4个不同的文件夹(数据大小分别为0.18MB、0.14MB、0.0003MB和399.9MB)中使用sq

我正在尝试熟悉Amazon大数据工具,我想对S3中的数据进行预处理,以便最终将其用于机器学习

我正在努力理解如何有效地将数据读入AWS EMR Spark群集

我有一个Scala脚本,它需要很多时间来运行,大部分时间都被Spark的explode+pivot占用在我的数据上,然后使用Spark CSV写入文件

但在我看来,即使是读取原始数据文件也会占用太多时间

然后,我创建了一个脚本,仅用于从4个不同的文件夹(数据大小分别为0.18MB、0.14MB、0.0003MB和399.9MB)中使用
sqlContext.read.json()读入数据。我在每个读取函数之前和之后使用了
System.currentTimeMillis()
来查看它需要多少时间,并且使用4个不同实例的设置,结果如下:

           m1.medium (1) | m1.medium (4) | c4.xlarge (1) | c4.xlarge (4)
1. folder   00:00:34.042 |  00:00:29.136 |  00:00:07.483 |  00:00:06.957
2. folder   00:00:04.980 |  00:00:04.935 |  00:00:01.928 |  00:00:01.542
3. folder   00:00:00.909 |  00:00:00.673 |  00:00:00.455 |  00:00:00.409
4. folder   00:04:13.003 |  00:04:02.575 |  00:03:05.675 |  00:02:46.169
实例类型后的数字表示使用了多少个节点。1是唯一的主设备,4是一个主设备,3个相同类型的从设备

首先,奇怪的是,在前两个大小相似的文件夹中阅读会占用不同的时间

但是,为什么读取少于1MB的数据要花费如此多的时间(以秒为单位)? 几天前,我有1800MB的数据,我在c4.xlarge(4个节点)上使用数据处理脚本的工作花了1,5小时才失败,出现错误:

控制器日志:

INFO waitProcessCompletion ended with exit code 137 : hadoop jar /var/lib/aws/emr/step-runner/hadoop-...
INFO total process run time: 4870 seconds
2016-07-01T11:50:38.920Z INFO Step created jobs: 
2016-07-01T11:50:38.920Z WARN Step failed with exitCode 137 and took 4870 seconds
标准日志:

16/07/01 11:50:35 INFO DAGScheduler: Submitting 24 missing tasks from ShuffleMapStage 4 (MapPartitionsRDD[21] at json at DataPreProcessor.scala:435)
16/07/01 11:50:35 INFO TaskSchedulerImpl: Adding task set 4.0 with 24 tasks
16/07/01 11:50:36 WARN TaskSetManager: Stage 4 contains a task of very large size (64722 KB). The maximum recommended task size is 100 KB.
16/07/01 11:50:36 INFO TaskSetManager: Starting task 0.0 in stage 4.0 (TID 5330, localhost, partition 0,PROCESS_LOCAL, 66276000 bytes)
16/07/01 11:50:36 INFO TaskSetManager: Starting task 1.0 in stage 4.0 (TID 5331, localhost, partition 1,PROCESS_LOCAL, 66441997 bytes)
16/07/01 11:50:36 INFO Executor: Running task 0.0 in stage 4.0 (TID 5330)
16/07/01 11:50:36 INFO Executor: Running task 1.0 in stage 4.0 (TID 5331)
Command exiting with ret '137'
这个数据在周末翻了一番。因此,如果我现在每天都能获得约1GB的新数据(而且数据量很快就会快速增长),那么我很快就会遇到大数据量,我真的需要一种快速读取和处理数据的有效方法


我该怎么做?有什么我遗漏的吗?我可以升级我的实例,但对我来说,用4x c4.xlarge(4个vCPU、16ECU、7.5GiB mem)实例读取0.2MB数据需要7秒(即使自动推断约200个JSON属性的数据模式)似乎并不正常。

每个目录中有多少文件?如果有大量文件,读入许多单独的文件有时会成为这些特定文件夹中的瓶颈。我分别有17、17、1和2409个文件。我的S3存储桶中的文件总数目前为15061个,总大小为3946.23MB。所以我认为问题不在于文件的数量。谷歌搜索Sparkal的“小文件问题”虽然我仍然有问题,但你的回答至少把我推向了正确的方向。我发现了一些建议,可以创建更大的文件,或者理想情况下创建与Spark的默认块大小相同的文件。对于3GB数据,读取时间从多个小文件的11分钟30秒减少到1个大文件的1分钟30秒。现在,从我的SparkConf中删除
.setMaster(“local[4]”).set(“spark.driver.maxResultSize”,“4g”)
后,从多个文件读取4GB需要4:46,从单个文件读取3GB需要21秒。这是一个巨大的进步:)我会做更多的研究,直到我对我的结果感到满意,然后我会尝试自己在这里制定一个彻底的答案。谢谢