2017-06-19 68 views
0

我正在讀取JSON文件並從JSON輸入中提取元素的MapReduce(僅限Map任務)。輸入數據:JSON映射器類中的錯誤

{"type":"cloud_monitor","format":"default","version":"1.0","id":"71101cb85441995d11a43bb","start":"1413585245.921","cp":"254623","message":{"proto":"http","protoVer":"1.1","status":"403","cliIP":"23.79.231.14","reqPort":"80","reqHost":"ksd.metareactor.com","reqMethod":"GET","reqPath":"%2findex.php","reqQuery":"path%3d57%26product_id%3d49%26route%3d%255Cwinnt%255Cwin.ini%2500.","respCT":"text/html","respLen":"286","bytes":"286","UA":"mozilla-saturn","fwdHost":"origin-demo2-akamaized.scoe-sil.net"},"reqHdr":{"accEnc":"gzip,%20deflate","cookie":"PHPSESSID%3dkkqoodvfe0rt9l7lbvqghk6e15%3bcurrency%3dUSD%3blanguage%3den"}} 

我已經聲明爲JSON字符串數組變量:消息& reqHdr,你可以看到他們在context.write()方法

地圖類:

public class JsonMapper extends Mapper<LongWritable, Text, Text, Text> { 

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    String type; 
    String format; 
    String version; 
    String id; 
    String start; 
    String cp; 
    // variables for message and reqHdr 
    String[] line = value.toString().split("\\n"); 
    if (line.length > 0) { 
     for(int i=0; i<line.length; i++) { 
      try { 
       JSONObject jsonobj  = new JSONObject(line[i]); 
        type = (String) jsonobj.get("type"); 
        format = (String) jsonobj.get("format"); 
        version = (String) jsonobj.get("version"); 
        id  = (String) jsonobj.get("id"); 
        start = (String) jsonobj.get("start"); 
        cp  = (String) jsonobj.get("cp"); 

       // Message Variable array 
       JSONArray messageArray = (JSONArray) jsonobj.get("message"); 
       for(int j=0; j<messageArray.length(); j++) { 
        JSONObject jsonmessageobject = messageArray.getJSONObject(j); 
        proto  = jsonmessageobject.getString("proto"); 
        protoVer = jsonmessageobject.getString("protoVer"); 
        cliIP  = jsonmessageobject.getString("cliIP"); 
        reqPort  = jsonmessageobject.getString("reqPort"); 
        reqHost  = jsonmessageobject.getString("reqHost"); 
        reqMethod = jsonmessageobject.getString("reqMethod"); 
        reqPath  = jsonmessageobject.getString("reqPath"); 
        reqQuery = jsonmessageobject.getString("reqQuery"); 
        reqCT  = jsonmessageobject.getString("reqCT"); 
        reqLen  = jsonmessageobject.getString("reqLen"); 
        sslVer  = jsonmessageobject.getString("sslVer"); 
        status  = jsonmessageobject.getString("status"); 
        redirURL = jsonmessageobject.getString("redirURL"); 
        respCT  = jsonmessageobject.getString("respCT"); 
        respLen  = jsonmessageobject.getString("respLen"); 
        bytes  = jsonmessageobject.getString("bytes"); 
        UA   = jsonmessageobject.getString("UA"); 
        fwdHost  = jsonmessageobject.getString("fwdHost"); 
       } 

       // reqHdr variable array 
       JSONArray reqHdrArray = (JSONArray) jsonobj.get("reqHdr"); 
       for(int k=0; k<reqHdrArray.length(); k++) { 
        JSONObject jsonreqHdrobject = reqHdrArray.getJSONObject(i); 
        accEnc  = jsonreqHdrobject.getString("accEnc"); 
        accLang  = jsonreqHdrobject.getString("accLang"); 
        auth  = jsonreqHdrobject.getString("auth"); 
        reqHdr_cacheCtl = jsonreqHdrobject.getString("cacheCtl"); 
        reqHdr_conn = jsonreqHdrobject.getString("conn"); 
        reqHdr_contMD5 = jsonreqHdrobject.getString("contMD5"); 
        cookie  = jsonreqHdrobject.getString("cookie"); 
        DNT   = jsonreqHdrobject.getString("DNT"); 
        expect  = jsonreqHdrobject.getString("expect"); 
        ifMatch  = jsonreqHdrobject.getString("ifMatch"); 
        ifMod  = jsonreqHdrobject.getString("ifMod"); 
        ifNone  = jsonreqHdrobject.getString("ifNone"); 
        ifRange  = jsonreqHdrobject.getString("ifRange"); 
        ifUnmod  = jsonreqHdrobject.getString("ifUnmod"); 
        range  = jsonreqHdrobject.getString("range"); 
        referer  = jsonreqHdrobject.getString("referer"); 
        te   = jsonreqHdrobject.getString("te"); 
        upgrade  = jsonreqHdrobject.getString("upgrade"); 
        reqHdr_via = jsonreqHdrobject.getString("via"); 
        xFrwdFor = jsonreqHdrobject.getString("xFrwdFor"); 
        xReqWith = jsonreqHdrobject.getString("xReqWith"); 
       } 
      context.write(new Text("cloud_monitor"), new Text(type + format + version + id + start + cp + proto + protoVer + cliIP + reqPort + 
        reqHost + reqMethod + reqPath + reqQuery + reqCT + reqLen + sslVer + status + redirURL + respCT + respLen + bytes + UA + fwdHost + accEnc + accLang + auth + 
        reqHdr_cacheCtl + reqHdr_conn + reqHdr_contMD5 + cookie + DNT + expect + ifMatch + ifMod + ifNone + ifRange + ifUnmod + range + referer + te + 
        upgrade + reqHdr_via + xFrwdFor + xReqWith)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
} 

我收到以下錯誤消息:

Error: java.lang.ClassNotFoundException: org.json.JSONException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.Class.forName(Class.java:270) 
    at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2138) 
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2103) 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2197) 
    at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:196) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:745) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

任何人都可以告訴我我f我正在正確地執行JSON解析,特別是JSON數組(消息,reqHdr)部分或我如何修復該錯誤?

+1

你有一個'ClassNotFoundException'這意味着你必須依賴的問題,你的代碼嘗試運行,但無法找到這個類。你有幾個選項,通常在hadoop中你應該創建一個將所有依賴編譯成一個jar的胖jar。你需要這樣的東西:https://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/ –

+0

@BinaryNerd我明白你在說什麼,但我的項目只有一個罐子與Json和我有關:https://mvnrepository.com/artifact/org.json/json 這些包:org.json.JSONArray; org.json.JSONException; org.json.JSONObject;在java程序中需要的引用不會導致任何版本不匹配。我不明白當我從下載的Jar獲得所有選項時,創建一個Fat jar需要什麼。 – Sidhartha

+0

你有一個運行時錯誤,該jar在編譯時在你的環境中可用,因此你的導入工作等等。當你嘗試在你的集羣上運行你的代碼時,問題是你的代碼如何訪問JSON庫你正在使用。如果jar不在類路徑中,那麼你不會得到'ClassNotFoundException'。編譯你的依賴到你的最終jar是一種解決這個問題的方法。 –

回答

0

您必須下載org.json遠程文件,然後將其添加到您的項目中。

您可以下載的jar:here

+0

我已經使用該鏈接的jar。 – Sidhartha

+0

我想你在你的代碼中寫了類似'import org.json.JSONObject;'的東西。但是,您是否下載了.jar,並將其添加到您的項目庫? – Asew

+0

是的,我做到了。但正如另一方面@Binarynerd所說的那樣,進口不會在運行時顯示出來。 – Sidhartha