hadoop 編程 學習之路

 現在開始好好學習hadoop ,以後好找工作。

一、在寫mapreduce 程序的時候,會報錯:

Error: java.lang.RuntimeException:java.lang.ClassNotFoundException: Class Class17.hdfs.test.MyMR$MyMap not found
at 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 more
Caused 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 more
2017-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 found
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)
       

現象: 一臺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_000001
Exit code: 1
Stack 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



發佈了66 篇原創文章 · 獲贊 25 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章