您的位置:首页 > 编程语言 > Java开发

hadoop2.7.4 安装配置以及java wordcount 运行出错的总结

2017-10-15 19:13 627 查看

1.Ubuntu下安装最新OpenJdk1.8以及与oracle-jdk1.8的区别

参考地址:http://blog.csdn.net/z5234032/article/details/62886879

jdk有各种各样的版本,openjdk是开源版本,oracle与之相反。openjdk可以直接使用apt-get install 命令直接下载

openjdk环境变量设置如下:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH


2.hadoop 安装配置

参考地址:http://blog.csdn.net/se7en_q/article/details/47258007

该参考的网址的代码有错误,将4),配置hdfs-site.xml 中的

<!-hdfs-site.xml-->改成<!--hdfs-site.xml-->

其次,在yarn-site.xml中把

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.241.128:8099</value>
</property>
删掉,或把
192.168.241.128:8099
改成自己的ip地址

其次如果出现 linux中执行jps进程没有完全显示5个进程 的情况:

1.DataNode 和NameNode 两个进程有一个消失。

1,1则是因为多次运行了

bin/hdfs namenode –format(或 hadoop namenode -format) 导致/hdfs/data /hdfs/name两个目录下的current的文件中的一个id值不一样。每次运行该命令之前,把/hdfs/data,/hdfs/name目录下的文件全删掉
1.2 配置hdfs-site.xml 错误 参见http://blog.csdn.net/se7en_q/article/details/47258007

2.ResourceManager和NodeManager有一个进程消失

通过查看hadoop日志(在hadoop-2.7.4/logs/yarn-hadoop-nodemanager-lyf.log处),发现内存分配过小

在yarn.site.xml文件改成

<configuration>

<!-- Site specific YARN configuration properties -->

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.nodemanager.resource.memory-mb</name>

<value>3072</value>

</property>

<property>

<name>yarn.nodemanager.resource.cpu-vcores</name>

<value>1</value>

</property>

</configuration>

3.编写hadoop wordcount 程序

参考地址:

1.所需要的hadoop jar包

hadoop-2.7.4/share/hadoop/common/hadoop-common-2.7.4.jar(org.apache.hadoop.io包所在的jar包)

hadoop-2.7.4/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.4.jar

2.出现 无法访问 org.apache.commons.cli.Options 的情况

继续添加jar包

hadoop_installs/hadoop-2.7.4/share/hadoop/common/lib/commons-cli-1.2.jar

3. 编译wordcount,后才能导出jar包

4.导出jar包

1.

如果java文件(test.java)里含有包名(example),即 package example

则使用java 运行test.class,即使用java test命令时会报错误: 找不到或无法加载主类 test.class 的错误

解决办法:创建example文件夹,将test.class文件移入example文件夹内.在example文件夹的上级目录内运行java example.test即可解决这个问题

2.Exception in thread "main" java.lang.ClassNotFoundException: 错误

在导出java包,这是因为在导出jar包时,要指定一个主类(只能指定唯一一个.这个指定在MANIFEST.MF文件里).如果test.java文件有上级的包名,比如说example,则应当是Main-Class: example.test(一定要有包名).注意在Main-Class:和example.test之间要有空格。具体的IDE环境具体考虑,但本质上在指定主类,指定主类时要指定包名。

  导出jar包时,可以不用指定主类.但是如果这样的话,运行java -jar *.jar时会报 *.jar中没有主清单属性 的错误。但是用java -cp *.jar *.类名 命令时(即主动在命令行指定一个主类)时可正常运行。

一个jar包里,可以多个类里有main函数,但是只能有一个主类。如果想指定运行某个含main的类(比如说test),使用 java -cp test.jar example.test(test.jar 运行的jar包,example为test类的包名).直接运行主类使用命令 java test.jar

3.hadoop运行test.jar程序,hadoop的命令用法

  hadoop命令相当于java命令

使用命令 hadoop jar test.jar [args...].这个命令会运行test.jar的主类(即在导出jar包时指定的主类)。在test.jar导出时设定主类的情况下,如果想要运行test.jar其他的类,从命令层次来讲,hadoop jar命令无法做到。

  如果想指定类名怎么办呢。事实上完全可以做到。

  如果java命令中有一个class path.hadoop命令中也有一个hadoop的class path.查看该class path的方法是运行命令hadoop classpath.会得到如下的输出:

  /home/hadoop/hadoop_installs/hadoop-2.7.4/etc/hadoop:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/common/lib/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/common/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/hdfs:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/hdfs/lib/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/hdfs/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/yarn/lib/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/yarn/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/mapreduce/lib/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/mapreduce/*:/home/hadoop/hadoop_installs/hadoop-2.7.4/contrib/capacity-scheduler/*.jar

  如同用命令java -cp *.jar 类名 的命令(可以指定运行某个类)一样,假设你要运行test.jar中的example.test类,那么将test.jar 拷贝到/home/hadoop/hadoop_installs/hadoop-2.7.4/share/hadoop/common/目录下。然后运行命令hadoop
example.test,就可以指定运行example.test类,而不管example.test是否是test.jar中的主类。(hadoop 命令完全相当于java命令)

  hadoop jar test.jar [类名] [args](即如果在hadoop命令中指定运行某个类名),则test.jar在被导出的时候不能指定主类,即在MANIFEST.MF中把Main-Class:
example.test语句删除).否则,该命令会把类名识别为主类的运行传入参数。

  综上,如果想在hadoop命令中指定使用***.jar包中的***.**类(即 hadoop ***.jar classname 命令)则***.jar包在被导出的时候不能设置主类,***.jar包无需放在hadoop中的classpath中,只需要***.jar在当前目录中。

  而如果直接使用 hadoop jar ***.jar ,则***.jar不必放在hadoop中的classpath.实际上这是很奇怪的设计,为什么不能设计成***.jar包可以放在任意位置运行。

用java运行一个类时,一定要指定该类的路径,路径的信息包含在classpath 以及-cp参数中。否则会提示找不到类。如果某个类在***.jar文件中,则将***.jar加入到classpath中。

  

但是在运行hadoop自身的wordcount 的实例时,使用的是hadoop jar hadoop-mapreduce-examples-2.7.4.jar wordcount /input /out.wordcount好像指定了类名,但其实不是。如果查看hadoop-mapreduce-examples-2.7.4.jar源码的MANIFEST.MF文件时,会发现主类是ExampleDriver.然后这个类以类名为输入参数调用不同的程序(比如说wordcount).如果想查看jar包,只需要在某个项目里导入jar包,在External
Libraries里查看即可。

 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息