[HADOOP] Hadoop은 입력 분할을 어떻게 수행합니까?
HADOOPHadoop은 입력 분할을 어떻게 수행합니까?
이것은 Hadoop / HDFS와 관련된 개념적 질문입니다. 10 억 개의 라인을 포함하는 파일이 있다고 가정 해 보겠습니다. 그리고 단순화를 위해, 각 행이
이제 N 개의 맵 작업을 실행하려고 할 때 프레임 워크가 입력 파일을 N 개의 분할로 분할하고 해당 분할에서 각 맵 작업을 실행합니까? 또는 N 개의 분할을 수행하고 생성 된 분할에서 각 맵 작업을 실행하는 분할 기능을 작성해야합니까?
내가 알고 싶은 건, 스플릿이 내부적으로 수행 되든 또는 수동으로 데이터를 분할해야하든간에 말입니다.
보다 구체적으로 map () 함수가 호출 될 때마다 Key Key 및 Value val 매개 변수는 무엇입니까?
감사, 디팍
해결법
-
==============================
1.InputFormat는 분할을 제공합니다.
InputFormat는 분할을 제공합니다.
일반적으로 노드가 n 개인 경우 HDFS는 이러한 모든 n 노드를 통해 파일을 배포합니다. 작업을 시작하면 기본적으로 n 개의 매퍼가 생성됩니다. Hadoop 덕택에 머신의 매퍼는이 노드에 저장된 데이터의 일부를 처리합니다. 나는 이것이 Rack awareness라고 생각한다.
긴 이야기를 짧게하려면 : HDFS에 데이터를 업로드하고 MR 작업을 시작하십시오. Hadoop은 최적화 된 실행을 관리합니다.
-
==============================
2.파일은 HDFS 블록으로 분할되고 블록이 복제됩니다. Hadoop은 데이터 지역성 원칙을 기반으로 분할을 위해 노드를 할당합니다. Hadoop은 블록이있는 노드에서 매퍼를 실행하려고 시도합니다. 복제 때문에 동일한 블록을 호스팅하는 여러 노드가 있습니다.
파일은 HDFS 블록으로 분할되고 블록이 복제됩니다. Hadoop은 데이터 지역성 원칙을 기반으로 분할을 위해 노드를 할당합니다. Hadoop은 블록이있는 노드에서 매퍼를 실행하려고 시도합니다. 복제 때문에 동일한 블록을 호스팅하는 여러 노드가 있습니다.
노드를 사용할 수없는 경우 Hadoop은 데이터 블록을 호스팅하는 노드에 가장 가까운 노드를 선택하려고 시도합니다. 예를 들어, 같은 랙에서 다른 노드를 선택할 수 있습니다. 여러 가지 이유로 노드를 사용할 수 없습니다. 모든지도 슬롯이 사용 중이거나 노드가 단순히 다운되었을 수 있습니다.
-
==============================
3.다행스럽게도 모든 것이 프레임 워크에 의해 관리됩니다.
다행스럽게도 모든 것이 프레임 워크에 의해 관리됩니다.
MapReduce 데이터 처리는 입력 분할의 개념에 의해 유도됩니다. 특정 응용 프로그램에 대해 계산 된 입력 스플릿 수는 매퍼 작업 수를 결정합니다.
맵의 수는 대개 입력 파일의 DFS 블록 수에 의해 결정됩니다.
이러한 매퍼 태스크는 가능한 경우 입력 분할이 저장되는 슬레이브 노드에 할당됩니다. Resource Manager (또는 Hadoop 1에있는 경우 JobTracker)는 입력 분할이 로컬에서 처리되도록 최선을 다합니다.
데이터 노드의 경계를 넘어서는 입력 분할로 인해 데이터 지역성을 달성 할 수없는 경우, 일부 데이터는 하나의 데이터 노드에서 다른 데이터 노드로 전송됩니다.
128 MB 블록이 있고 마지막 레코드가 블록 a에 적합하지 않고 블록 b에 확산되었다고 가정하면 블록 b의 데이터는 블록 a를 갖는 노드로 복사됩니다
이 도표를보십시오.
관련 질문보기
Hadoop / HDFS 파일 분할 정보
Hadoop 프로세스 레코드는 블록 경계에서 어떻게 분리됩니까?
-
==============================
4.hadoop에서 InputSplit이 어떻게 작동하는지 더 잘 이해하기 위해 나는 hadoop이 작성한 기사를 인형으로 읽는 것이 좋습니다. 정말 도움이됩니다.
hadoop에서 InputSplit이 어떻게 작동하는지 더 잘 이해하기 위해 나는 hadoop이 작성한 기사를 인형으로 읽는 것이 좋습니다. 정말 도움이됩니다.
-
==============================
5.디팍이 묻는 것은 각지도 노드에있는 데이터가 아니라지도 함수의 각 호출에 대한 입력이 어떻게 결정되는지에 관한 것입니다. 나는이 질문의 두 번째 부분에 기초하여 이것을 말하고있다 : 보다 구체적으로 map () 함수가 호출 될 때마다 Key Key 및 Value val 매개 변수는 무엇입니까?
디팍이 묻는 것은 각지도 노드에있는 데이터가 아니라지도 함수의 각 호출에 대한 입력이 어떻게 결정되는지에 관한 것입니다. 나는이 질문의 두 번째 부분에 기초하여 이것을 말하고있다 : 보다 구체적으로 map () 함수가 호출 될 때마다 Key Key 및 Value val 매개 변수는 무엇입니까?
사실, 같은 질문이 나를 여기 데려왔고, 경험이 풍부한 하프 개발자 였다면, 나는 그것을 위의 대답처럼 해석했을 것입니다.
이 질문에 답하기 위해,
주어진 맵 노드의 파일은 우리가 InputFormat을 위해 설정 한 값에 기초하여 나눠진다. (이것은 Java에서 setInputFormat ()을 사용하여 수행됩니다!)
예 :
conf.setInputFormat (TextInputFormat.class); 여기서는 TextInputFormat을 setInputFormat 함수에 전달하여 map 노드의 입력 파일의 각 행을 map 함수의 입력으로 처리하도록 hadoop에 지시합니다. 줄 바꿈 또는 캐리지 리턴은 줄 끝을 알리는 데 사용됩니다. TextInputFormat에 대한 자세한 정보!
이 예에서 : 키는 파일의 위치이며 값은 텍스트 행입니다.
희망이 도움이됩니다.
-
==============================
6.FileInputFormat은 입력 파일을 읽고 유출하는 방법을 정의하는 추상 클래스입니다. FileInputFormat은 다음과 같은 기능을 제공합니다. 1. 입력으로 사용해야하는 파일 / 오브젝트 선택 2. 파일을 작업으로 분해하는 inputsplits를 정의합니다.
FileInputFormat은 입력 파일을 읽고 유출하는 방법을 정의하는 추상 클래스입니다. FileInputFormat은 다음과 같은 기능을 제공합니다. 1. 입력으로 사용해야하는 파일 / 오브젝트 선택 2. 파일을 작업으로 분해하는 inputsplits를 정의합니다.
hadoop 기본 기능에 따라, n 개의 스플릿이 있으면 n 매퍼가있게됩니다.
-
==============================
7.Hadoop 작업이 실행되면 입력 파일을 청크로 분할하고 각 분할을 처리 할 매퍼에 할당합니다. 이를 InputSplit이라고합니다.
Hadoop 작업이 실행되면 입력 파일을 청크로 분할하고 각 분할을 처리 할 매퍼에 할당합니다. 이를 InputSplit이라고합니다.
-
==============================
8.블록 크기와 입력 분할 크기의 차이.
블록 크기와 입력 분할 크기의 차이.
Input Split은 데이터를 논리적으로 분할 한 것으로, 기본적으로 MapReduce 프로그램이나 다른 처리 기법에서 데이터를 처리하는 동안 사용됩니다. 입력 분할 크기는 사용자 정의 값이며 Hadoop Developer는 데이터 크기 (처리중인 데이터의 양)에 따라 분할 크기를 선택할 수 있습니다.
Input Split은 기본적으로 MapReduce 프로그램의 Mapper 수를 제어하는 데 사용됩니다. MapReduce 프로그램에서 입력 분할 크기를 정의하지 않은 경우 기본 HDFS 블록 분할은 데이터 처리 중에 입력 분할로 간주됩니다.
예:
파일이 100MB이고 HDFS 기본 블록 구성이 64MB라고 가정하면 2 분할로 잘라내어 2 개의 HDFS 블록을 차지합니다. 이제이 데이터를 처리하는 MapReduce 프로그램이 있지만 입력 분할을 지정하지 않으면 블록 수 (2 블록)를 기준으로 MapReduce 처리를위한 입력 분할로 간주되며이 작업에 대해 두 개의 매퍼가 할당됩니다. 그러나 MapReduce 프로그램에서 분할 크기 (100MB)를 지정한 다음 두 블록 (2 블록)이 MapReduce 처리를위한 단일 분할로 간주되고이 작업에 대해 하나의 매퍼가 할당된다고 가정하십시오.
이제 MapReduce 프로그램에서 분할 크기 (예 : 25MB)를 지정했다면 MapReduce 프로그램에 4 개의 입력 분할이 있고 4 개의 매퍼가 작업에 할당됩니다.
결론:
출처 : https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/
-
==============================
9.간단히 대답하면 InputFormat은 파일의 분할을 처리합니다.
간단히 대답하면 InputFormat은 파일의 분할을 처리합니다.
이 질문에 접근하는 방법은 기본 TextInputFormat 클래스를 살펴 보는 것입니다.
모든 InputFormat 클래스는 분할을 처리하는 FileInputFormat의 서브 클래스입니다.
특히 FileInputFormat의 getSplit 함수는 JobContext에 정의 된 파일 목록에서 InputSplit List를 생성합니다. 분할은 프로젝트 xml 파일에서 Min 및 Max를 임의로 정의 할 수있는 바이트 크기를 기반으로합니다.
-
==============================
10.파일을 블록으로 분할하는 별도의 맵 축소 작업이 있습니다. 큰 파일에는 FileInputFormat을, 작은 파일에는 CombineFileInput Format을 사용하십시오. 또한 입력을 블록 단위로 분할 할 수 있는지 여부를 확인할 수 있습니다. 그런 다음 각 블록을 데이터 노드로 공급하여 추가 분석을 위해 맵 축소 작업을 실행합니다. 블록의 크기는 mapred.max.split.size 매개 변수에서 언급 한 크기에 따라 다릅니다.
파일을 블록으로 분할하는 별도의 맵 축소 작업이 있습니다. 큰 파일에는 FileInputFormat을, 작은 파일에는 CombineFileInput Format을 사용하십시오. 또한 입력을 블록 단위로 분할 할 수 있는지 여부를 확인할 수 있습니다. 그런 다음 각 블록을 데이터 노드로 공급하여 추가 분석을 위해 맵 축소 작업을 실행합니다. 블록의 크기는 mapred.max.split.size 매개 변수에서 언급 한 크기에 따라 다릅니다.
-
==============================
11.FileInputFormat.addInputPath (job, newPath (args [0])); 또는
FileInputFormat.addInputPath (job, newPath (args [0])); 또는
conf.setInputFormat (TextInputFormat.class);
class FileInputFormat funcation addInputPath, setInputFormat는 inputsplit를 처리합니다.이 코드는 생성되는 매퍼의 수를 정의합니다. inputsplit과 매퍼 수는 HDFS에 입력 파일을 저장하는 데 사용되는 블록 수에 직접 비례한다고 말할 수 있습니다.
전의. 크기가 74 Mb 인 입력 파일이있는 경우이 파일은 HDFS에 두 개의 블록 (64 MB 및 10 Mb)으로 저장됩니다. 따라서이 파일의 inputsplit은 2이고이 입력 파일을 읽으려면 두 개의 mapper 인스턴스가 만들어집니다.
from https://stackoverflow.com/questions/2831507/how-does-hadoop-perform-input-splits by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하둡의 파일 분할 크기 변경 (0) | 2019.05.30 |
---|---|
[HADOOP] 돼지 라틴어 : 날짜 범위에서 여러 파일로드 (디렉토리 구조의 일부) (0) | 2019.05.30 |
[HADOOP] hadoop 맵에서 그룹 비교기를 사용하는 것은 무엇입니까 reduce (0) | 2019.05.30 |
[HADOOP] Hadoop 프로그램의 매퍼에서 입력 파일 이름을 가져 오는 방법은 무엇입니까? (0) | 2019.05.30 |
[HADOOP] Hadoop 용 대규모 데이터 다운로드 [닫힘] (0) | 2019.05.30 |