문제

나는 Hadoop과 함께 놀고 있으며 Ubuntu에 2 개의 노드 클러스터를 설정했습니다. WordCount 예제는 잘 실행됩니다.

이제 로그 데이터를 분석하기 위해 내 자신의 MapReduce 프로그램을 작성하고 싶습니다 (주된 이유 : 간단 해 보이고 데이터가 많이 있습니다).

로그의 각 라인은이 형식을 사용합니다

<UUID> <Event> <Timestamp>

이벤트가 시작될 수있는 경우, 시작, 중지, 오류 및 기타. 내가 가장 관심있는 것은 같은 UUID의 시작과 중지 이벤트 사이의 경과 시간입니다.

예를 들어, 내 로그에는 이와 같은 항목이 포함되어 있습니다

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

내 현재 선형 프로그램은 파일을 통해 읽히고, 메모리에서 시작 이벤트를 기억하며, 해당 이벤트를 발견 한 후 파일에 경과 시간을 씁니다 (다른 이벤트가있는 줄은 현재 무시되고 오류 이벤트가 UUID를 무효화하고 있습니다. 무시 당하다)1

나는 이것을 Hadoop/Mapreduce 프로그램에 포트하고 싶습니다. 그러나 나는 항목의 일치를 어떻게하는지 잘 모르겠습니다. 파일을 분할/토큰 화하는 것이 쉽고 일치를 찾는 것이 클래스가 감소 될 것 같습니다. 그러나 그것은 어떻게 생겼을까요? MapReduce 작업에서 수학 항목을 어떻게 찾습니까?

나의 주요 초점은 Hadopo/Mapreduce를 이해하는 것입니다. 돼지 및 기타 Apache 프로그램에 대한 링크를 환영하지만 Pure Hadoop/Mapreduce 로이 기능을 해결하고 싶습니다. 고맙습니다.

1) 로그는 실행중인 애플리케이션에서 가져 오기 때문에 일부 시작 이벤트는 아직 해당 최종 이벤트가 없을 수 있으며 로그 파일 분할으로 인해 startEvents가없는 최종 이벤트가 있습니다.

도움이 되었습니까?

해결책

맵에서 UUID를 키로 방출하는 경우 : emit(<uuid>, <event, timestamp>) 이 UUID의 모든 이벤트 축소에서받을 수 있습니다.key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

그런 다음 타임 스탬프에서 이벤트를 정렬하고 결과 파일로 방출할지 여부를 결정할 수 있습니다.

보너스 : 사용할 수 있습니다 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);
      ...

다른 팁

지도 함수가 UUID를 키로 및 나머지 라인의 값으로 출력 하여이 작업을 수행 할 수 있다고 생각합니다. 그런 다음 감소 기능은 동일한 UUID로 모든 로그 항목의 컬렉션을 전달합니다. 그것을 처리 할 때, 그것은 다양한 이벤트를 추적하고 그에 따라 조치를 취할 수 있습니다. 예를 들어, 시작 이벤트를 볼 때 시작 라인에서 추출한 시간으로 로컬 변수를 설정하고 정지를 볼 때. 이벤트 이벤트 시간을 추출하고 시작 시간을 빼고 차이를 출력 할 수 있습니다 (시작 전에 정지를 볼 경우 유사하게 수행하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top