복붙노트

[HADOOP] Hadoop Map / Reduce에서 여러 맵퍼에 대해 맵 사이드 조인 구성

HADOOP

Hadoop Map / Reduce에서 여러 맵퍼에 대해 맵 사이드 조인 구성

Hadoop의 여러 맵퍼에 대해 Map / Side 내부 조인을 구성하는 것에 대한 질문이 있습니다. 두 개의 매우 큰 데이터 세트 A와 B가 있다고 가정하고, 동일한 파티션과 정렬 알고리즘을 사용하여 더 작은 부분으로 분할합니다. A의 경우 a (1) ~ a (10), B의 경우 b (1) ~ b (10)가 있다고 가정합니다. a (1)과 b (1)에는 동일한 키가 포함되고 a (2)와 b (2)에는 동일한 키가있는 등의 보증이 있습니다. 10 매퍼, 특히 매퍼 (1) ~ 매퍼 (10)를 설정하고 싶습니다. 내 이해를 위해 맵 / 사이드 조인은 매퍼 (mapper) 이전의 전처리 작업이므로 mapper (1)에 대해 (1) 및 b (1)을 결합하고 a (2) 및 b 2) 매퍼 (2), 등등.

참고 자료를 읽은 후에도이 10 개의 매퍼를 구성하는 방법은 아직 명확하지 않습니다. CompositeInputFormat을 사용하면 두 개의 파일을 결합 할 수 있지만 하나의 매퍼를 구성하고 쌍을 이루는 20 개의 파일 쌍 (10 개의 순차적 태스크) 만 결합하는 것 같습니다. 이 10 개의 맵퍼를 모두 구성하고 동시에 10 개의 쌍을 실제 Map / Reduce (병렬 작업 10 개)로 결합하는 방법은 무엇입니까? 내 이해를 돕기 위해 10 개의 매퍼에는 결합 할 파일이 모두 다르기 때문에 10 개의 CompositeInputFormat 설정이 필요합니다. 나는 이것이 실용적이고 행할 수 있다고 강력하게 믿는다. 그러나 나는 정확한 명령이 무엇을 사용해야 하는지를 알 수 없었다.

모든 힌트와 제안은 매우 환영받으며 감사하게 생각합니다.

답장 데이비드와 토마스에게 감사드립니다.

지도 측 가입에 대한 사전 요구 사항에 대해 강조해 주셔서 감사합니다. 예, 나는 API, 정렬에 대해 알고 있습니다. 귀하의 의견을 읽은 후, 내 실제 문제는 CompositeInputFormat의 두 파일을 여러 번 결합하는 올바른 표현이라고 생각합니다. 예를 들어, dataA 및 dataB는 각각 2 개의 파일로 정렬 및 축소됩니다.

/ A / 데이터 R-00000

/ A / 데이터 R-00001

/ B / dataB-r-00000

/ B / dataB-r-00001

지금 사용하고있는 표현식은 다음과 같습니다.

내부 (tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, "/ A / dataA-r-00000"), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, "/ B / dataB-r-00000"))

그것은 작동하지만 당신이 언급 한 바와 같이, 그것은 내부 조인이 분할을 방지하기 때문에 2 개의 매퍼를 시작하고 파일이 클 경우 매우 비효율적 일 수 있습니다. 더 많은 mappers (dataA-r-00001 및 dataB-r-00001을 결합하는 또 다른 2 개의 mappers)를 사용하려는 경우 표현식을 어떻게 구성해야할까요?

String / "/ B / dataB-r-0000", tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat) (B / dataB-r-00001 '), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat,'/ A / dataA-r-00001 ' )) ";

하지만 위의 명령은 실제로 네 개의 파일을 내부 조인 (파일 * r-00000과 * r-00001이 중복되지 않는 키를 가지고 있기 때문에 아무런 결과도 얻지 못할 것입니다) 때문에 실수라고 생각합니다.

또는 다음과 같이 두 개의 dir을 입력으로 사용할 수 있습니다.

String joinexpression = "내부 (tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ A /'), tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ B /'))";

내부 조인은 파일 끝 (예 : "00000"- "00000", "00001"- "00001")에 따라 자동으로 쌍을 일치시킵니다. 내가 표현을 구성하고 전달해야하기 때문에 나는이 시점에 갇혀있다.

conf.set ( "mapred.join.expr", joineexpression);

한 마디로, 더 많은 매퍼를 사용하여 여러 파일 쌍을 동시에 조인하려면 적절한 표현식을 어떻게 작성해야합니까?

해결법

  1. ==============================

    1.지도 및 축소 측면 조인이 있습니다. 맵 사이드 조인을 사용하라는 제안을했는데, 맵 조인은 매퍼 내에서 실행되며 이전에는 수행되지 않습니다. 양쪽에는 동일한 키와 값 유형이 있어야합니다. LongWritable과 텍스트는 같은 값을 가질지라도 연결할 수 없습니다.

    지도 및 축소 측면 조인이 있습니다. 맵 사이드 조인을 사용하라는 제안을했는데, 맵 조인은 매퍼 내에서 실행되며 이전에는 수행되지 않습니다. 양쪽에는 동일한 키와 값 유형이 있어야합니다. LongWritable과 텍스트는 같은 값을 가질지라도 연결할 수 없습니다.

    주의해야 할 것이 더 미묘합니다.

    전체 프로시 저는 기본적으로 다음과 같이 작동합니다. 데이터 세트 A와 데이터 세트 B가 있고 둘 모두 동일한 키를 공유합니다. LongWritable을 가정 해 봅시다.

    조인 할 파일 수가 같지 않으면 작업을 설정하는 동안 예외가 발생합니다.

    조인을 설정하는 것은 고통 스럽습니다. 주로 버전이 0.21.x 미만인 경우 매퍼 및 감속기에 이전 API를 사용해야하기 때문입니다.

    이 문서는 어떻게 작동하는지 잘 설명합니다. 안타깝게도이 문서는 최신 Hadoop 문서에서 사라져 버렸습니다.

    또 다른 좋은 참고 자료는 "Hadoop the Definitive Guide"입니다. 자세한 내용과 예제를 모두 설명합니다.

  2. ==============================

    2.너가 그 요점을 놓치고 있다고 생각해. 매퍼의 수는 제어하지 않습니다. 그것은 당신이 통제 할 수있는 감속기의 수입니다. 매퍼에서 올바른 키를 내 보내면됩니다. 그런 다음 10 개의 감속기를 실행하십시오.

    너가 그 요점을 놓치고 있다고 생각해. 매퍼의 수는 제어하지 않습니다. 그것은 당신이 통제 할 수있는 감속기의 수입니다. 매퍼에서 올바른 키를 내 보내면됩니다. 그런 다음 10 개의 감속기를 실행하십시오.

  3. from https://stackoverflow.com/questions/6323544/configure-map-side-join-for-multiple-mappers-in-hadoop-map-reduce by cc-by-sa and MIT license