2017-06-19 8 views
0

私はJSONファイルを読み込んでJSON入力から要素を抽出するMapReduce(マップ専用タスク)に取り組んでいます。入力データ: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配列(message、reqHdr)の部分、またはバグをどのように修正することができますか?

+1

あなたは、あなたのコードを実行しようとしますが、このクラスを見つけることができない依存関係の問題を、持っていることを意味 'ClassNotFoundException'を持っています。あなたはいくつかのオプションを持っています。通常、hadoopにはすべての依存関係を単一のjarファイルにコンパイルするfat jarファイルを作成する必要があります。次のようなものが必要です:https://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/ –

+0

@BinaryNerdあなたの言っていることを理解していますが、プロジェクトには1つのJarしかありません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