Google クラウド ストレージから読み取った大量のデータ ( 2TB ) を処理するジョブを Yarn モードで実行しようとしています。
パイプラインは次のように要約できます。
sc.textFile("gs://path/*.json")\
.map(lambda row: json.loads(row))\
.map(toKvPair)\
.groupByKey().take(10)
[...] later processing on collections and output to GCS.
This computation over the elements of collections is not associative,
each element is sorted in it's keyspace.
10GBのデータで実行すると、問題なく完了します。ただし、完全なデータセットで実行すると、コンテナー内の次のログで常に失敗します。
15/11/04 16:08:07 WARN org.apache.spark.scheduler.cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: ApplicationMaster has disassociated: xxxxxxxxxxx
15/11/04 16:08:07 ERROR org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend: Yarn application has already exited with state FINISHED!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/spark/python/pyspark/rdd.py", line 1299, in take
res = self.context.runJob(self, takeUpToNumLeft, p)
File "/usr/lib/spark/python/pyspark/context.py", line 916, in runJob
15/11/04 16:08:07 WARN org.apache.spark.ExecutorAllocationManager: No stages are running, but numRunningTasks != 0
port = self._jvm.PythonRDD.runJob(self._jsc.sc(), mappedRDD._jrdd, partitions)
File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__
File "/usr/lib/spark/python/pyspark/sql/utils.py", line 36, in deco
return f(*a, **kw)
File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.
: org.apache.spark.SparkException: Job cancelled because SparkContext was shut down
マスターに接続して各操作を1つずつ起動して調べてみたところ、groupByで失敗するようです。また、ノードを追加してメモリと CPU の数をアップグレードすることでクラスターの再スケーリングを試みましたが、それでも同じ問題が発生します。
同じ仕様の 120 ノード + 1 マスター: 8 vCPU - 52 GB メモリ
同様の問題を抱えたスレッドを見つけようとしましたが成功しませんでした。ログがあまり明確ではないため、どのような情報を提供すればよいかわかりません。詳細についてはお気軽にお問い合わせください。
主キーはすべてのレコードに必要な値であり、フィルタなしのすべてのキーが必要です。これは約 60 万キーを表します。クラスターを大規模なものにスケーリングせずに、この操作を実行することは本当に可能ですか? 私は、databricks が 100 TB のデータ ( https://databricks.com/blog/2014/10/10/spark-petabyte-sort.html ) で並べ替えを行ったことを読みましたが、これには大規模なシャッフルも含まれます。複数のインメモリ バッファを 1 つのバッファに置き換えることで成功し、多くのディスク IO が発生しました。私のクラスター規模でそのような操作を実行することは可能ですか?