我正在尝试熟悉亚马逊大数据工具,我想从S3预处理数据,最终将其用于机器学习。
我正在努力了解如何有效地将数据读入AWS EMR Spark群集。
我有一个Scala脚本需要花费大量时间才能运行,大部分时间由Spark的爆炸+数据转移占用我的数据,然后使用Spark-CSV写入文件。
但是在我看来,即使阅读原始数据文件也会占用太多时间。
然后我创建了一个脚本,只读取来自4个不同文件夹的sqlContext.read.json()
数据(数据大小分别为0.18MB,0.14MB,0.0003MB和399.9MB)。我在每个读取函数之前和之后使用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
stderr log:
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属性)。