0

我用 Cygwin 在 windows xp 上安装了 PIG (0.10.0)。我还设置了 JAVA_HOME 变量。但是现在当我运行 pig -help 时,我得到“找不到 pig.jar。做 'ant jar',然后再试一次”。我没有安装hadoop(使用嵌入式版本)。

另外,当我在设置 JAVA_HOME 后第一次运行命令时,我收到以下警告:

cygwin 警告:检测到 MS-DOS 样式路径:C:\Pig\PIG-01~1.0/pig.jar 首选 POSIX 等效项是:/cygdrive/c/Pig/PIG-01~1.0/pig.jar CYGWIN 环境变量选项“ nodosfilewarning”关闭此警告。有关 POSIX 路径的更多详细信息,请参阅用户指南: ... 找不到 pig.jar。做'ant jar',然后再试一次

我无法找到它正在读取此路径的位置。任何帮助将不胜感激。

4

1 回答 1

1

我可以回答您的具体问题,但必须警告您,我还没有让 pig 在我的 PC 上的 cygwin UNIX 模拟器上工作。我会告诉你我所知道的。

消息:'找不到 pig.jar。做'ant jar'然后再试一次。来自 pig shell 脚本末尾附近的一段代码。您正在使用 pig-0.10.0。我试图让 pig-0.11.1 工作,但收到与您相同的错误消息。如果未安装 Hadoop,则在 shell 脚本中没有将环境变量 HADOOP_BIN 指向的目录,因为脚本使用 - HADOOP_BIN= which hadoop- 来设置它。因此,在脚本接近尾声时,没有设置 HADOP_BIN,代码分支到需要 pig.jar 或 pig-?.!(*withouthadoop).jar 在 $PIG_HOME 给定的位置,放入变量 PIG_JAR。您的 shell 脚本都找不到这些,因此 PIG_JAR 为空,因此出现错误消息。

如果 [ -n "$PIG_JAR" ]; 然后
CLASSPATH="${CLASSPATH}:$PIG_JAR"
else
echo "Cannot locate pig.jar. do 'ant jar, and try again"
exit 1
fi

java 容器 pig.jar 不存在于您的目录中,因为 pig 尚未使用 ant 构建。但实际上,脚本应该找到 pig.?.!(*withouthadoop).jar。您的目录中将有 pig-0.10.0.jar,模式匹配意味着 pig- 后跟单个字符,后跟 . 后面是任何东西,除了以 'withouthadoop' 结尾的东西,然后是 .jar 。'withouthadoop' 表示 jar 不包含嵌入的 hadoop,因此必须已经安装了 hadoop。如果未安装 hadoop,则 pig-0.10.0.jar 似乎应该没问题。

那为什么找不到呢?在 shell 脚本中有一小段代码供在 cygwin UNIX 中运行脚本的人使用:

如果 $cygwin; 然后
CLASSPATH= cygpath -w "$CLASSPATH"
PIG_HOME= cygpath -d "$PIG_HOME"
PIG_LOG_DIR= cygpath -d "$PIG_LOG_DIR"
fi

这会将传递给 java.exe 的路径转换为 ​​java.exe 可以理解的形式,因为它是 Windows 可执行文件。我发现在这些表达式中使用 -m 而不是 -w 或 -d - 让 cygpath 使用正斜杠将例如 /cygdrive/c/Program Files/Java .. 转换为 c:/Program Files/Java .. - 这-m 规定 - 有效。

在 pig.jar 中使用 'cannot find org.apache.pig.Main ' 经历了更多痛苦之后(是的,我在弄清楚上述内容之前'anted'它)我终于得到了一个'grunt>'提示。为了实现这一点,我对 pig shell 脚本所做的更改是:

  • 删除整个 if $cygwin; ... 上面描述的 fi 块。我假设将 $PIG_HOME 转换为 Windows 文件路径格式会导致代码块: if [-f $PIG_HOME/pig.jar]; 然后; PIG_JAR=$PIG_HOME/pig.jar; 别的; 猪罐= echo $PIG_HOME/pig-?.!(*withouthadoop).jar; fi 抛出您看到的错误:cygwin 警告,检测到 MS-DOS 样式路径:c:\pig\pig-01~1/pig.jar 等。

  • 在删除 cygwin 路径转换块的位置之后,将 PIG_OPTS 变量设置重写为:

PIG_OPTS="$PIG_OPTS -Dpig.log.dir= cygpath -m $PIG_LOG_DIR"
PIG_OPTS="$PIG_OPTS -DPIG.log.file=pig.log"
PIG_OPTS="$PIG_OPTS -Dpig.home.dir= cygpath -m $PIG_HOME"

  • 将调用 java.exe - exec "$JAVA" .. 的 shell 脚本末尾的代码行重写为:

exec "$JAVA" $JAVA_HEAP_MAX $PIG_OPTS -classpath " cygpath -p -m $CLASSPATH" $CLASS "${remaining[@]}"

  • 在您的 PIG_HOME 中创建一个“日志”目录

  • 将以下导出条目放入主目录中的 .bashrc 文件中,以在 bash shell 启动时初始化环境变量:

export PATH="$PATH:/cygdrive/c/Program Files/Java/jdk-your_version/bin:/cygdrive/..your-pig-home/bin"
export JAVA_HOME="/cygdrive/c/Program Files/Java/ jdk-your_version"
导出 CLASSPATH=""

所有这一切让我输入“pig -x local”并得到一个“grunt>”提示。有趣的是,通过下载 pig-0.7.0,解压 pig-0.7.0.tar.gz 文件并在本地运行 pig -x,它可以立即使用。相同的 'grunt>' 提示。

但是,不幸的是,这是一个骗局。在这两种情况下。虚假的咕噜声 - 口技师的咕噜声。箭头键将光标移动到整个提示符上-实际上是屏幕上您喜欢的任何位置-返回键不输入任何内容,无论您输入了什么,只有控制+反斜杠有效,以返回美元提示符。如果您到了这一点并了解正在发生的事情,请告诉我。

于 2013-04-17T15:45:26.213 回答