2015-05-04 29 views
0

更新:Hadoop概要分析

我曾寄過Karmasphere創始人Shevek的幫助。他曾在ApacheCon 2011上做過關於hadoop分析的演示。他建議尋找Throwable。 Catch block for Throwable顯示:

localhost: java.lang.IncompatibleClassChangeError: class com.kannan.mentor.sourcewalker.ClassInfoGatherer has interface org.objectweb.asm.ClassVisitor as super class 
localhost: at java.lang.ClassLoader.defineClass1(Native Method) 
localhost: at java.lang.ClassLoader.defineClass(ClassLoader.java:792) 

Hadoop有ASM3.2 jar和我正在使用5.0。在5.0中,ClassVisitor是一個超級類,在3.2中它是一個接口。我打算將我的分析器更改爲3.2。有沒有其他更好的方法來解決這個問題?

順便說一句,Shevek是超級酷。一位創始人兼首席執行官迴應了一些匿名的電子郵件。想象一下。

結束時更新

我想簡介的Hadoop(JobTracker的,名稱節點,數據節點等)。使用ASM5創建一個分析器。在Spring上測試它,一切正常。

然後以僞分佈模式在Hadoop上測試分析器。

@Override 
public byte[] transform(ClassLoader loader, String className, 
     Class<?> classBeingRedefined, ProtectionDomain protectionDomain, 
     byte[] classfileBuffer) throws IllegalClassFormatException { 
    try { 
     /*1*/ System.out.println(" inside transformer " + className); 
     ClassReader cr = new ClassReader(classfileBuffer); 
      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); 
     /* c-start */ // CheckClassAdapter cxa = new CheckClassAdapter(cw); 
      ClassVisitor cv = new ClassInfoGatherer(cw); 
      /* c-end */ cr.accept(cv, ClassReader.EXPAND_FRAMES); 
      byte[] b = cw.toByteArray(); 
      /*2*/System.out.println(" inside transformer - returning" + b.length); 
      return b; 
     } catch (Exception e) { 
      System.out.println(" class might not be found " + e.getMessage()) ; 
      try { 
       throw new ClassNotFoundException(className, e); 
      } catch (ClassNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    return null; 
} 

我可以看到打印出來的第一條sysout語句,但不是第二條。也沒有錯誤。如果我從/ * c-start /到/ c-stop * /註釋掉,並用classFileBuffer替換cw,我可以看到第二個sysout語句。那一刻我去掉線

ClassVisitor cv = new ClassInfoGatherer(cw); 

ClassInfoGatherer構造:

public ClassInfoGatherer(ClassVisitor cv) { 
super(ASM5, cv); 

}

我沒有看到第二個系統輸出語句。

我在這裏做錯了什麼。 Hadoop是否吞噬我的系統。也試過系統錯誤。即便是這種情況,爲什麼我可以看到第一個sysout語句?

任何建議都會有幫助。我想我在這裏錯過了一些簡單而明顯的事情......但無法弄清楚。加入

以下行hadoop-env.sh

出口HADOOP_NAMENODE_OPTS = 「 - javaagent:路徑罐子$ HADOOP_NAMENODE_OPTS」

出口HADOOP_SECONDARYNAMENODE_OPTS = 「 - 路徑罐子$ HADOOP_SECONDARYNAMENODE_OPTS」

出口HADOOP_DATANODE_OPTS = 「 - javaagent:路徑罐子$ HADOOP_DATANODE_OPTS」

出口HADOOP_BALANCER_OPTS = 「 - javaagent:路徑罐子$ HADOOP_BALANCER_OPTS」

出口HADOOP_JOBTRACKER_OPTS = 「 - javaagent:路徑罐子$ HADOOP_JOBTRACKER_OPTS」

+0

我試過使用sjf4j記錄器。沒有工作。創建一個日誌休息服務,並在變換器中使用httpclient爲這個新服務發佈帖子。它適用於分析其他工具,但不適用於Hadoop。 –

+0

我寄過Karmasphere創始人Shevek的幫助。我曾在ApacheCon 2011上做過關於hadoop剖析的演示。他建議尋找Throwable。 Throwable節目的捕獲塊: –

回答

0

的Hadoop有ASM 3.2和我使用ASM 5.在了ASM5,ClassVisitor是一個超和3.2這是一個接口。出於某種原因,錯誤是Throwable(信用給Shevek),catch塊只能捕獲異常。在任何hadoop日誌中都沒有捕獲到可拋錯誤。所以,調試非常困難。

用jar jar鏈接修復asm版本問題,現在一切正常。

如果您使用的是Hadoop,而某些東西無法正常工作,並且沒有日誌顯示任何錯誤,請嘗試捕獲Throwable。

Arun