从日志中我可以看到有182k行70MB。需要1.5小时加载70MB数据和9小时(从15/11/14 01:58:28开始并于15/11/14 09:19:09结束)在Dataproc上训练182K行。在本地计算机上加载相同的数据并运行相同的算法需要3分钟
DataProc Log
15/11/13 23:27:09 INFO com.google.cloud.hadoop.io.bigquery.ShardedExportToCloudStorage: Table 'mydata-data:website_wtw_feed.video_click20151111' to be exported has 182712 rows and 70281790 bytes
15/11/13 23:28:13 WARN akka.remote.ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@rc-spark-poc-w-1.c.dailymotion-data.internal:60749] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
15/11/14 01:58:28 INFO com.dailymotion.recommender.BigQueryRecommender: Fetching the Ratings RDD
15/11/14 01:58:28 INFO com.dailymotion.recommender.BigQueryRecommender: Transforming the video feature matrix
15/11/14 01:58:28 INFO com.dailymotion.recommender.BigQueryRecommender: Training ALS Matrix factorization Model
[Stage 2:=============================> (1 + 1) / 2]
15/11/14 09:19:09 WARN com.github.fommil.netlib.BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
15/11/14 09:19:09 WARN com.github.fommil.netlib.BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
15/11/14 09:19:44 INFO com.dailymotion.recommender.BigQueryRecommender: Transforming the video feature matrix
15/11/14 09:19:44 INFO com.dailymotion.recommender.BigQueryRecommender: Transforming the user feature matrix
将数据复制到本地计算机
r.viswanadha$ gsutil cp -r gs://<mycompany>-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000 .
Copying gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/data-000000000000.json...
Downloading ...201511132327_0000/shard-0/data-000000000000.json: 141.3 MiB/141.3 MiB
Copying gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/data-000000000001.json...
Copying gs://<mycompany>-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-1/data-000000000000.json...`
使用相同的算法。 ALS火车步骤耗时约3分钟
com.dailymotion.recommender.BigQueryRecommender --app_name BigQueryRecommenderTest --master local[4] --input_dir /Users/r.viswanadha/Documents/workspace/rec-spark-java-poc/input/job_201511132327_0000/shard-0/
首次运行
15/11/14 13:19:36 INFO BigQueryRecommender: Training implicit features for the ALS Matrix factorization Model
...
15/11/14 13:22:24 INFO BigQueryRecommender: Transforming the video feature matrix
第二次运行
15/11/14 13:29:05 INFO BigQueryRecommender: Training implicit features for the ALS Matrix factorization Model
...
15/11/14 13:31:57 INFO BigQueryRecommender: Transforming the video feature matrix
DataProc群集有1个Master和3个Slave,每个104GB(RAM)和16个CPU。
我的本地机器有8GB(RAM)和2个CPU 2.7GHz Core i5
gsutil ls -l -r -h gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000
gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/:
gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/:
0 B 2015-11-13T23:27:13Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/
141.3 MiB 2015-11-13T23:29:21Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/data-000000000000.json
0 B 2015-11-13T23:29:21Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-0/data-000000000001.json
gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-1/:
0 B 2015-11-13T23:27:13Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-1/
0 B 2015-11-13T23:28:47Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/shard-1/data-000000000000.json
0 B 2015-11-13T23:27:09Z gs://dailymotion-spark-rc-test/bqdata/hadoop/tmp/bigquery/job_201511132327_0000/
TOTAL: 6 objects, 148165416 bytes (141.3 MiB)
答案 0 :(得分:3)
回顾一些离线调查结果,当分布式集群上的运行速度比本地设置慢一些时,需要考虑的主要瓶颈是交叉方面的I / O往返延迟瓶颈 - 网络服务依赖项以及磁盘和本地I / O.
一般要寻找的东西(其中一些可能适用于您的具体情况,也可能不适用,但对于遇到类似问题的其他人可能会很常见):
gsutil ls -L gs://[your-bucket]
部署Dataproc群集的GCE区域位于同一区域。跨大陆流量不仅速度明显变慢,而且可能会在您的项目中产生额外的网络成本。一般而言,对于可以支持非常高的吞吐量但遭受长往返延迟的用例,如果数据很小且没有,请务必使用类似repartition()的数据对数据进行分片。自然地分成足够的并行性以确保您的Spark集群的良好利用。
最后,我们最新的Dataproc release修复了一堆本机库配置,因此它可能会为ALS部分以及其他mllib用例显示更好的性能。
答案 1 :(得分:2)
对于任何遇到类似事物的人:当只处理GCS中的一个小对象(或者使用BigQuery连接器中的数据的单个分片)时,您最终可以在Spark RDD中使用单个分区,因此,最终很少或没有并行性。
虽然它会导致额外的随机播放阶段,但是在从GCS或BigQuery读取之后可以立即重新分区输入RDD以获取所需数量的分区。额外的shuffle是否有益取决于RDD中每条记录需要多少处理或IO。