2010-01-27 2 views
3

파이썬으로 데이터를 처리하기 위해 Hadoop을 사용하고 있는데 어떤 파일 형식을 사용해야합니까?파이썬으로 데이터를 처리하기 위해 Hadoop을 사용하고 있는데 어떤 파일 형식을 사용해야합니까?

상당량의 텍스트 페이지가있는 프로젝트가 있습니다.

각 텍스트 파일에는 처리 중에 보존해야하는 몇 가지 헤더 정보가 있습니다. 그러나 헤더를 클러스터링 알고리즘에 방해하지 않기를 바란다.

나는 (하위 패키지는 더 적합 또는 거기?) 하둡에 파이썬을 사용하고

어떻게 내 텍스트 파일을 포맷하고, 처리를 위해 하둡에 그 텍스트 파일을 저장해야합니까?

답변

4

1) 파일

당신은 하둡 스트리밍을 사용하는 경우, 당신은 온라인 기반의 텍스트 파일을 사용할 수 있고, 첫 번째 탭까지의 데이터는 키와 같은 매퍼에 전달됩니다.

스트리밍은 the documentation입니다.

대용량 파일에 적합 할 수있는 입력 파일을 HDFS에 넣을 수도 있습니다. 위의 링크에서 "큰 파일"섹션을보십시오.

2) 메타 데이터 보존은

내가 볼 문제는 헤더 정보 (메타 데이터) 그러한 데이터로 처리 될 것입니다, 그래서 당신은 자신 (첫 번째 단계)하여 필터링해야합니다. 모든 입력 파일의 데이터가 map-step 후에 조인되기 때문에이를 전달하는 것이 더 어렵습니다.

메타 데이터를 데이터 자체에 추가해야합니다 (두 번째 단계). 나중에 메타 데이터를 추가 할 수 있습니다. 파일의 각 데이터 라인에 대해 (키, 데이터 + 메타 데이터)를 방출 할 수 있으므로 각 데이터 라인의 메타 데이터를 보존 할 수 있습니다. 엄청난 오버 헤드가 될 수 있지만, MapReduce는 다음과 같은 의미입니다 : pfffrrrr)

이제 실제로 스트리밍이 Java 구현 작업과 얼마나 다른지 알 수없는 부분이 있습니다. 스트리밍으로 파일 당 하나의 매퍼를 호출하면 map()의 첫 번째 입력을 메타 데이터로 가져와 다음의 모든 데이터 방출에 추가 할 수 있습니다. 그렇지 않다면 다음은 Java-Jobs에 관한 것입니다 :

적어도 JAR-Mapper를 사용하면 데이터를 입력 파일과 관련시킬 수 있습니다 (here 참조). 그러나 맵핑 기능은 메타 데이터가 포함되지 않은 파일의 파티션에서 호출 될 수 있기 때문에 먼저 메타 데이터를 추출해야합니다.

  • 는 HDFS
  • JAR-을 사용하여에이 메타 데이터 색인을 넣어 FILEX, metadatax : keyx : 자리 색인을 포함,

    • 미리 메타 데이터 파일을 생성 : 나는 그런 일을 제안 것 매퍼, 설치 중로드() 메타 데이터 인덱스 파일
      • org.apache.hadoop.hdfs를 참조하십시오.당신은 하둡 스트리밍을 사용하는 경우
      • 은 (맵에 각 방출 데이터 라인에 추가이 매퍼)를 사용 keyx에 대한 keyx 설정 DFSClient
    • 경기가 filex는
  • +0

    좋아, 내가 XML 파일을 사용하여 물건을 쓸 수 있고 텍스트 파일을 다음과 같은 내용으로 분할 할 수 있다고 생각한다 : 각 텍스트 파일. 귀하의 설명을 많이 주시면 감사하겠습니다. - 그러나 나는 확실히 분실했습니다 : ~ ( – lw2010

    +0

    )지도()에서 meta_data를 더 잘 판단하는 데 도움이됩니다. 그럼에도 불구하고 전체지도()에서이를 유지해야합니다.참조 : map()이 (key1, value1), (key2, value2), ..., (key_maximumline, value_maximumline) 쌍으로 연속적으로 호출되는 경우 모든 데이터에 추가합니다.)하지만 각 파일/메타 데이터 컨테이너에 대해 reduce()가 호출됩니다. (map_emitted_key, (이 키에 대한 모든 map_emitted_values ​​목록)) ... 이렇게하면 줄일 때 메타 데이터를 알고 싶을 때 어떻게 든 map_emitted_value (또는 키를 사용하십시오 ...) – Leonidas

    1

    , 귀하의 의견이 될 수 있습니다 모든 라인 기반 형식; 매퍼와 감속기 입력은 원하는 방식으로 읽은 sys.stdin에서 가져옵니다. 기본적으로 탭으로 구분 된 필드를 사용할 필요는 없습니다 (가능한 경우 일관성을 위해 모든 작업에서 하나의 형식을 사용해야 함).

    그러나 기본 분할기와 분할기를 사용하면 입력 및 출력이 분할되거나 정렬되는 방식을 제어 할 수 없으므로 매퍼와 축소 기는 특정 행이 해당 행만 사용하는 헤더 행 또는 데이터 행인지 여부를 결정해야합니다 - 원래 파일 경계를 알 수 없습니다.

    매퍼가 첫 번째 입력 행을 파일의 첫 번째 행으로 가정하거나 행 기반 형식에서 멀리 옮기는 파티션을 지정할 수 있습니다. 마지막으로 스트리밍으로 시도한 것은 힘들었습니다. 내 생각에 매퍼 및 감속기 작업은 효율성과 재사용을 위해 입력 불가피해야합니다. 파일 경계를 추적하는 대신 입력 레코드 스트림을 생각하는 것이 가장 좋습니다.

    스트리밍의 또 다른 옵션은 데이터에 포함 된 별도의 파일로 헤더 정보를 제공하는 것입니다. 매퍼와 감속기가 작업 디렉토리에서 사용할 수 있습니다. 하나의 아이디어는 아마도 각 필드를 파일로 연결하는 대신 2 개가 아닌 3 개 필드를 사용하여 초기 작업에서 적절한 머리글 정보와 연관시키는 것입니다.

    일반적으로 입력을 스트림으로 처리하고 파일 경계, 입력 크기 또는 순서에 의존하지 마십시오. 이러한 모든 제한 사항은 구현할 수 있지만 복잡성을 희생해야합니다. 구현할 필요가있는 경우 작업 체인의 시작 또는 끝 부분에서 작업을 수행하십시오.

    자이 썬 또는 SWIG를 사용하는 경우 다른 옵션이있을 수 있지만 스트리밍보다 사용하기가 더 어려워졌습니다.

    관련 문제