2016-10-08 2 views
0

RDD 파티션과 HDFS 입력 스플릿의 차이점을 이해하는 데 어려움이 있습니다. 따라서 본질적으로 Spark 응용 프로그램을 제출할 때 :스파크 RDD 파티션과 Hadoop 스플릿

Spark 응용 프로그램에서 HDFS를 읽으려는 경우 HDFS의 파일에 입력 분할이 생깁니다 (각각 64MB라고 가정하고 이러한 입력 분할은 각각 다른 데이터 노드에 있음)).

이제 Spark 응용 프로그램이 (sc.textFile(PATH_IN_HDFS))을 사용하여 HDFS에서 해당 파일을로드하려고한다고 가정 해 봅시다. 파일은 약 256MB이고 4 개의 입력 스플릿이 있는데, 스플릿의 2 개가 데이터 노드 1에 있고 다른 2 개의 스플릿이 데이터 노드 2에 있습니다.

Spark가이 256MB를 RDD 추상화로로드하면 will 입력 분할 (64mb)의 각각을 4 개의 분리 된 RDD로로드합니다 (여기서 데이터 노드 1에는 64MB의 데이터와 2 개의 RDD가 있고 데이터 노드 2에는 64MB의 데이터가있는 다른 2 개의 RDD가 있음). 또는 RDD가 Hadoop에서 입력 분할을 더 분할합니까? 또한이 파티션을 어떻게 재배포 할 것입니까? RDD 파티션과 HDFS 입력 스플릿 사이에 상관 관계가 있는지 이해할 수 없습니까?

답변

2

저는 Spark를 처음 접했지만 MapReduce 작업과 관련이 있습니다. Spark은 분산 방식으로 메모리에 데이터를로드하고 데이터를로드 할 머신은 데이터의 위치에 따라 다를 수 있습니다 (읽기 : 다소 데이터 블록의 위치와 분할 아이디어에 매우 가깝습니다). Sparks API를 사용하면 RDD로 생각하고 더 이상 분할 할 필요가 없습니다. RDD에서 데이터를 어떻게 배포 할 것인가는 더 이상 프로그래머의 문제가 아닙니다. 스파크하에있는 전체 데이터 세트를 RDD라고합니다.

+0

그런데 어떻게 RDD에서 파티션 작업이 가능합니까? 당신이 말했듯이 "스파크 아래의 전체 데이터 세트는 RDD라고 불립니다." 그렇다면 RDD 파티션은 HDFS에서 가져온 전체 데이터가 RDD의 파티션으로 어떻게 분할됩니까? – CapturedTree

+0

각 노드가 해당 부분을로드합니다. Spark은 YARN과 대화하여 요청 된 리소스를 할당합니다. 데이터 지역성은 항상 최선이지만 항상 보장되는 것은 아닙니다. 이 수준에서는 데이터 블록으로 작업하는 분할이 없습니다. 파일의 블록은 YARN에 의해 ​​할당 된 컨테이너가있는 데이터 노드로로드됩니다.이 노드는 데이터를 보유하는 노드와 동일합니다. – ozw1z5rd

+0

그래서 Spark는 YARN과 대화하여 Spark 변환 및 동작을 실행하기 위해 요청 된 리소스를 HDFS의 지정된 데이터 세트에 할당합니다. Spark 애플리케이션이 집행자 (HDFS의 데이터 노드)로 전송되고 HDFS 입력의 데이터가 RDD 추상화에 입력되면 RDD가 그 파티션을 추가로 분할한다는 의미에서 내 질문에 답하지는 않는다고 생각합니다. 전체 데이터는 HDFS에서 분리됩니다. – CapturedTree

관련 문제