HADOOP MR Job 디버깅

20434 단어 hadoopjob디버깅mr
MR job을 디버깅하려면 단일 컴퓨터 환경에서 하는 것이 가장 좋다. 이렇게 하면 문제의 복잡도를 낮출 수 있다.
eclipse에서 디버깅을 하는 것을 추천합니다.hadoop-eclipse 플러그인을 설치하고, 플러그인의jar에 대한 수정을 주의하십시오
1:lib 폴더에 의존하는jar 패키지를 추가합니다.
2: meta-inf 파일 수정
2 eclipse에서 MR 프로젝트를 새로 만들고 적당한 논리를 작성합니다. 오른쪽 키로run on hadoop으로Word Count의 클래스를 시작합니다. 그 전에 프로젝트의classpath에 있는hadoop 프로필에 추가해야 합니다.
 

  
  
  
  
  1. <property> 
  2.  
  3.          <name>mapred.child.java.opts</name> 
  4.  
  5.          <value>-Xmx2000m -Xdebug -Xrunjdwp:transport=dt_socket,address=7788,server=y,suspend=y</value> 
  6.  
  7.  </property> 
  8.  
  9.  
  10.  
  11.  <property> 
  12.  
  13.          <name>mapred.tasktracker.map.tasks.maximum</name> 
  14.  
  15.          <value>1</value> 
  16.  
  17.          <description>tasktracker map </description> 
  18.  
  19.  </property> 
  20.  
  21.  
  22.  
  23.  <property> 
  24.  
  25.          <name>mapred.tasktracker.reduce.tasks.maximum</name> 
  26.  
  27.          <value>1</value> 
  28.  
  29.          <description>tasktracker reduce </description> 
  30.  
  31.  </property> 
  32.  
  33.  
  34.  
  35.  <property> 
  36.  
  37.          <name>mapred.task.timeout</name> 
  38.  
  39.          <value>100000000</value> 
  40.  
  41.  </property> 

 
이 설정들은tasktracker가 jvm에서task를 실행할 때의 매개 변수를 지정합니다.
셋째, 우리의 MR 프로젝트가 포장되지 않았기 때문에 자가 포장 프로그램이 있어야 한다(이 프로그램은 인터넷에 옮겨진다)

  
  
  
  
  1. import java.io.File; 
  2.  
  3. import java.io.FileInputStream; 
  4.  
  5. import java.io.FileOutputStream; 
  6.  
  7. import java.io.IOException; 
  8.  
  9. import java.net.MalformedURLException; 
  10.  
  11. import java.net.URL; 
  12.  
  13. import java.net.URLClassLoader; 
  14.  
  15. import java.util.LinkedList; 
  16.  
  17. import java.util.List; 
  18.  
  19. import java.util.jar.JarEntry; 
  20.  
  21. import java.util.jar.JarOutputStream; 
  22.  
  23. import java.util.jar.Manifest; 
  24.  
  25.  
  26.  
  27. public class EJob { 
  28.  
  29.      
  30.  
  31.     private static List<URL> classPath = new LinkedList<URL>(); 
  32.  
  33.      
  34.  
  35.     public static void addClasspath(String path){ 
  36.  
  37.         try { 
  38.  
  39.             classPath.add(new URL(path)); 
  40.  
  41.         } catch (MalformedURLException e) { 
  42.  
  43.             // TODO Auto-generated catch block 
  44.  
  45.             e.printStackTrace(); 
  46.  
  47.         } 
  48.  
  49.     } 
  50.  
  51.      
  52.  
  53.     public static ClassLoader getClassLoader() { 
  54.  
  55.         ClassLoader parent = Thread.currentThread().getContextClassLoader(); 
  56.  
  57.         if (parent == null) { 
  58.  
  59.             parent = EJob.class.getClassLoader(); 
  60.  
  61.         } 
  62.  
  63.         if (parent == null) { 
  64.  
  65.             parent = ClassLoader.getSystemClassLoader(); 
  66.  
  67.         } 
  68.  
  69.         return new URLClassLoader(classPath.toArray(new URL[0]), parent); 
  70.  
  71.     } 
  72.  
  73.      
  74.  
  75.     public static File createTempJar(String root) throws IOException { 
  76.  
  77.         if (!new File(root).exists()) { 
  78.  
  79.             return null
  80.  
  81.         } 
  82.  
  83.         Manifest manifest = new Manifest(); 
  84.  
  85.         manifest.getMainAttributes().putValue("Manifest-Version""1.0"); 
  86.  
  87.         final File jarFile = File.createTempFile("EJob-"".jar"new File(System 
  88.  
  89.                 .getProperty("java.io.tmpdir"))); 
  90.  
  91.  
  92.  
  93.         Runtime.getRuntime().addShutdownHook(new Thread() { 
  94.  
  95.             public void run() { 
  96.  
  97.                 jarFile.delete(); 
  98.  
  99.             } 
  100.  
  101.         }); 
  102.  
  103.  
  104.  
  105.         JarOutputStream out = new JarOutputStream(new FileOutputStream(jarFile), 
  106.  
  107.                 manifest); 
  108.  
  109.         createTempJarInner(out, new File(root), ""); 
  110.  
  111.         out.flush(); 
  112.  
  113.         out.close(); 
  114.  
  115.         return jarFile; 
  116.  
  117.     } 
  118.  
  119.  
  120.  
  121.     private static void createTempJarInner(JarOutputStream out, File f, 
  122.  
  123.             String base) throws IOException { 
  124.  
  125.         if (f.isDirectory()) { 
  126.  
  127.             File[] fl = f.listFiles(); 
  128.  
  129.             if (base.length() > 0) { 
  130.  
  131.                 base = base + "/"
  132.  
  133.             } 
  134.  
  135.             for (int i = 0; i < fl.length; i++) { 
  136.  
  137.                 createTempJarInner(out, fl[i], base + fl[i].getName()); 
  138.  
  139.             } 
  140.  
  141.         } else { 
  142.  
  143.             out.putNextEntry(new JarEntry(base)); 
  144.  
  145.             FileInputStream in = new FileInputStream(f); 
  146.  
  147.             byte[] buffer = new byte[1024]; 
  148.  
  149.             int n = in.read(buffer); 
  150.  
  151.             while (n != -1) { 
  152.  
  153.                 out.write(buffer, 0, n); 
  154.  
  155.                 n = in.read(buffer); 
  156.  
  157.             } 
  158.  
  159.             in.close(); 
  160.  
  161.         } 
  162.  
  163.     } 
  164.  
  165.  
  166.  

마지막으로 WordCount의main 함수에 추가
 

   
   
   
   
  1. File jarFile = EJob.createTempJar("bin"); 
  2. ClassLoader classLoader = EJob.getClassLoader(); 
  3. Thread.currentThread().setContextClassLoader(classLoader); 
  4.  
  5. ((JobConf)job.getConfiguration()).setJar(jarFile.toString()); 

 
이렇게 하면 eclipse에서 원격 디버깅을 하면 7788 포트를 연결할 수 있습니다

좋은 웹페이지 즐겨찾기