2015-01-06 5 views
2

디렉토리에서 HDFS로 파일을 가져와야하는 유스 케이스가 있습니다. POC로서 Flume에서 소스, 싱크 및 채널을 지정한 간단한 디렉토리 스풀링을 사용 했으므로 제대로 작동합니다. 단점은 파일 크기와 다른 매개 변수를보다 잘 제어하기 위해 고유 한 폴더로 이동하는 여러 파일 형식에 대해 여러 디렉터리를 유지해야한다는 것입니다. 구성을 반복하면서도 쉽지만 간단합니다.Flume - 전체 파일을 Flume에서 이벤트로 간주 할 수 있습니까?

대신 하나의 디렉토리에 여러 파일이 있고 파일의 문자열을 기반으로 HDFS의 특정 디렉토리로 라우팅되는 regex 인터셉터를 사용하는 것이 좋습니다. 내가 기대하고있는 파일의 종류는 첫 번째 줄이 머리글이고 그 다음 줄이 쉼표로 구분 된 CSV 파일입니다.

이것을 염두에두고 몇 가지 질문이 있습니다.

  1. 어떻게 인터셉터가 파일을 처리합니까?
  2. CSV의 헤더 행은 ID와 이름으로 다음 행에 이어지는 ID, Name과 같으며 다음 디렉토리에있는 다른 파일은 이름과 주소로 다음 행에 이어 Name, Address이됩니다. 그러면 인터셉터와 채널 구성을 다른 HDFS 디렉토리로 라우팅하는 것처럼 보이십니까?
  3. 정규 표현식과 명확하게 일치하지 않는 후속 행을 인터셉터가 어떻게 처리합니까?
  4. 전체 파일이 하나의 이벤트를 구성하는지 또는 하나의 파일이 실제로 여러 이벤트가 될 수 있습니까?

알려 주시기 바랍니다. 감사!

답변

3

처음에는 flume이 파일과 같이 파일에서 작동하지 않지만 이벤트라고합니다. 이벤트는 Avro 구조체로 아무 것도 포함 할 수 있지만 대개는 한 줄입니다.하지만 경우에 따라 전체 파일 일 수 있습니다.

인터셉터를 사용하면 이벤트에서 정보를 추출하여 해당 이벤트의 헤더에 추가 할 수 있습니다. 후자는 traget 디렉토리 구조를 구성하는 데 사용될 수 있습니다.

if (line.contains("Address")) { 
    event.getHeaders().put("subpath", "address"); 
else if (line.contains("ID")) { 
    event.getHeaders().put("subpath", "id"); 
} 

당신은 다음 hdfs-에 있음을 참조 할 수 있습니다 : 특정 경우

, 당신은 인스턴스 서브 경로를 들어, 이벤트의 내용을 분석하고 헤더 값을 설정하는 파서를 코딩 할 것 다음과 같이 confirguration 싱크 : 여러 개의 파일이 이벤트를 구성 할 수 있는지 여부를 질문에 관해서는

hdfs-a1.sinks.hdfs-sink.hdfs.path = hdfs://cluster/path/%{subpath} 

을 : 예,하지만 스풀 소스와, 가능합니다. 구성된 Avro 소스와 통신하는 클라이언트 클래스를 구현해야합니다. 파일을 이벤트로 파이프하여 보내야합니다. 인터셉터를 사용하는 대신 헤더를 설정할 수도 있습니다.

+0

답변 해 주셔서 감사합니다. 그것은 나를 위해 몇 가지를 명확하게 해줍니다. 그러나, 내가 알고 싶은 것은 regex 필터링 인터셉터를 사용할 수 있다면 (그렇다면 적합 할 것입니다), 그렇다면 채널 선택기를 사용하여 해당 HDFS 폴더로 파일을 라우팅해야합니까? – CodingInCircles

+0

RegexFilterInterceptor는 이벤트 본문과 일치하는 구성된 정규식을 기반으로 선택적으로 이벤트를 필터링하므로 실제로 도움이되지 않습니다. 이는 포함 또는 제외 기반 필터링을 지원합니다. 결과를 헤더에 푸시하는 자체 regex 인터셉터를 구현해야합니다. –

+0

안녕하세요 erik, 그냥 zip 파일을 가져 오는 중인지 알고 싶습니다. 단일 이벤트 일 것입니다. zip 파일의 내부 파일을 가져 오는 방법. 단일 이벤트로 파일을 강제 실행하는 것이 가능합니다. 이 질문에 –