2013-05-07 26 views
2

我想在Hadoop中处理〜300 GB的JSON文件。据我了解,JSON由嵌入数据的单个字符串组成。现在,如果我想使用Google的GSON解析JSON字符串,那么Hadoop不会将整个负载放在单个节点上,因为JSON在逻辑上不能被整除。在Hadoop中分布式处理JSON

如果我想让它在不同的节点上并行处理,我该如何对文件进行分区(我可以划分逻辑上查看数据的分区)。在我将它加载到HDFS本身之前,我是否必须破解该文件?是否至少有一次机器(或节点)解析JSON是绝对必要的?

+0

看看http://stackoverflow.com/questions/9942483/hadoop-for-json-files中的答案。 dzone文章提供了有关在Hadoop中处理XML和JSON的深入见解。 – harpun 2013-05-07 21:28:31

回答

0

如果您可以在逻辑上将您的巨型JSON划分为多个部分,请执行此操作,并将这些部分保存为单独的文件行(或序列文件中的记录)。然后,如果您将这个新文件提供给Hadoop MapReduce,映射程序将能够并行处理记录。

所以,是的,JSON应该由一台机器解析至少一次。这个预处理阶段不需要在Hadoop中执行,简单的脚本就可以完成这项工作。使用流API来避免将大量数据加载到内存中。

+0

但处理〜300 GB的文件需要大量资源。你能详细说明流式API部分吗? – aa8y 2013-05-07 13:00:52

+0

JSON流式API与XML相似。您只需通过令牌读取整个文件令牌,目前只需要记忆小部分令牌。具体的用例很大程度上取决于你的数据结构。对于Jackson Streaming API示例,请参阅http://wiki.fasterxml.com/JacksonStreamingApi,http://prithvi-java.blogspot.ru/2012/08/jackson-json-streaming-api.html,http:// stackoverflow。 com/questions/12713990/how-to-parse-json-log-file-with-streaming-api-in-java-then-output-tabulated-log,http://blog.avisi.nl/2012/11/ 29/jackson-and-parsing-streams-a-short-story-about-a-big-pile-o-json/ – Dmitry 2013-05-07 14:08:12

1

假设你知道可以逻辑上将JSON解析为逻辑单独的组件,那么你可以通过编写自己的InputFormat来完成此操作。

从概念上讲,您可以将每个逻辑上可分割的JSON组件视为一个“行”数据。每个组件都包含可以独立处理的最少量信息。

然后,您将需要创建一个类FileInputFormat,您将不得不返回每个这些JSON组件。

public class JSONInputFormat extends FileInputFormat<Text,JSONComponent {...} 
+0

这似乎是一个不错的选择,即使在逻辑上可以被整除之后,前几行对于所有人我可以将JSON分成的子部分。我以前写过自己的'FileInputFormat',但我不确定是否可以按照每个部分保留前几行的方式读取文件。 – aa8y 2013-05-07 13:13:35

+0

一个想法,如果只有几个常用变量,也许可以读取这些第一行,并使用分布式缓存将它们分发到所有InputFormat。另一个想法是,您可以将这些“标题”部分完全保留在单独的文件中,并在读入JSON部分后将这些JSON节点合并回来 – greedybuddha 2013-05-07 13:29:10

0

您可能会感兴趣这个JSON SerDe有用。它允许配置单元以JSON格式进行读写。如果它适合你,那么使用Hive处理JSON数据会更加方便,因为您不必担心要读取JSON数据并为您创建分割的自定义InputFormat。