HDFS上的根划痕目录:/tmp/hive应该是可写的.当前权限为:rw-rw-rw-



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

首先,我开始动物园管理员和卡夫卡:

write-host -foregroundcolor green "starting zookeeper..."
start "$KAFKA_ROOTbinwindowszookeeper-server-start.bat" "$KAFKA_ROOTconfigzookeeper.properties"
write-host -foregroundcolor green "starting kafka..."
start "$KAFKA_ROOTbinwindowskafka-server-start.bat" "$KAFKA_ROOTconfigserver.properties"

然后我像这样启动外壳:

& "$SPARK_ROOTbinspark-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 tmphive
C:>winutils chmod 777 C:tmphive
C:>winutils ls C:tmphive
drwxrwxrwx 1 DOMAINuser DOMAINDomain Users 0 Jun 21 2018 C:tmphive

看起来不错,但仍然会出现相同的异常

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

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

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

C:Usersuser>winutils ls D:tmphive
d--------- 1 DOMAINuser DOMAINDomain Users 0 Jun 25 2018 D:tmphive
C:Usersuser>winutils chmod -R 777 D:tmphive
C:Usersuser>winutils ls D:tmphive
drwxrwxrwx 1 DOMAINuser DOMAINDomain Users 0 Jun 25 2018 D:tmphive

我找不到命令,也看不到配置,也没有 Web UI 中环境配置的页面,应该是什么当前 hive 目录。

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

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

您可以参考有关HDFS文件权限的官方文档。

更新:

因此,如果您遇到相同的问题,则需要使用原始帖子或其他类似问题中提到的Winutils,但有问题的目录可能不在磁盘C上:并且您需要使用正确的驱动器号调整临时目录的路径。

最新更新