hadoop 编程 学习之路

来源:互联网 发布:数据库本地连接不上 编辑:程序博客网 时间:2024/06/16 16:52

 现在开始好好学习hadoop ,以后好找工作。

一、在写mapreduce 程序的时候,会报错:

Error: java.lang.RuntimeException:java.lang.ClassNotFoundException: Class Class17.hdfs.test.MyMR$MyMap not foundat org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1905)at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)

错误提示:说类找不到,觉得很奇怪,我定义的类找不到?明明就在那!!

解决方式: 将在eclipse中引到resource下的mapred-site.xml文件中的配置项: mapreduce.framework.name 由yarn改为local就可以了。

知识点:

mapreduce 有3中运行模式:http://www.aboutyun.com/thread-14792-1-1.html

 1、集群模式:

   1) 将mapreduce.framework.name配成yarn,打成jar包在yarn集群中执行,

    2)输入输出只能在hdfs系统中

    3)若是在eclipse中调试,将程序提交到集群中,则要用一下方法:

在linux的eclipse中直接运行main方法,进而将程序提交到集群中去运行,但是必须采取以下措施: 
①在工程src目录下加入 mapred-site.xml 和 yarn-site.xml 这两个配置文件或者在代码中加入:

  Configuration conf = new Configuration();  conf.set("mapreduce.framework.name", "yarn");  conf.set("yarn.resourcemanager.hostname", "hadoop20");
  • 1
  • 2
  • 3

② 同时将工程打成jar包(xxx.jar),并在main方法中添加一个conf的配置参数 conf.set(“mapreduce.job.jar”,”路径/xxx.jar”); 

mapreduce.framework.name设置为yarn,当客户端配置mapreduce.framework.name为yarn时, 客户端会使用YARNRunner与服务端通信, 而YARNRunner真正的实现是通过ClientRMProtocol与RM交互, 包括提交Application, 查询状态等功能。但是根据任务的特性,分为两种方式执行任务:

uber模式: Uber模式是Hadoop2.0针对MR小作业的优化机制。通过mapreduce.job.ubertask.enable来设置是否开启小作业优化,默认为false。
        如果用Job足够小,则串行在的一个JVM完成该JOB,即MRAppMaster进程中,这样比为每一个任务分配Container性能更好。

non-uber: Uber只能执行一小部门的任务,

non-uber:

 2、本地模式:

    1)本地调试代码时在eclipse中执行程序,提交任务,此时要将mapreduce.framework.name 配成local即可。

    2)在执行时由mapred.LocalJobRunner执行job,

    3)job id前面好有local字样:mapred.LocalJobRunner: Finishing task: attempt_local836998709_0001_r_000000_0

    输入输出均可为本地文件系统。

    4)mapreduce.framework.name设置为local,则不会使用YARN集群来分配资源,在本地节点执行。在本地模式运行的任务,无法发挥集群的优势。注:在web UI是查看不到本地模式运行的任务。

 3、classic :

     老一些的版本还有一个JobTracker的实现类,即:classic。用于和MapReduce1.X兼容用的,高一些的版本已经没有这个实现类了。

参考链接:

http://blog.csdn.net/a2011480169/article/details/51834256

http://m.blog.csdn.net/litianxiang_kaola/article/details/71289269

http://www.aboutyun.com/thread-14792-1-1.html

注:在用eclipse编写mareduce任务时,一般都是使用本地模式在本地测试成功后,再打成jar包,提交到yarn集群,然后分发到各台nodemanager上执行任务。

二、

java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: Class17.hdfs.test.MyMR$MyMap.<init>()at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)Caused by: java.lang.RuntimeException:java.lang.NoSuchMethodException: Class17.hdfs.test.MyMR$MyMap.<init>()
java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: Class17.hdfs.test.MyMR$MyMap.<init>()at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)Caused by: java.lang.RuntimeException:java.lang.NoSuchMethodException: Class17.hdfs.test.MyMR$MyMap.<init>()

解决方法: 将类改为static 即可。报的错误:init初始化时的问题。不知道是为啥。


三、关于权限问题:

报permission denied : /tmp

解决办法:  在hdfs-site.xml中增添配置项: dfs.permissions.enabled=false,即不经过权限校验。但是修改之后,我的还报错。所以又执行命令

bin/hdfs dfs -chmod -R 777 /  执行以后,hdfs中的所有文件权限都开放了,也就执行成功了。

四、yarn配置文件配置出错

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.ShuffleHandler not found        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2079)        at org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.serviceInit(AuxServices.java:121)        at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)        at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)        at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl.serviceInit(ContainerManagerImpl.java:234)        at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)        at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)        at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:253)        at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)        at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:462)        at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:509)Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.ShuffleHandler not found        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2047)        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2071)        ... 10 moreCaused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.ShuffleHandler not found        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1953)        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2045)        ... 11 more2017-09-13 17:24:40,069 INFO org.apache.hadoop.service.AbstractService: Service org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices failed in state INITED; cause: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.ShuffleHandler not foundjava.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.mapred.ShuffleHandler not found        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2079)       

现象: 一台nodemanager启动不起来,在集群上提交yarn时,报错:

7/09/13 17:23:20 INFO mapreduce.Job: Job job_1505292313436_0004 failed with state FAILED due to: Application application_1505292313436_0004 failed 2 times due to AM Container for appattempt_1505292313436_0004_000002 exited with  exitCode: 1 due to: Exception from container-launch.Container id: container_1505292313436_0004_02_000001Exit code: 1Stack trace: ExitCodeException exitCode=1: at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)at org.apache.hadoop.util.Shell.run(Shell.java:455)at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:197)at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:299)at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)at java.util.concurrent.FutureTask.run(FutureTask.java:262)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)

刚开始看这个问题很懵圈,不知咋回事,在网上查说是 yarn.nodemanager.aux-services的配置问题,后来查看配置文件,配的值是“mapreduce_shuffle”,没问题啊, 后来又仔细一看,是多写了一对<configuration></configuration> 这个在课上老师讲过,还真被我遇到了。呵呵呵。后来修改了配置重新启动还是不行!! 但其他的节点能启动nodemanager,配置文件是一模一样的,最后实在是没办法了,只能吧其他节点的包拷贝过来,最后启动成功。

运行du -sh * 查看原来的安装包比新拷过来的小, 这才是真正原因,肯定是原来的安装包里少了jar包。

http://blog.csdn.net/samhacker/article/details/18542487



原创粉丝点击