次の問題があります。できる限り詳細をお伝えするように努めますが、これを機能させるのに役立つと思われる何かが不足している場合は、遠慮なくお問い合わせください。
# spark-defaults:
spark.sql.warehouse.dir = /mnt/data
spark.hadoop.fs.permissions.umask-mode = 007
# hive-site:
<property>
<name>hive.warehouse.subdir.inherit.perms</name>
<value>true</value>
<description></description>
</property>
<property>
<name>hive.metastore.execute.setugi</name>
<value>true</value>
<description></description>
</property>
上記の hive-site 設定を、これら 2 つのさまざまな組み合わせで試してみましたが、問題は解決しません。
Spark クラスター (スタンドアロン、master/workers/shuffle/thrift/history) はユーザーspark (サービス アカウント) として実行されており、spark ユーザーグループの一部です。HDFS はありませんが、ファイルシステムは分散型で posix に準拠しており (商用 HDFS と考えてください)、NFS v3 がマウントされています。Hive メタストアは PostgreSQL 10 にあります。
スパーク ウェアハウスはこちら:
# ls -l /mnt
drwxrws--- 22 spark spark users 10240 Aug 9 09:31 data
# umask
0007
Sparkユーザーグループの一部であるuser_1として PySpark プロセスを実行します。このプロセスでは、データベースを作成し、テーブルを作成して、テーブルにデータを書き込みます。
プロセスは次の例外で失敗します。
18/08/09 09:31:42 ERROR FileFormatWriter: Aborting job null.
java.io.IOException: Failed to rename
DeprecatedRawLocalFileStatus
{path=file:/mnt/data/new.db/new_table/_temporary/0/
task_20180809093142_0002_m_000000/
part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet;
isDirectory=false; length=39330; replication=1; blocksize=33554432;
modification_time=1533821502000; access_time=0; owner=; group=;
permission=rw-rw-rw-; isSymlink=false} to
file:/mnt/data/new.db/new_table/
part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet
at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.mergePaths
(FileOutputCommitter.java:415) at
org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.mergePaths
(FileOutputCommitter.java:428) at
org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitJobInternal
(FileOutputCommitter.java:362) at
org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitJob
(FileOutputCommitter.java:334) at
org.apache.parquet.hadoop.ParquetOutputCommitter.commitJob
(ParquetOutputCommitter.java:47) at
org.apache.spark.internal.io.HadoopMapReduceCommitProtocol.commitJob
(HadoopMapReduceCommitProtocol.scala:166) at
org.apache.spark.sql.execution.datasources.FileFormatWriter$.write
(FileFormatWriter.scala:213) at
org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand
.run (InsertIntoHadoopFsRelationCommand.scala:154) at
org.apache.spark.sql.execution.command.DataWritingCommandExec
.sideEffectResult$lzycompute(commands.scala:104) at
org.apache.spark.sql.execution.command.DataWritingCommandExec
.sideEffectResult(commands.scala:102) at
org.apache.spark.sql.execution.command.DataWritingCommandExec
.executeCollect(commands.scala:115) at
org.apache.spark.sql.Dataset$$anonfun$6.apply
(Dataset.scala:190) at
org.apache.spark.sql.Dataset$$anonfun$6.apply
(Dataset.scala:190) at
org.apache.spark.sql.Dataset$$anonfun$52.apply
(Dataset.scala:3254) at
org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId
(SQLExecution.scala:77) at
org.apache.spark.sql.Dataset.withAction
(Dataset.scala:3253) at
org.apache.spark.sql.Dataset.<init>
(Dataset.scala:190) at
org.apache.spark.sql.Dataset$.ofRows
(Dataset.scala:75) at
org.apache.spark.sql.SparkSession.sql
(SparkSession.scala:641) at
sun.reflect.NativeMethodAccessorImpl.invoke0
(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62) at
sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:43) at
java.lang.reflect.Method.invoke
(Method.java:498) at
py4j.reflection.MethodInvoker.invoke
(MethodInvoker.java:244) at
py4j.reflection.ReflectionEngine.invoke
(ReflectionEngine.java:357) at
py4j.Gateway.invoke(Gateway.java:282) at
py4j.commands.AbstractCommand.invokeMethod
(AbstractCommand.java:132) at
py4j.commands.CallCommand.execute
(CallCommand.java:79) at
py4j.GatewayConnection.run
(GatewayConnection.java:238) at
java.lang.Thread.run
(Thread.java:748)
18/08/09 09:31:42 WARN FileUtil: Failed to delete file or dir
[/mnt/data/new.db/new_table/
_temporary/0/task_20180809093142_0002_m_000000/
.part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet.crc]:
it still exists.
18/08/09 09:31:42 WARN FileUtil: Failed to delete file or dir
[/mnt/data/new.db/new_table/
_temporary/0/task_20180809093142_0002_m_000000/
part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet]:
it still exists.
ファイル/ディレクトリの名前変更と削除に失敗した場合。
ディレクトリ構造:
# ls -lR new.db/
new.db/:
total 4
drwxrws--- 3 user_1 spark users 1024 Aug 9 09:31 new_table
new.db/new_table:
total 48
-rw-rw---- 1 user_1 spark users 39330 Aug 9 09:31 part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet
drwxrws--- 3 user_1 spark users 512 Aug 9 09:31 _temporary
new.db/new_table/_temporary:
total 4
drwxrws--- 3 user_1 spark users 512 Aug 9 09:31 0
new.db/new_table/_temporary/0:
total 4
drwxr-sr-x 2 spark spark users 1024 Aug 9 09:31 task_20180809093142_0002_m_000000
new.db/new_table/_temporary/0/task_20180809093142_0002_m_000000:
total 44
-rw-rw---- 1 spark spark users 39330 Aug 9 09:31 part-00000-55f3fe5c-51c2-4a0f-9f0c-dc673f9967b3-c000.snappy.parquet
ご覧のとおり、temporary/0 (包括的)までのディレクトリはuser_1が所有していますが、temporary/0内のtask_ディレクトリはsparkユーザーが所有しています。さらに、これらのtask_ディレクトリの作成に使用された umask は 022 であり、目的の 007 ではありませんでした。
これらのtask_ディレクトリを作成するsparkユーザーに実際に正しい umask を使用させることができれば、問題は解決されます。
感謝し、指摘し、アドバイスします。