[Hadoop 기초 튜 토리 얼] 6. Hadoop 의 단일 표 관련 조회

이 블 로 그 는 파일 에 있 는 child 필드 와 parent 필드 를 입력 하여 단일 표 와 관련 된 조 회 를 통 해 어떤 사용자 가 child 와 grandparent 관 계 를 가지 고 있 는 지 유도 합 니 다.
개발 환경
하드웨어 환경: Centos 6.5 서버 4 대 (1 대 는 Master 노드, 3 대 는 Slave 노드) 소프트웨어 환경: Java 1.7.045、hadoop-1.2.1
1. 입력 데이터 분석
파일 데이터 예제 입력:
child parent
Tom Jack 
Jack Alice
Jack Jesse

1 열 은 child 를 나타 내 고, 2 열 은 parent 를 나타 내 며, 우 리 는 child 와 parent 의 관계 에 따라 child 와 grantparent 의 관 계 를 얻어 야 한다.예 를 들 어 Tom 의 parent 는 Jack 이 고 Jack 의 parent 는 Alice 와 Jesse 이다. 이로써 Tom 의 grantparent 는 {Alice, Jesse} 임 을 알 수 있다.
2. 지도 과정
먼저 기본 TextInputFormat 클래스 를 사용 하여 입력 파일 을 처리 하고 텍스트 의 줄 마다 편 이 량 과 내용 을 얻 습 니 다.Map 과정 에서 먼저 입력 을 child 와 parent 로 나 눈 다음 에 한 번 오른쪽 표 로 출력 하고 한 번 은 왼쪽 표 로 출력 합 니 다. 주의해 야 할 것 은 출력 된 value 에 좌우 표 차이 표 지 를 추가 해 야 합 니 다. 그 중에서 왼쪽 표 식별 자 는 1 이 고 오른쪽 표 식별 자 는 2 입 니 다. 그림 과 같 습 니 다.
맵 의 핵심 코드 는 다음 과 같 습 니 다. 상세 한 소스 코드 는 다음 과 같 습 니 다. SingletonTableJoin \ src \ com \ zonesion \ \ tablejoin \ SingletonTableJoin. java.
@Override
protected void map(Object key, Text value, Context context)
        throws IOException, InterruptedException {
    String childName = new String();
    String parentName = new String();
    String relationType = new String();
    String line = value.toString();
    String[] values = line.split(" ");
    if(values.length >= 2){
        if(values[0].compareTo("child") != 0){
            childName = values[0];
            parentName = values[1];
            relationType = "1";
            context.write(new Text(parentName), new Text(relationType+" "+childName));//<"Lucy","1 Tom">
            relationType = "2";
            context.write(new Text(childName), new Text(relationType+" "+parentName));//<"Jone","2 Lucy">
        }
    }
}

3. 감소 과정
Reduce 과정 은 먼저 'key, values' 즉' Lucy ',' 1 Tom ',' 2 Mary ',' 2 Ben '을 입력 한 values 값 을 옮 겨 다 니 며 단원 정보 (예 를 들 어' 1 Tom ') 를 얻 은 다음 단원 정보 에 있 는 사용자 ID (예 를 들 어 Tom) 를 왼쪽 표, 오른쪽 표 식별 자 에 따라 각각 grand Child 집합 과 grandParent 집합 에 저장 합 니 다.마지막 으로 grand Child 집합 과 grand Parent 집합 에 대해 피리 칼 적 연산 을 하여 child 와 grand Parent 의 관 계 를 얻어 출력 한다. 그림 과 같다.
Reduce 엔 드 핵심 코드 는 다음 과 같 습 니 다. 상세 한 소스 코드 는 다음 과 같 습 니 다. SingletonTableJoin \ src \ com \ zonesion \ \ tablejoin \ SingletonTableJoin. java.
public static class JoinReducer extends Reducer<Text, Text, Text, Text>{

    @Override
    protected void reduce(Text key, Iterable<Text> values,Context context)
            throws IOException, InterruptedException {
        List<String> grandChild = new ArrayList<String>();//  
        List<String> grandParent = new ArrayList<String>();//  
        Iterator<Text> it = values.iterator();//["1 Tom","2 Mary","2 Ben"]
        while(it.hasNext()){
            String[] record = it.next().toString().split(" ");//"1 Tom"---[1,Tom]
            if(record.length == 0) continue;
            if(record[0].equals("1")){//  ,  child  grandchild
                grandChild.add(record[1]);
            }else if(record[0].equals("2")){//  ,  parent  grandParent
                grandParent.add(record[1]);
            }
        }
        //grandchild   grandparent       
        if(grandChild.size() != 0 && grandParent.size() != 0){
            for(int i=0;i<grandChild.size();i++){
                for(int j=0;j<grandParent.size();j++){
                    context.write(new Text(grandChild.get(i)), new Text(grandParent.get(j)));
                }
            }
        }
    }
}

4. 구동 실현
구동 실현 핵심 코드 는 다음 과 같 습 니 다. 상세 한 소스 코드 는 다음 과 같 습 니 다. SingletonTableJoin \ src \ com \ zonesion \ \ tablejoin \ SingletonTableJoin. java.
public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length != 2){
            System.err.println("Usage: SingletonTableJoin <in> <out>");
        }
        Job job = new Job(conf,"SingletonTableJoin Job");
        job.setJarByClass(SingletonTableJoin.class);
        job.setMapperClass(JoinMapper.class);
        job.setReducerClass(JoinReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : -1);
    }

5. 배치 운영
1) Hadoop 클 러 스 터 시작
[hadoop@K-Master ~]$ start-dfs.sh
[hadoop@K-Master ~]$ start-mapred.sh
[hadoop@K-Master ~]$ jps
5283 SecondaryNameNode
5445 JobTracker
5578 Jps
5109 NameNode

2) 배포 소스 코드
#      
[hadoop@K-Master ~]$ mkdir -p /usr/hadoop/workspace/MapReduce
#    
 SingletonTableJoin       /usr/hadoop/workspace/MapReduce/    ;

... 싱글 톤 태 블 릿 조 인 트 를 직접 다운로드 할 수 있 습 니 다.
3) 컴 파일 파일 파일
#      
[hadoop@K-Master ~]$ cd /usr/hadoop/workspace/MapReduce/SingletonTableJoin
#    
[hadoop@K-Master SingletonTableJoin]$ javac -classpath /usr/hadoop/hadoop-core-1.2.1.jar:/usr/hadoop/lib/commons-cli-1.2.jar -d bin src/com/zonesion/tablejoin/SingletonTableJoin.java
#      
[hadoop@K-Master SingletonTableJoin]$ ls -la bin/com/zonesion/tablejoin/
    12
drwxrwxr-x 2 hadoop hadoop  122 7   31 11:02 .
drwxrwxr-x 3 hadoop hadoop   22 7   31 11:02 ..
-rw-rw-r-- 1 hadoop hadoop 1856 7   31 11:02 SingletonTableJoin.class
-rw-rw-r-- 1 hadoop hadoop 2047 7   31 11:02 SingletonTableJoin$JoinMapper.class
-rw-rw-r-- 1 hadoop hadoop 2074 7   31 11:02 SingletonTableJoin$JoinReducer.class

4) jar 파일 포장
[hadoop@K-Master SingletonTableJoin]$ jar -cvf SingletonTableJoin.jar -C bin/ .
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/zonesion/(in = 0) (out= 0)(stored 0%)
adding: com/zonesion/tablejoin/(in = 0) (out= 0)(stored 0%)
adding: com/zonesion/tablejoin/SingletonTableJoin$JoinReducer.class(in = 2217) (out= 1006)(deflated 54%)
adding: com/zonesion/tablejoin/SingletonTableJoin$JoinMapper.class(in = 1946) (out= 823)(deflated 57%)
adding: com/zonesion/tablejoin/SingletonTableJoin.class(in = 1856) (out= 955)(deflated 48%)

5) 입력 파일 업로드
[hadoop@K-Master SingletonTableJoin]$ hadoop fs -mkdir /user/hadoop/SingletonTableJoin/input/
[hadoop@K-Master SingletonTableJoin]$ hadoop fs -put input/file01.txt  /user/hadoop/SingletonTableJoin/input/
[hadoop@K-Master SingletonTableJoin]$ hadoop fs -ls /user/hadoop/SingletonTableJoin/input/ 
Found 1 items
-rw-r--r--   1 hadoop supergroup163 2014-07-31 11:08 /user/hadoop/SingletonTableJoin/input/file01.txt

6) Jar 파일 실행
[hadoop@K-Master SingletonTableJoin]$ hadoop jar SingletonTableJoin.jar com.zonesion.tablejoin.SingletonTableJoin SingletonTableJoin/input SingletonTableJoin/output

14/07/31 14:47:55 INFO input.FileInputFormat: Total input paths to process : 1
14/07/31 14:47:55 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/07/31 14:47:55 WARN snappy.LoadSnappy: Snappy native library not loaded
14/07/31 14:47:56 INFO mapred.JobClient: Running job: job_201407310921_0012
14/07/31 14:47:57 INFO mapred.JobClient:  map 0% reduce 0%
14/07/31 14:48:00 INFO mapred.JobClient:  map 100% reduce 0%
14/07/31 14:48:07 INFO mapred.JobClient:  map 100% reduce 33%
14/07/31 14:48:08 INFO mapred.JobClient:  map 100% reduce 100%
14/07/31 14:48:08 INFO mapred.JobClient: Job complete: job_201407310921_0012
.....

특히 주의: 주 클래스 를 지정 할 때 는 전체 패키지 이름 인 com. zonesion. tablejoin. singletonTableJoin 을 사용 해 야 합 니 다. 그렇지 않 으 면 힌트 를 찾 을 수 없습니다.
7) 출력 결과 보기
[hadoop@K-Master SingletonTableJoin]$ hadoop fs -cat SingletonTableJoin/output/part-r-00000
Tom     Alice
Tom     Jesse
Jone    Alice
Jone    Jesse
Tom     Mary
Tom     Ben
Jone    Mary
Jone    Ben
Philip  Alice
Philip  Jesse
Mark    Alice
Mark    Jesse

이 가능 하 다, ~ 할 수 있다,...
[Hadoop 기초 튜 토리 얼] 5. Hadoop 의 단어 계수 [Hadoop 기초 튜 토리 얼] 6. Hadoop 의 단일 표 관련 조회 [Hadoop 기초 튜 토리 얼] 7. Hadoop 중 하나 가 다 중 관련 조회 [Hadoop 기초 튜 토리 얼] 8. Hadoop 중 하나 가 다 중 관련 조회 [Hadoop 기초 튜 토리 얼] 9. Hadoop 의 후진 색인

좋은 웹페이지 즐겨찾기