以非root用户身份在Spark中保存镶木地板

时间:2015-07-31 21:10:10

标签: apache-spark pyspark parquet

我以非root用户身份运行pyspark,并尝试将数据帧保存为镶木地板。

我的环境:

  • Ubuntu 14
  • Spark 1.4.1预构建Hadoop 2.6
  • 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 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设置为rootuser1是没有效果的。 顺便说一句,以root身份运行pyspark时也一样。

我认为主要的问题是Spark-Slaves总是以root身份执行。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

尝试检查' user1'的uid在群集中的每个节点上。您可以使用' id'以该用户身份登录时的命令。如果不同的计算机对同一用户使用不同的uid,则可能会出现此写入权限错误。

如果一台计算机上的user1(uid 12345)创建了输出文件夹,而另一台计算机上的user1(uid 24680)没有写入权限,则会发生这种情况。