2013-05-07 2 views
2

Hadoop에서 ~ 300GB JSON 파일을 처리하려고합니다. JSON은 데이터가 포함 된 단일 문자열로 구성됩니다. 이제 Google의 GSON을 사용하여 JSON 문자열을 파싱하려면 Hadoop이 JSON이 논리적으로 나눌 수 없으므로 전체 노드를 단일 노드에 배치해야합니다.하둡의 JSON 분산 처리

다른 노드에서 병렬로 처리해야하는 경우 어떻게 파일을 분할합니까 (논리적으로 데이터를 볼 수있는 파티션을 만들 수 있습니까). 파일을 HDFS 자체에로드하기 전에 파일을 중단해야합니까? JSON은 한 번만 한 머신 (또는 노드)에서 파싱해야한다는 것이 절대적으로 필요한가요?

+0

http://stackoverflow.com/questions/9942483/hadoop-for-json-files에서 답변을 살펴보십시오. dzone 기사에서는 Hadoop의 XML 및 JSON 처리에 대한 통찰력을 제공합니다. – harpun

답변

0

거대한 JSON을 여러 부분으로 논리적으로 나눌 수 있다면이 부분을 파일 (또는 시퀀스 파일의 레코드)에 별도의 줄로 저장하십시오. 그런 다음이 새 파일을 Hadoop MapReduce에 공급하면 매퍼가 레코드를 병렬로 처리 할 수 ​​있습니다.

그래, JSON은 한 번 이상 한 컴퓨터에서 파싱해야합니다. 이 사전 처리 단계는 Hadoop에서 수행 할 필요가 없으며 간단한 스크립트로 작업을 수행 할 수 있습니다. 스트리밍 API를 사용하여 많은 양의 데이터를 메모리에로드하지 않도록하십시오.

+0

그러나 ~ 300GB 파일을 처리하려면 많은 리소스가 필요합니다. 스트리밍 API 부분을 자세히 설명해 주시겠습니까? – aa8y

+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/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

1

논리적으로 JSON을 논리적으로 분리 된 구성 요소로 구문 분석 할 수 있다고 가정하면 자신 만의 InputFormat을 작성하면됩니다.

논리적으로 나눌 수있는 각각의 JSON 구성 요소를 개념적으로 하나의 "데이터"라인으로 생각할 수 있습니다. 각 구성 요소에는 독립적으로 수행 할 수있는 최소한의 정보가 들어 있습니다.

그런 다음이 JSON 구성 요소 각각을 반환해야하는 FileInputFormat 클래스를 만들어야합니다.

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

이것은 좋은 선택처럼 보입니다. 논리적으로 나눌 수 있긴하지만 처음 몇 줄은 모두에게 공통적입니다. JSON을 나눌 수있는 하위 파트. 나는 전에 자신의'FileInputFormat'을 작성했지만 각 부분이 처음 몇 줄을 유지하는 방식으로 파일을 읽을 수 있는지 확신 할 수 없습니다. – aa8y

+0

하나의 공통 변수가있는 경우 첫 번째 행을 읽고 분산 캐시를 사용하여 모든 InputFormats에 분산시킬 수 있습니다. 또 다른 아이디어는 JSON 파트를 읽은 후 해당 "헤더"섹션을 별도의 파일에 보관하고 JSON 노드를 다시 병합 할 수 있다는 것입니다 – greedybuddha

0

JSON SerDe이 유용 할 것입니다. 하이브는 JSON 형식으로 읽고 쓸 수 있습니다. 그것이 효과가 있다면 JSON 데이터를 읽고 사용자를 위해 분할을 생성 할 사용자 정의 InputFormat에 대해 걱정할 필요가 없으므로 Hive를 사용하여 JSON 데이터를 처리하는 것이 훨씬 편리 할 것입니다.