2017-06-19 74 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