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

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里查看即可。

 

  

     

     

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值