如何使用Java类运行Hadoop?

时间:2010-08-31 07:01:49

标签: java hadoop

我正在关注这本书Hadoop: the definitive Guide

我对示例3-1感到困惑。

有一个Java源文件URLCat.java。  我使用javac将其编译为URLCat.class,然后使用jar将其包装到jar中。

这本书说要用

% hadoop URLCat hdfs://localhost/user/tom/quangle.txt

运行它。我尝试了很多不同的方法,比如

% hadoop jar URLCat.jar .......

但没有奏效。我有这样的错误:

  

线程“main”中的异常java.lang.ClassNotFoundException:hdfs:// localhost / user / username / quangle / txt

这是什么原因,我该怎么做?

9 个答案:

答案 0 :(得分:4)

这很简单:

[me@myhost ~]$ hadoop jar
RunJar jarFile [mainClass] args...

那么,你想要的是hadoop jar yourJar.jar your.class.with.Main [any args]

答案 1 :(得分:3)

当然你可以使用猫,但那种不是重点(即你正在学习,而不只是试图让它发挥作用)。

根据本书,您需要设置HADOOP_CLASSPATH环境变量。就我而言,使用本书中的构建示例,我的所有类都位于: / media / data / hadefguide / book / build / classes

以下是一个例子:

hduser@MuleBox ~ $ export HADOOP_CLASSPATH=
hduser@MuleBox ~ $ hadoop URLCat hdfs://localhost/user/hduser/quangle.txt
Exception in thread "main" java.lang.NoClassDefFoundError: URLCat
Caused by: java.lang.ClassNotFoundException: URLCat
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: URLCat.  Program will exit.
hduser@MuleBox ~ $ export HADOOP_CLASSPATH=/media/data/hadefguide/book/build/classes
hduser@MuleBox ~ $ hadoop URLCat hdfs://localhost/user/hduser/quangle.txt
On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

答案 2 :(得分:0)

命令的syntax略有不同:

hadoop fs -cat hdfs:///user/tom/quangle.txt

你的家里有你的家吗?你可以在没有任何参数的情况下调用hadoop吗?

答案 3 :(得分:0)

要使hadoop URLCat命令工作,您需要将jar(URLCat.jar)放在类路径中。你可以把它放在hadoop的lib / dir中。

要运行hadoop jar URLCat.jar,你需要创建一个将在其中定义Main类的jar,否则它会认为命令行上的下一个参数是类名。您可以尝试的是hadoop jar URLCat.jar URLCat hdfs:// ...

答案 4 :(得分:0)

我是根据本网站上的帮助和hadoop教程做到的。

mkdir urlcat_classes<br>
javac -classpath /usr/lib/hadoop/hadoop-0.20.2-cdh3u1-core.jar -d     urlcat_classes URLCat.java<br>
jar -cvf urlcat.jar -C urlcat_classes .<br>
hadoop jar urlcat.jar no.gnome.URLCat       
hdfs://localhost/user/claus/sample.txt<br>
<br>
no.gnome is from 'package no.gnome;' in URLCat.java.<br><br>

问候
克劳斯

答案 5 :(得分:0)

现在还不确定答案有多有用。我今天遇到了同样的问题,事实上正在研究同一本书中的一个例子(Hadoop权威指南) 我能够按如下方式执行示例程序:

  • 编写您的Java代码并将其另存为.java文件

  • 使用以下命令编译java程序:

    javac -classpath <path to hadoop core and commons-cli jar file> <path to your java program file>
    
  • 创建一个包含类文件的jar文件:

    jar cvf <jar file> <class files to add separated by space>
    
  • 使用hadoop命令行执行jar文件:

    hadoop jar <jar file name> <class name containing your main method> <argument to the main method>
    

    例如

    hadoop jar FileSystemCat.jar FileSystemCat hdfs://localhost/user/root/MyFiles/meet_a_seer.txt
    

希望有所帮助

答案 6 :(得分:0)

第1步:编译Java程序:

  

javac URLCat.java -classpath $ HADOOP_HOME / share / hadoop / common / hadoop-common-2.7.0.jar

第2步:创建jar文件:

  

jar cvf URLCat.jar URLCat.class

步骤3:执行程序:(提及你的hdfs文件位置)

  

hadoop jar URLCat.jar URLCat hdfs:// localhost:9000 / pcode / wcinput.txt

答案 7 :(得分:0)

转到已编译的.class文件所在的目录。

在运行hadoop URLCat hdfs://localhost/user/tom/quangle.txt时,请使用包括包名称的完整类名(请参阅Receiving "wrong name" NoClassDefFoundError when executing a Java program from the command-line获取完整的班级名称或运行作业的目录)。

就我而言,URLCat.java位于com.tom.app,因此hadoop命令为hadoop com.tom.app.URLCat hdfs://localhost/user/tom/quangle.txt

答案 8 :(得分:-2)

我们可以通过hdfs api访问HDFS。我对它的理解是你可以使用hdfs api联系运行dfs的hadoop集群并从中获取数据。

为什么我们需要调用命令 hadoop jar URLCat.jar

为什么不呢 java URLCat

为什么客户端必须安装hadoop然后联系hadoop集群?