복붙노트

[HADOOP] hadoop 셔플 / 정렬 단계에서 수치로 정렬하는 방법?

HADOOP

hadoop 셔플 / 정렬 단계에서 수치로 정렬하는 방법?

데이터는 다음과 같습니다. 첫 번째 필드는 숫자이며,

3 ...
1 ...
2 ...
11 ...

그리고 나는 알파벳 순으로 대신에 첫 번째 필드에 따라이 선들을 정렬하고 싶습니다. 정렬 후에는 다음과 같이 보일 것입니다.

1 ...
2 ...
3 ...
11 ...

그러나 hadoop은 나에게 이것을 계속주고,

1 ...
11 ...
2 ...
3 ...

어떻게 수정합니까?

해결법

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

    1.Hadoop Streaming을 사용한다고 가정하면 KeyFieldBasedComparator 클래스를 사용해야합니다.

    Hadoop Streaming을 사용한다고 가정하면 KeyFieldBasedComparator 클래스를 사용해야합니다.

    예 :

    다음 코드를 사용하여 ID 매퍼 및 감속기 만들기

    이것은 mapper.py & reducer.py입니다.

    #!/usr/bin/env python
    import sys
    for line in sys.stdin:    
        print "%s" % (line.strip())
    

    이것은 input.txt입니다.

    1
    11
    2
    20
    7
    3
    40
    

    이것은 스트리밍 명령입니다.

    $HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar 
    -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator 
    -D  mapred.text.key.comparator.options=-n 
    -input /user/input.txt 
    -output /user/output.txt 
    -file ~/mapper.py 
    -mapper ~/mapper.py 
    -file ~/reducer.py 
    -reducer ~/reducer.py
    

    그리고 필요한 출력을 얻을 것입니다.

    1   
    2   
    3   
    7   
    11  
    20  
    40
    

    노트 :

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

    2.Hadoop의 기본 비교자는 사용하는 Writable 유형 (보다 정확하게 WritableComparable)을 기반으로 키를 비교합니다. IntWritable 또는 LongWritable을 처리하는 경우 숫자로 정렬됩니다.

    Hadoop의 기본 비교자는 사용하는 Writable 유형 (보다 정확하게 WritableComparable)을 기반으로 키를 비교합니다. IntWritable 또는 LongWritable을 처리하는 경우 숫자로 정렬됩니다.

    귀하의 예제에서 텍스트를 사용하고 있다고 가정합니다. 따라서 자연 정렬 순서가 끝납니다.

    그러나 특수한 경우에는 직접 비교기를 작성할 수도 있습니다. 예 : 테스트 용도로만 텍스트 키의 정렬 순서를 변경하는 방법에 대한 간단한 샘플을 제공합니다.이 옵션을 정수로 처리하고 숫자 정렬 순서를 생성합니다.

    public class MyComparator extends WritableComparator {
    
            public MyComparator() {
                super(Text.class);
            }
    
            @Override
            public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
    
                try {
    
                    String v1 = Text.decode(b1, s1, l1);
                    String v2 = Text.decode(b2, s2, l2);
    
                    int v1Int = Integer.valueOf(v1.trim());
                    int v2Int = Integer.valueOf(v2.trim());
    
                    return (v1Int < v2Int) ? -1 : ((v1Int > v2Int) ? 1 : 0);
    
                }
                catch (IOException e) {
                    throw new IllegalArgumentException(e);
                }
            }
        }
    

    jobrunner 클래스 세트에서 다음을 수행하십시오.

    Job job = new Job();
    ...
    job.setSortComparatorClass(MyComparator.class);
    
  3. ==============================

    3.Hadoop (구성을 위해 -D 대신 -jobconf를 사용할 수 있음)을 사용하여 스트리밍하려면 키별로 정렬 할 수 있습니다.

    Hadoop (구성을 위해 -D 대신 -jobconf를 사용할 수 있음)을 사용하여 스트리밍하려면 키별로 정렬 할 수 있습니다.

    -jobconf stream.num.map.output.key.fields=2\
    -jobconf mapreduce.partition.keycomparator.options="-k2,2nr"\
    -jobconf mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator
    

    stream.num.map.output.key.fields에서 첫 번째와 두 번째 열은 키 1과 키 2입니다.

    mapreduce.partition.keycomparator.options = "- k2,2nr"은 두 번째 키 (두 번째 키부터 두 번째 키까지)를 숫자로 사용하여 역순으로 정렬하는 것을 의미합니다.

    그것은 거의 리눅스 정렬 명령과 비슷합니다!

  4. from https://stackoverflow.com/questions/13331722/how-to-sort-numerically-in-hadoops-shuffle-sort-phase by cc-by-sa and MIT license