2010-02-05 4 views
4

나는 Hadoop을 가지고 놀고 있으며 우분투에서 두 개의 노드 클러스터를 설정했다. WordCount 예제는 정상적으로 실행됩니다.Hadoop/MapReduce와 일치하는 라인 찾기

지금은 일부 로그 데이터를 분석하는 내 자신의 맵리 듀스 프로그램을 작성하고 싶습니다 :

이 형식 로그 께서 각 라인 (주된 이유를 간단보고 나는 데이터의 많음이있다)

<UUID> <Event> <Timestamp> 

여기서 event는 INIT, START, STOP, ERROR 및 기타 일 수 있습니다. 가장 관심있는 부분은 동일한 UUID에 대한 START 및 STOP 이벤트 사이의 경과 시간입니다.

예를 들어, 내 로그는 나의 현재, 선형 프로그램, 파일을 읽어 메모리 내 시작 이벤트를 기억이

35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584 
[...many other lines...] 
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777 

같은 항목을 포함하며이 발견되면 파일에 경과 시간을 기록 해당 종료 이벤트 (다른 ​​이벤트가있는 행은 현재 무시되고 ERROR 이벤트는 UUID를 무효화하므로 무시됩니다)

이 항목을 Hadoop/MapReduce 프로그램으로 이식하고 싶습니다. 하지만 항목 일치를 수행하는 방법을 잘 모르겠습니다. 파일 분할/토큰 화는 쉽습니다. 일치 항목을 찾는 것이 Reduce-Class가 될 것입니다. 그런데 어떻게 생겼을까요? MapReduce 작업에서 mathing 항목을 찾으려면 어떻게합니까?

제 주요 관심사는 Hadopo/MapReduce를 이해하는 것입니다. 돼지와 다른 Apache 프로그램에 대한 링크도 환영하지만, 순수한 Hadoop/MapReduce로이 문제를 해결하고 싶습니다. 고맙습니다. 로그가 실행중인 응용 프로그램에서 수행되기 때문에

1), 일부 시작 이벤트는 아직 최종 이벤트에 해당이되지 않을 수도 있습니다 및

답변

8

당신은 키와 맵의 UUID를 방출하는 경우 : key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

는 그런 다음 타임 스탬프에 이벤트를 정렬하고로 방출할지 여부를 결정할 수 있습니다 : emit(<uuid>, <event, timestamp>)이 UUID의 당신의 감소 모든 이벤트에서 받게됩니다 결과 파일.

보너스 : 당신은 이미 자신의 타임 스탬프에 분류 항목을 얻을 것이다, 그래서 당신은 당신의 자신의 정렬 클래스를 설정 job.setSortComparatorClass();를 사용할 수 감소 : 물론

public static class BNLSortComparator extends Text.Comparator { 
    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { 
    String sb1, sb2; 
    try { 
     sb1 = Text.decode(b1, s1, l1); 
     ... 
+1

, 이것은 의미가 있습니다. 경기를 찾는 대신 키별로 그룹화합니다. 그러면 앞으로 다른 이벤트를 분석 할 수도 있습니다. 감사 – phisch

3

내가 생각 분할 로그 파일에 의한 startevents없이 최종 이벤트가있을 것입니다 지도 함수가 UUID를 키로 출력하고 나머지는 값으로 출력함으로써이 작업을 수행 할 수 있습니다. 그런 다음 reduce 함수는 동일한 UUID를 가진 모든 로그 항목의 콜렉션으로 전달됩니다. 프로세스를 처리 할 때 다양한 이벤트를 추적하고 이에 따라 조치를 취할 수 있습니다. 예를 들어 START 이벤트가 발생하면 시작 변수에서 추출 된 시간으로 지역 변수를 설정 한 다음 STOP을 볼 때 이벤트에서 시간을 추출하고, 시작 시간을 빼고, 차이를 출력 할 수 있습니다 (START 이전에 STOP을 보는 경우에도 마찬가지로).

관련 문제