簡介:
盡量在寫MapReduce程序處理日志時,需要解析JSON配置文件,簡化Java程序和處理邏輯。但是Hadoop本身似乎沒有內置對JSON文件的解析功能,我們不得不求助於第三方JSON工具包。這裡選擇json-simple實現我們的功能。
在Hadoop上執行Java程序的命令如下所示:
[hadoop@localhost]$ hadoop jar my-mapreduce.jar
my-mapreduce.jar是我們進行日志處理的MapReduce程序。現在假定我們需要在其中處理JSON格式的配置文件,這裡忽略如何在Hadoop集群讀取文件的細節,只關注如何使用JSON工具包。下面是簡單的HelloWorld程序:
import org.json.simple.JSONObject;
public class HelloWorld{
public static void main(String[] args){
JSONObject obj=new JSONObject();
obj.put("name","foo");
obj.put("num",new Integer(100));
obj.put("balance",new Double(1000.21));
obj.put("is_vip",new Boolean(true));
obj.put("nickname",null);
System.out.print(obj);
}
}
在HelloWorld程序中,只簡單修改JSON對象,將其內容打印輸出,從而驗證解析修改JSON內容的過程。
編譯:
由於MapReduce程序需提交到Hadoop集群執行,所以HelloWorld依賴的json-simple包必須存在於集群的classpath路徑中,如果集群上沒有對應的jar包。執行HelloWorld會出現如下異常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/JSONObject
簡單的解決方法是將json-simple包直接和HelloWorld編譯結果一起打包,然後即可使用命令hadoop jar HelloWorld.jar執行。需將json-simple的jar包解壓再同HelloWorld打包。
編譯命令如下所示:
[hadoop@localhost]$ jar tf json-simple-1.1.1.jar
META-INF/MANIFEST.MF
META-INF/
META-INF/maven/
META-INF/maven/com.googlecode.json-simple/
META-INF/maven/com.googlecode.json-simple/json-simple/
META-INF/maven/com.googlecode.json-simple/json-simple/pom.properties
META-INF/maven/com.googlecode.json-simple/json-simple/pom.xml
org/
org/json/
org/json/simple/
org/json/simple/ItemList.class
org/json/simple/JSONArray.class
org/json/simple/JSONAware.class
org/json/simple/JSONObject.class
org/json/simple/JSONStreamAware.class
org/json/simple/JSONValue.class
org/json/simple/parser/
org/json/simple/parser/ContainerFactory.class
org/json/simple/parser/ContentHandler.class
org/json/simple/parser/JSONParser.class
org/json/simple/parser/ParseException.class
org/json/simple/parser/Yylex.class
org/json/simple/parser/Yytoken.class
[hadoop@localhost]$ unzip json-simple-1.1.1.jar
[hadoop@localhost]$ javac -classpath ./json-simple-1.1.1.jar HelloWorld.java
[hadoop@localhost]$ jar -cfe HelloWorld.jar HelloWorld HelloWorld.class ./org/
執行HelloWorld
[hadoop@localhost]$ hadoop jar HelloWorld.jar
{"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}