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\hadoop 和 D:\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 当前配置单元目录应该是什么。
我正在尝试针对本地 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\hadoop 和 D:\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 当前配置单元目录应该是什么。