【トラブル】AWS Glue上で saveAsTextFile() を使ったら エラー「DirectOutputCommitter not found」が発生する

■ はじめに

AWS Glue 上で RDD.saveAsTextFile() を使ったら
エラー「DirectOutputCommitter not found」が発生したので
その際のトラブルシュートをメモする。

目次

【1】エラー内容
【2】発生したコード(一部)
【3】解決案
 案1:DirectFileOutputCommitterを適用する
 案2:Data Frame に変換して別メソッドで実行する

【1】エラー内容

ERROR [main] glue.ProcessLauncher (Logging.scala:logError(70)):
Exception in User Class: java.lang.RuntimeException :
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class
org.apache.hadoop.mapred.DirectOutputCommitter not found

【2】発生したコード(一部)

# 一部抜粋

output_path = "s3://your-bucket-name/xxxx/output"

# ★ここでエラーが発生する★
rdd.saveAsTextFile(output_path)

【3】解決案

以下をあげておく。

案1:DirectFileOutputCommitterを適用する
案2:Data Frame に変換して別メソッドで実行する

案1:DirectFileOutputCommitterを適用する

* 以下のサイトに記載されていた。

https://stackoverflow.com/questions/65409534/aws-glue-rdd-saveastextfile-raises-class-org-apache-hadoop-mapred-directoutput

修正コード

from pyspark.context import SparkContext
from awsglue.context import GlueContext

spark_context = SparkContext()
glue_context = GlueContext(spark_context)
spark = glue_context.spark_session

# 以下のコードを呼び出し前に追加する
spark._jsc.hadoopConfiguration() \
  .set("mapred.output.committer.class", "org.apache.hadoop.mapred.DirectFileOutputCommitter")

参考文献
https://qiita.com/uryyyyyyy/items/e9ec40a8c748d82d4bc4

案2:Data Frame に変換して別メソッドで実行する

RDD => Data Frame に変換してから、write() で対応。

修正コード

from pyspark.sql imort Row

# データによっては、Rowでデータ構造を定義してあげないと、
# 例外「TypeError: Can not infer schema for type <class 'str'>」で落ちた
# 詳細は関連記事「PySpark ~ RDD <=> DataFrame の相互変換 ~」を参照
# https://dk521123.hatenablog.com/entry/2021/05/19/143043  

data_frame = rdd.map(Row("val")).toDF()

# writeメソッドでファイル出力
data_frame.write \
  .format("text") \
  .option("header", "false") \
  .mode("overwrite") \
  .save("<path>")

関連記事

AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
PySpark ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2019/11/14/221126
PySpark ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/04/03/004254
PySpark でエラー「Exception: It appears ...」が表示された
https://dk521123.hatenablog.com/entry/2020/07/10/192404
PySpark でエラー「Total size ... is bigger than spark.driver.maxResultSize」が発生する
https://dk521123.hatenablog.com/entry/2021/04/22/131849
PySpark でエラー「Exception: It appears ...」が表示された
https://dk521123.hatenablog.com/entry/2019/10/01/221926
PySparkで入力ファイル名を取得するには
https://dk521123.hatenablog.com/entry/2021/04/12/145133
PySpark ~ RDD <=> DataFrame の相互変換 ~
https://dk521123.hatenablog.com/entry/2021/05/19/143043