我正在尝试针对本地 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上:并且您需要使用正确的驱动器号调整临时目录的路径。