【问题标题】:Saving parquet in Spark as non root user在 Spark 中将镶木地板保存为非 root 用户
【发布时间】: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 设置为rootuser1 无效。 顺便说一句,在以 root 身份运行 pyspark 时做同样的事情。

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

有什么想法吗?

【问题讨论】:

  • 以防万一,spark master 不应以 root 身份运行,而应以其他用户身份运行。比方说,“火花”。在 hadoop 的情况下或“纱线”。随时用您的发现更新问题:)
  • @nefo_x 宾果游戏!为我工作。当我以 root 身份启动 Spark 时,我遇到了同样的问题,它正在创建具有各种所有者的镶木地板文件 - 用户和 root。在用户平息这种奇怪行为时运行 Spark,Parquet 覆盖现在正在工作。

标签: apache-spark pyspark parquet


【解决方案1】:

尝试检查集群中每个节点上“user1”的 uid。以该用户身份登录时,您可以使用“id”命令执行此操作。如果不同的机器对同一用户使用不同的 uid,那么您可能会收到此写入权限错误。

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

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2019-01-08
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多