pyspark
ある時点でグループ化された集計 Pandas UDFを使用するジョブを実行しています。これにより、次の(ここでは省略)エラーが発生します。
org.apache.arrow.vector.util.OversizedAllocationException: Unable to expand the buffer
これは、pandas UDF が受け取るグループの 1 つが巨大であるためだと確信しています。データセットを減らして十分な行を削除すれば、問題なく UDF を実行できます。ただし、元のデータセットで実行したいのですが、192.0 GiB の RAM を搭載したマシンでこのスパーク ジョブを実行しても、同じエラーが発生します。(そして、192.0 GiB は、データセット全体をメモリに保持するのに十分なはずです。)
多くのメモリを必要とするグループ化された集計 Pandas UDF を実行できるように、spark に十分なメモリを与えるにはどうすればよいですか?
たとえば、apache の矢印により多くのメモリを与える、私が見逃しているいくつかのスパーク構成はありますか?
長いエラー メッセージ
---------------------------------------------------------------------------
Py4JJavaError Traceback (most recent call last)
in
----> 1 device_attack_result.count()
2
3
4
/usr/lib/spark/python/pyspark/sql/dataframe.py in count(self)
520 2
521 """
--> 522 return int(self._jdf.count())
523
524 @ignore_unicode_prefix
/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py in __call__(self, *args)
1255 answer = self.gateway_client.send_command(command)
1256 return_value = get_return_value(
-> 1257 answer, self.gateway_client, self.target_id, self.name)
1258
1259 for temp_arg in temp_args:
/usr/lib/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
61 def deco(*a, **kw):
62 try:
---> 63 return f(*a, **kw)
64 except py4j.protocol.Py4JJavaError as e:
65 s = e.java_exception.toString()
/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
326 raise Py4JJavaError(
327 "An error occurred while calling {0}{1}{2}.\n".
--> 328 format(target_id, ".", name), value)
329 else:
330 raise Py4JError(
Py4JJavaError: An error occurred while calling o818.count.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 102 in stage 27.0 failed 4 times, most recent failure: Lost task 102.3 in stage 27.0 (TID 3235, ip-172-31-111-163.ec2.internal, executor 1): org.apache.arrow.vector.util.OversizedAllocationException: Unable to expand the buffer
...