我以非root用户身份运行pyspark,并尝试将数据帧保存为镶木地板。
我的环境:
启动 pyspark ,例如 user1 并将一些数据加载到数据框df
中。然后运行df.write.format("parquet").save("/data/user1/wikipedia_test.parquet")
/data
是每个节点上的GlusterFS voulme
/data/user1
权限:
# owner: user1
# group: user1
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::---
在计算完成spark之后,所有结果都存储在临时文件中,任务失败:
java.io.IOException:
Failed to rename DeprecatedRawLocalFileStatus{
path=file:/data/user1/wikipedia_test.parquet/_temporary/0/task_201507312025_0004_m_000024/part-r-00024-215e6e02-553e-434f-a2ae-e46836d39274.gz.parquet;
isDirectory=false;
length=2081649;
replication=1;
blocksize=33554432;
modification_time=1438374352000;
access_time=0;
owner=;
group=;
permission=rw-rw-rw-;
isSymlink=false
}
to file:/data/user1/wikipedia_test.parquet/part-r-00024-215e6e02-553e-434f-a2ae-e46836d39274.gz.parquet
问题是临时文件是由root创建的,不允许驱动程序将这些文件重命名为最终目的地。
user1@host:/data/user1/wikipedia_test.parquet/_temporary/0/task_201507312105_0006_m_000000$ ll
total 2741
drwxr-xr-x 2 root root 169 Jul 31 21:05 ./
drwxr-xr-x 62 root root 20480 Jul 31 21:06 ../
-rw-r--r-- 1 root root 2763432 Jul 31 21:05 part-r-00000-bbb1e377-5294-450c-9b87-648b68ec80c5.gz.parquet
-rw-r--r-- 1 root root 21600 Jul 31 21:05 .part-r-00000-bbb1e377-5294-450c-9b87-648b68ec80c5.gz.parquet.crc
Tomasz在https://www.mail-archive.com/user@spark.apache.org/msg28820.html中描述了一种可行的解决方法,但不适用于我们。 因为我们需要一个真正的权限系统,不允许用户写入其他用户文件夹。
另外,将$SPARK_USER
设置为root
或user1
是没有效果的。
顺便说一句,以root身份运行pyspark时也一样。
我认为主要的问题是Spark-Slaves总是以root身份执行。
有什么想法吗?
答案 0 :(得分:0)
尝试检查' user1'的uid在群集中的每个节点上。您可以使用' id'以该用户身份登录时的命令。如果不同的计算机对同一用户使用不同的uid,则可能会出现此写入权限错误。
如果一台计算机上的user1(uid 12345)创建了输出文件夹,而另一台计算机上的user1(uid 24680)没有写入权限,则会发生这种情况。