HDFS 上的 root scratch dir: /tmp/hive 应该是可写的。当前权限为:rw-rw-rw-

The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rw-rw-rw-

我正在尝试针对本地 kafka 主题在 spark 中使用结构化流。

首先我启动zookeeper和kafka:

write-host -foregroundcolor green "starting zookeeper..."
start "$KAFKA_ROOT\bin\windows\zookeeper-server-start.bat" "$KAFKA_ROOT\config\zookeeper.properties"

write-host -foregroundcolor green "starting kafka..."
start "$KAFKA_ROOT\bin\windows\kafka-server-start.bat" "$KAFKA_ROOT\config\server.properties"

然后我开始 shell 像这样:

& "$SPARK_ROOT\bin\spark-shell.cmd" --packages "org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.1"

然后我执行这个scala命令:

val ds = spark.readStream.format("kafka").option("kafka.bootstrap.servers", "localhost:9092").option("subscribe", "test").load()

应该可以正常工作,但我收到此错误:

org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rw-rw-rw-;

每个搜索结果都说了一些关于使用 winutils 设置权限的信息,所以我尝试了这些答案,结果如下:

C:\>winutils chmod 777 \tmp\hive

C:\>winutils chmod 777 C:\tmp\hive

C:\>winutils ls C:\tmp\hive
drwxrwxrwx 1 DOMAIN\user DOMAIN\Domain Users 0 Jun 21 2018 C:\tmp\hive

看起来不错但仍然出现同样的异常

%HADOOP_HOME% 正确设置为 D:\dependencies\hadoopD:\dependencies\hadoop\bin\winutils.exe存在。

我在这里错过了什么?我在这里和那里浏览了十几篇文章,但解决方案对我不起作用,我不知道如何调试它。

您需要在 HDFS 目录上设置预期的访问模式,而不是在本地 FS 上的目录上。

为此您需要使用 hadoop fs -chmod ... 命令。另外,不要忘记检查启动您的 spark 应用程序的用户是否能够显式写入 /tmp/hive 或通过在允许写入此目录的组中写入。

HDFS文件权限可以参考official documentation

更新:

所以,如果你遇到同样的问题,你需要使用原始 post 或其他类似问题中提到的 winutils,但有问题的目录可能不在磁盘 C: 上,你需要使用正确的驱动器号调整临时目录的路径。

所以拔了两天毛,当然是简单的东西了。如果您从另一个驱动器(例如 D:)上的工作目录调用 C:\spark\bin\spark-shell,那么您需要更新的权限实际上是:

C:\Users\user>winutils ls D:\tmp\hive
d--------- 1 DOMAIN\user DOMAIN\Domain Users 0 Jun 25 2018 D:\tmp\hive

C:\Users\user>winutils chmod -R 777 D:\tmp\hive

C:\Users\user>winutils ls D:\tmp\hive
drwxrwxrwx 1 DOMAIN\user DOMAIN\Domain Users 0 Jun 25 2018 D:\tmp\hive

没有我能找到的命令,也没有我能看到的配置,也没有网页上的环境配置页面 UI 当前配置单元目录应该是什么。