繁体   English   中英

启动kafka时输入行太长

[英]The input line is too long when starting kafka

我正在尝试在 Windows 上运行 Kafka 消息队列。

我正在使用本教程 - https://dzone.com/articles/running-apache-kafka-on-windows-os

当我尝试使用命令运行它时 -.\bin\windows\kafka-server-start.bat.\config\server.properties

我得到一个错误:输入行太长。 命令的语法不正确。

卡夫卡位置 - C:\kafka_2.11-1.0.0

这是因为文件夹名称“kafka_2.11-1.0.0”导致路径长度过长。 只需将文件夹重命名为较小的名称,例如“kafka”。

问题

kafka-run-class.bat文件执行了一堆 CLASSPATH :concat 调用,这使得 CLASSPATH 很长。

根据您的环境,过长:Windows cmd.exe 环境限制为 8191 个字符。

解决方案

编辑kafka-run-class.bat以便...

  1. 使其不使用 CLASSPATH 或在其他地方设置
  2. 使路径更短,以便 concat 生成小于 8191 个字符的字符串
  3. 使 concat 使用整个文件夹而不是每个 jar(通过libs/*

例子

这是使用第二种方法编辑kafka-run-class.bat ( source ) 的示例:

代替 ...

rem Classpath addition for release
for %%i in ("%BASE_DIR%\libs\*") do (
    call :concat "%%i"
)

... 这样 ...

rem Classpath addition for release
call :concat "%BASE_DIR%\libs\*;"

只需将 Kafka 路径移动到更小的根路径即可解决问题。 例如“C:\Kafka”

以上两个选项都不适合我。

我刚刚将解压缩的目录移动到 C:/ 驱动器并以管理员模式启动 power shell 并尝试了所需的命令,zookeeper 和代理启动顺利。

我已将所有内容复制到 C:/tools/kafka 并且工作正常。 问题确实是通往卡夫卡的道路太长了。

对我来说,它只有在将 Kafka 文件夹保留在 C 目录下之后才有效,因此路径看起来像 C:\Kafka。 我相信这会奏效。

Windows 命令行存在长命令执行问题。 请改用 Powershell。

将所有文件放在其他驱动器中,例如 D: 或 E: 并运行命令

将 kafka 放在靠近驱动器根目录的位置,这样到它的路径就很短。

当您运行包含在 windows 目录中的那些 Kafka 批处理文件时,它们会与您的环境变量(类路径之一)混在一起,并且可以创建一个很长的输入行来实际运行命令/jar。

同样正如其他人指出的那样,确保您下载了二进制文件(是的,即使在 Kafka 站点上它被称为 Scala 二进制文件,并且在任何地方都没有提到 Windows,这可能会使人们感到困惑),而不是源代码。 外行用户也感到困惑,源代码分发在未压缩时看起来类似于二进制分发,例如它具有所有批处理文件,但它们不会运行。

启动kafka时输入行太长

我尝试了下面的命令,但给了我同样的错误

C:\kafka>.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties

发生这种情况是因为当我们在同一个 cmd 上连续执行相同的命令时,路径会附加到类路径中。

关闭命令提示符并再次打开,然后启动 Zookeeper 服务器。

对于 Windows,只需保持 Kafka 文件夹路径短例如 - D/dev/kafka/bin/windows

关闭 Zookeeper 和 Kafka cmd 窗口并重新打开它对我有用。 我尝试了上面的所有选项,除了 powershell。

将 kafka 文件夹重命名为一些较短的名称,例如 kafka2。 打开一个新的命令提示符(不要使用现有/打开的命令提示符)

我尝试提取下载的 Kafka zip 文件联系人

C:\Kafka and ran the Kafka-server-start.bat

从命令提示符(不要以管理员身份运行命令提示符)并且有效。

以管理员身份运行命令提示符对我来说是个问题。

如果有的话,删除kafka_2.13-2.5.0并保持文件夹名称尽可能简单,如Kafka ,还要确保路径中没有空格。

一个工作示例:文件夹位于C:\kafka
一个不工作的例子:文件夹位于C:\kafka 2\

我也有这个问题。 调试 bat 文件,您可以看到,在调用返回此错误的命令并使用相对路径调用它之前更改目录不会影响结果! 问题是 CLASSPATH 变量。 对我来说更短的最简单方法是使用以下命令:

subst K: <absolute-long-path-to-kafka-dir-with-version>

这样我就可以更改为这个虚拟驱动器cd /d K:并毫无问题地执行脚本:

K:\bin\windows\kafka-server-start.bat K:\config\server.properties

我编写了一个包装脚本,在再次执行之前删除了 CLASSPATH 变量,因为每次执行都会附加这些值(相同的 cmd.exe)。

set CLASSPATH=
cd /d K:
K:\bin\windows\kafka-server-start.bat K:\config\server.properties

我用勺子。 如下更改 ...bin\windows\kafka-run-class.bat (kudos Midiman) 为我修复了它:

@REM rem Classpath addition for kafka-core dependencies
@REM for %%i in ("%BASE_DIR%\core\build\dependant-libs-%SCALA_VERSION%\*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\core\build\dependant-libs-%SCALA_VERSION%\*"

@REM rem Classpath addition for kafka-examples
@REM for %%i in ("%BASE_DIR%\examples\build\libs\kafka-examples*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\examples\build\libs\*"

@REM rem Classpath addition for kafka-clients
@REM for %%i in ("%BASE_DIR%\clients\build\libs\kafka-clients*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\clients\build\libs\*"

@REM rem Classpath addition for kafka-streams
@REM for %%i in ("%BASE_DIR%\streams\build\libs\kafka-streams*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\streams\build\libs\*"

@REM rem Classpath addition for kafka-streams-examples
@REM for %%i in ("%BASE_DIR%\streams\examples\build\libs\kafka-streams-examples*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\streams\examples\build\libs\*"

@REM for %%i in ("%BASE_DIR%\streams\build\dependant-libs-%SCALA_VERSION%\rocksdb*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\streams\build\dependant-libs-%SCALA_VERSION%\*"

@REM rem Classpath addition for kafka tools
@REM for %%i in ("%BASE_DIR%\tools\build\libs\kafka-tools*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\tools\build\libs\*"

@REM for %%i in ("%BASE_DIR%\tools\build\dependant-libs-%SCALA_VERSION%\*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\tools\build\dependant-libs-%SCALA_VERSION%\*"

for %%p in (api runtime file json tools) do (
    @REM for %%i in ("%BASE_DIR%\connect\%%p\build\libs\connect-%%p*.jar") do (
    @REM    call :concat "%%i"
    @REM )
    call :concat "%BASE_DIR%\connect\%%p\build\libs\*"
    if exist "%BASE_DIR%\connect\%%p\build\dependant-libs\*" (
        call :concat "%BASE_DIR%\connect\%%p\build\dependant-libs\*"
    )
)

@REM rem Classpath addition for release
@REM for %%i in ("%BASE_DIR%\libs\*") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\libs\*"

@REM rem Classpath addition for core
@REM for %%i in ("%BASE_DIR%\core\build\libs\kafka_%SCALA_BINARY_VERSION%*.jar") do (
@REM    call :concat "%%i"
@REM )
call :concat "%BASE_DIR%\core\build\libs\*"

将 kafka_2.11-1.0.0 重命名为 kafka 并保存在 C 盘。 这对我有用。

请检查您的文件的目录路径,它不应在您保存 Kafka 的目录结构中包含任何“-”。 从 kafka_2.13-2.7.0 更改目录的名称 --> Kafka为我工作。

解决这个问题的另一个好方法是从 kafka 文件夹创建一个虚拟驱动器:

subst <drive:> path\to\folder

例子:

subst K: C:\Users\me\software\kafkax.x-x.x

然后你可以去 K: 驱动并运行 zookeeper 和 kafka 没有问题。

cd K:
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
.\bin\windows\kafka-server-start.bat .\config\server.properties

调试并发现问题。 执行命令echo %CLASSPATH%你会找到罪魁祸首:)

kafka\lib 目录下的所有 jar 文件都在CLASSPATH中单独设置。 所以错误被抛出为Input Line too long

修复:在环境变量中添加CLASSPATH变量,直到 kafka 基目录。

Kafka 文件夹/目录路径长度需要减少。 使用短文件夹/目录路径,然后它应该开始工作。

以下步骤对我有用。

  1. 将 Kafka 文件夹移动到靠近根目录的位置(如 C:\kafka)。
  2. 从环境变量中删除不需要的路径变量。

只需删除文件夹名称 (kafka) 中 kafka 之前的版本 (kafka_2.13-3.3.1),它就应该可以工作。

从 Powershell 窗口运行 common .\bin\windows\kafka-server-start.bat .\config\server.propertie,它在 Window 上运行没有任何问题。

对于类似的错误,对于 zookeeper,我运行我从https://zookeeper.apache.org/doc/r3.6.2/zookeeperStarted.html下载的 zookeeper zkserver.cmd

使用较短的路径来存储 kafka,例如 E:/kafka。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM