Linux Hadoop shell 脚本给出 .class 错误

Linux Hadoop shell 脚本给出 .class 错误

我正在尝试运行此脚本以在 hadoop 上运行映射减少。但是当我运行这个脚本时,它给了我屏幕截图中附加的错误。脚本:

rm -rf /home/sk/Desktop/abc/wordcountc/

rm /home/sk/Desktop/abc/wordcountj.jar

mkdir /home/sk/Desktop/abc/wordcountc/

须藤 chmod 777 /home/sk/Desktop/abc/wordcountc

cd /usr/local/hadoop

启动dfs.sh

启动yarn.sh

太平绅士

bin/hdfs dfs -rm -r -skipTrash /用户

bin/hdfs dfs -rm -r -skipTrash /opt

bin/hdfs dfs -rm -r -skipTrash /opt2

bin/hdfs dfs -mkdir /用户

bin/hdfs dfs -put '/home/sk/Desktop/input' /user

cd /home/sk/桌面/abc/

javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.0.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.0 .jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d /home/sk/Desktop/abc*.java

mv /home/sk/Desktop/abc/*.class /home/sk/Desktop/abc/wordcountc/

cd /home/sk/桌面/abc

jar -cvf wordcountj.jar -C /home/sk/Desktop/abc/wordcountc 。

cd /usr/local/hadoop

bin/hadoop jar /home/sk/Desktop/abc/wordcountj.jar OutDegree /user/input outputwc

让我知道我的错误在哪里,所以没有生成类。在此输入图像描述

答案1

标志-dtojavac需要一个作为目录路径的参数。

甲骨文说关于这个标志

设置类文件的目标目录。该目录必须已经存在;javac不会创建它。如果类是包的一部分,javac则将类文件放入反映包名称的子目录中,并根据需要创建目录。

但是,您给出的参数/home/sk/Desktop/abc*.java看起来根本不像目录路径。

你的意思/home/sk/Desktop/?或者你真的需要这个-d标志吗?您可能不这样做,而这abc*.java正是您想要编译的 Java 源文件。

或者,您想要-d /home/sk/Desktop/ /home/sk/Desktop/abc*.java.

答案2

您的脚本中的命令javac不起作用。Usage: javac <options> <source files>屏幕截图中的消息表明了这一点。这又导致mv命令失败,因为没有生成要移动的 java 类文件。这又导致类加载器失败并生成错误堆栈。

要解决此问题,您需要更改javac命令:
javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.0.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.0.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d /home/sk/Desktop/abc*.java

到:
javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.0.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.0.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d /home/sk/Desktop/abc/ /home/sk/Desktop/abc/*.java

这将编译 /home/sk/Desktop/abc 中的所有 java 文件,并为每个 java 文件创建相应的类文件。

这可能很危险,因为将来您可能会将更多的 java 文件放入此目录中,而不仅仅是您当前正在使用的字数统计文件。

相关内容