2016-07-19 2 views
7

우리는 kafka로 얼마 동안 spark streaming을 사용했고, 지금까지 우리는 KafkaUtils에서 createStream 메쏘드를 사용하고있었습니다. 파티션Kafka로 스파크 스트리밍 - createDirectStream vs createStream

을 RDD하는

1) 더 나은/쉽게 "정확히 한 번만"의미

2) 카프카 주제 파티션의 더 나은 관계 :

우리는 두 가지 이유로 createDirectStream과 같이 탐험 시작 createDirectStream이 실험으로 표시되었음을 확인했습니다. 내가 가진 질문은 다음과 같습니다. (매우 구체적이지 않은 경우 유감스럽게 생각합니다)

정확히 한 번 우리에게 매우 중요하다면 createDirectStream 방법을 탐색해야합니까? 여러분이 여러분의 경험을 공유 할 수 있다면 정말 좋을 것입니다. 신뢰성 등의 다른 문제를 처리해야 할 위험이 있습니까?

답변

8

직접 접근법 (Cody)을 작성한 사람이 작성한 위대한 광범위한 블로그 게시물 here이 있습니다. 일반적으로

, 카프카 배달 의미 섹션을 읽고, 마지막 부분은 말한다 :

기본적으로 제공 및 가 있습니다 그래서 효과적으로 카프카 보장 한 번에-최소 사용자가 사용하지 않도록 설정하여 전달하면 기껏 구현 생산자에 대해 재시도하고 메시지 묶음을 처리하기 전에 오프셋을 커밋합니다. 정확한 배송은 대상 스토리지 시스템과의 협력이 필요하지만 Kafka는 오프셋을 제공하므로이를 직접 구현할 수 있습니다.

이것은 기본적으로 "정확히 한 번 원한다면 우리가 상자 밖으로 적어도 한 번 당신을 줄이는 당신이다"의미. 또한,의 보장에 대한 블로그 게시물 회담이 "정확히 한 번만"의미는 두 가지 접근 방식 (직접 수신기를 기반으로, 강조 광산)과 스파크에서 얻을 :

둘째, 스파크 정확히 한 번만 보장하지 않습니다 이해 출력 작업의 의미. Spark 스트리밍 가이드가 정확히 한 번에 대해 에 대해 말하면, RDD 의 주어진 항목을 계산 된 값에 한 번만 포함하고, 기능적으로는 의 의미입니다. 에서 결과를 저장하기 위해 수행하는 부작용 출력 작업 (예 : )이 실패하고 다시 시도 될 수 있기 때문에 반복 될 수 있습니다.

또한,이 스파크 문서 수신기 기반 처리에 대해 말씀입니다 :

첫 번째 방법은 (수신기 기준) 사육사 소비 오프셋을 저장하는 카프카의 높은 수준의 API를 사용합니다. 이것은 전통적으로 Kafka의 데이터 을 사용하는 방법입니다. 이 접근법 (미리 쓰기 로그와 함께) 은 데이터 손실을 0으로 보장 할 수 있습니다.최소한 한 번 의미가 있음), 일부 오류로 인해 일부 레코드가 두 번 소비 될 수있는 가능성이 희박합니다 ( ).

이 기본적으로 당신이 불꽃과 함께 수신기 기반 스트림을 사용하는 경우 당신은 여전히 ​​출력 변환이 실패 할 경우 데이터를 복제 한 수 있음을 의미, 그것은 적어도 한 번입니다.

내 프로젝트에서 직접 전달 방식을 사용합니다. 여기서는 전달 의미론이 인데 어떻게 처리합니까?입니다. 즉, 정확히 한 번 의미를 유지하려는 경우 데이터가있는 트랜잭션 (예 :)의 패션과 같은 오프셋을 저장할 수 있습니다. 다른 하나가 실패해도 실패합니다.

블로그 게시물 (위 링크)과 Delivery Semantics in the Kafka documentation page을 읽는 것이 좋습니다. 결론을 내리면 직접 스트림 접근 방식을 살펴 보는 것이 좋습니다.

관련 문제