【发布时间】:2015-10-23 16:01:00
【问题描述】:
我以非 root 用户身份运行 pyspark,并尝试将数据框保存为 parquet。
我的环境:
- Ubuntu 14
- 为 Hadoop 2.6 预构建 Spark 1.4.1
- GlusterFS 3.7
- Mesos 0.23.0
- Docker 1.7.1
启动 pyspark 例如user1 并将一些数据加载到数据框df 中。然后运行df.write.format("parquet").save("/data/user1/wikipedia_test.parquet")
/data 是每个节点上的 GlusterFS 卷。/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 身份执行。
有什么想法吗?
【问题讨论】:
-
以防万一,spark master 不应以 root 身份运行,而应以其他用户身份运行。比方说,“火花”。在 hadoop 的情况下或“纱线”。随时用您的发现更新问题:)
-
@nefo_x 宾果游戏!为我工作。当我以 root 身份启动 Spark 时,我遇到了同样的问题,它正在创建具有各种所有者的镶木地板文件 - 用户和 root。在用户平息这种奇怪行为时运行 Spark,Parquet 覆盖现在正在工作。
标签: apache-spark pyspark parquet