如何在Hadoop的MapReduce程序中处理JSON文件

简介:

最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑。但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包。这里选择json-simple实现我们的功能。

在Hadoop上执行Java程序的命令如下所示:

[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [hadoop@localhost]$ hadoop jar my-mapreduce.jar  

my-mapreduce.jar是我们进行日志处理的MapReduce程序。现在假定我们需要在其中处理JSON格式的配置文件,这里忽略如何在Hadoop集群读取文件的细节,只关注如何使用JSON工具包。下面是简单的HelloWorld程序:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. import org.json.simple.JSONObject;  
  2. public class HelloWorld{  
  3.     public static void main(String[] args){  
  4.         JSONObject obj=new JSONObject();  
  5.         obj.put("name","foo");  
  6.         obj.put("num",new Integer(100));  
  7.         obj.put("balance",new Double(1000.21));  
  8.         obj.put("is_vip",new Boolean(true));  
  9.         obj.put("nickname",null);  
  10.         System.out.print(obj);  
  11.     }  
  12. }  

在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打包。

编译命令如下所示:
[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [hadoop@localhost]$ jar tf json-simple-1.1.1.jar  
  2. META-INF/MANIFEST.MF  
  3. META-INF/  
  4. META-INF/maven/  
  5. META-INF/maven/com.googlecode.json-simple/  
  6. META-INF/maven/com.googlecode.json-simple/json-simple/  
  7. META-INF/maven/com.googlecode.json-simple/json-simple/pom.properties  
  8. META-INF/maven/com.googlecode.json-simple/json-simple/pom.xml  
  9. org/  
  10. org/json/  
  11. org/json/simple/  
  12. org/json/simple/ItemList.class  
  13. org/json/simple/JSONArray.class  
  14. org/json/simple/JSONAware.class  
  15. org/json/simple/JSONObject.class  
  16. org/json/simple/JSONStreamAware.class  
  17. org/json/simple/JSONValue.class  
  18. org/json/simple/parser/  
  19. org/json/simple/parser/ContainerFactory.class  
  20. org/json/simple/parser/ContentHandler.class  
  21. org/json/simple/parser/JSONParser.class  
  22. org/json/simple/parser/ParseException.class  
  23. org/json/simple/parser/Yylex.class  
  24. org/json/simple/parser/Yytoken.class  
  25.   
  26. [hadoop@localhost]$ unzip json-simple-1.1.1.jar  
  27. [hadoop@localhost]$ javac -classpath ./json-simple-1.1.1.jar HelloWorld.java  
  28. [hadoop@localhost]$ jar -cfe HelloWorld.jar HelloWorld  HelloWorld.class ./org/  

执行HelloWorld

[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [hadoop@localhost]$ hadoop jar HelloWorld.jar  
  2. {"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 致谢 关于本书 第1 部分 背景和基本原理 1 跳跃Hadoop 1.1 什么是Hadoop 1.1.1 Hadoop 的核心组件 1.1.2 Hadoop 生态圈 1.1.3 物理架构 1.1.4 谁在使用Hadoop 1.1.5 Hadoop 的局限性 1.2 运行Hadoop 1.2.1 下载并安装Hadoop 1.2.2 Hadoop 的配置 1.2.3 CLI 基本命令 1.2.4 运行MapReduce 作业 1.3 本章小结 第2 部分 数据逻辑. 2 将数据导入导出Hadoop. 2.1 导入导出的关键要素 2.2 将数据导入Hadoop . 2.2.1 将日志文件导入Hadoop 技术点1 使用Flume 将系统日志文件导入HDFS 2.2.2 导入导出半结构化和二进制文件 技术点2 自动复制文件到HDFS 的机制 技术点3 使用Oozie 定期执行数据导入活动 2.2.3 从数据库拉数据 技术点4 使用MapReduce 将数据导入数据库 技术点5 使用Sqoop 从MySQL 导入数据 2.2.4 HBase 技术点6 HBase 导入HDFS 技术点7 将HBase 作为MapReduce 的数据源 2.3 将数据导出Hadoop 2.3.1 将数据导入本地文件系统 技术点8 自动复制HDFS 文件 2.3.2 数据库 技术点9 使用Sqoop 将数据导入MySQL 2.3.3 Hbase 技术点10 将数据从HDFS 导入HBase 技术点11 使用HBase 作为MapReduce 的数据接收器 2.4 本章小结 3 数据序列化――处理文本文件及其他格式的文件 3.1 了解MapReduce 的输入和输出 3.1.1 数据输入 3.1.2 数据输出 3.2 处理常见的序列化格式 3.2.1 XML . 技术点12 MapReduce 和XML 3.2.2 JSON . 技术点13 MapReduceJSON . 3.3 大数据的序列化格式 3.3.1 比较SequenceFiles、Protocol Buffers、Thrift 和 Avro 3.3.2 Sequence File 技术点14 处理SequenceFile 3.3.3 Protocol Buffers 技术点15 整合Protocol Buffers 和MapReduce . 3.3.4 Thrift . 技术点16 使用Thrift 3.3.5 Avro 技术点17 MapReduce 的下一代数据序列化技术 3.4 自定义文件格式 3.4.1 输入输出格式 技术点18 输入和输出格式为CSV 的文件 3.4.2 output committing 的重要性 3.5 本章小结 第3 部分 大数据模式 4 处理大数据的MapReduce 模式 4.1 Join 4.1.1 Repartition Join 技术点19 优化repartition join 4.1.2 Replicated Join 4.1.3 Semi-join 技术点20 实现semi-join 4.1.4 为你的数据挑选最优的合并策略 4.2 排序 4.2.1 二次排序 技术点21 二次排序的实现 4.2.2 整体并行排序 技术点22 通过多个reducer 对key 进行排序 4.3 抽样 技术点23 蓄水池抽样(reservoir 抽样) 4.4 本章小结 5 优化HDFS 处理大数据的技术 5.1 处理文件 技术点24 使用Avro 存储大量小文件 5.2 通过压缩提高数据存储效率 技术点25 选择合适的压缩解码器 技术点26 在HDFS、MapReduce、Pig 和Hive 使用数据压缩 技术点27 在MapReduce、Hive 和Pig 处理可分割的LZOP 5.3 本章小结 6 诊断和优化性能问题 6.1 衡量MapReduce 和你的环境 6.1.1 提取作业统计信息的工具 6.1.2 监控 6.2 确定性能问题的原因 6.2.1 了解哪些因素会影响MapReduce 作业的性能 6.2.2 map 端异常 技术点28 发现输入数据的坑 技术点29 确定map 端数据倾斜问题 技术点30 判定map 任务吞吐量 技术点31 小文件 技术点32 不可切割的文件 6.2.3 reduce 端问题 技术点33 reducer 任务数过大或过小 . 技术点34 定位reduce 端数据倾斜问题 技术点35 确定reduce 任务是否存在整体吞吐量过低 技术点36 缓慢的洗牌(shuffle)和排序 . 6.2.4 任务的一般性能问题 技术点37 作业竞争和调度器限制 技术点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值