복붙노트

[HADOOP] Hadoop HDFS MapReduce 출력을 MongoDb로

HADOOP

Hadoop HDFS MapReduce 출력을 MongoDb로

HDFS에서 입력을 읽고 MapReduce를 사용하여 처리하고 MongoDb에 출력을 쓰는 Java 프로그램을 작성하고 싶습니다.

시나리오는 다음과 같습니다.

실제로 HDFS에서 읽고 MapReduce로 처리하는 것은 간단합니다. 그러나 결과를 MongoDb에 쓰는 것에 갇히게됩니다. MongoDB에 결과를 쓰는 데 지원되는 Java API가 있습니까? 또 다른 질문은 Hadoop 클러스터이기 때문에 어떤 데이터 노드가 Reducer 작업을 실행하고 결과를 생성하는지 알지 못한다는 것입니다. 결과를 특정 서버에 설치된 MongoDb에 쓸 수 있습니까?

결과를 HDFS에 쓰려면 코드는 다음과 같습니다.

@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException 
{
    long sum = 0;
    for (LongWritable value : values) 
    {
        sum += value.get();
    }

    context.write(new Text(key), new LongWritable(sum));
}

이제 HDFS 대신 MongoDb에 결과를 쓰고 싶습니다. 어떻게해야합니까?

해결법

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

    1.«MongoDB Connector for Hadoop»이 필요합니다. 예.

    «MongoDB Connector for Hadoop»이 필요합니다. 예.

    부작용으로 데이터베이스에 데이터를 삽입하는 코드를 Reducer에 추가하는 것이 유혹적입니다. 이 유혹을 피하십시오. 리듀서 클래스의 부작용으로 데이터를 삽입하는 대신 커넥터를 사용해야하는 한 가지 이유는 추론 적 실행입니다. Hadoop은 때때로 정확히 동일한 리 듀스 작업 중 두 개를 병렬로 실행할 수 있으므로 외부 삽입 및 중복 데이터가 발생할 수 있습니다.

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

    2.예. 평소와 같이 몽고에 편지를 쓰십시오. mongo db가 샤드에서 실행되도록 설정되어 있다는 사실은 숨겨져있는 세부 사항입니다.

    예. 평소와 같이 몽고에 편지를 쓰십시오. mongo db가 샤드에서 실행되도록 설정되어 있다는 사실은 숨겨져있는 세부 사항입니다.

  3. ==============================

    3.나는 같은 시나리오를 구현하기 위해 아침을 보냈다. 여기 내 해결책 :

    나는 같은 시나리오를 구현하기 위해 아침을 보냈다. 여기 내 해결책 :

    세 개의 클래스를 만듭니다.

    클러스터에서 실험 클래스를 실행할 때 두 개의 매개 변수를 입력합니다. 첫 번째 매개 변수는 HDFS 위치의 입력 소스이고 두 번째 매개 변수는 결과를 유지하는 mongodb URI를 나타냅니다. 다음은 호출 예입니다. Experiment.java가 패키지 이름 org.example 아래에 있다고 가정하십시오.

    sudo -u hdfs hadoop jar ~/jar/myexample.jar org.example.Experiment myfilesinhdfs/* mongodb://192.168.0.1:27017/mydbName.myCollectionName
    

    이것은 최선의 방법은 아니지만 나를 위해 일합니다.

  4. from https://stackoverflow.com/questions/19499447/hadoop-hdfs-mapreduce-output-into-mongodb by cc-by-sa and MIT license