Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- SQL
- xPlatform
- plugin
- JavaScript
- GIT
- Android
- SPC
- IntelliJ
- NPM
- mybatis
- 보조정렬
- R
- Java
- react
- hadoop
- SSL
- Express
- Python
- Sqoop
- Spring
- vaadin
- tomcat
- window
- Eclipse
- es6
- MSSQL
- 공정능력
- table
- mapreduce
- Kotlin
Archives
- Today
- Total
DBILITY
hadoop MapReduce 프로그래밍 요소 본문
반응형
- DataType
네트워크 통신을 위해 최적화된 Writable과 Comparable을 다중 상속한 WritableComparable Interface를 제공.
compareTo 메서드는 Key끼리 비교해(Compares two strings lexicographically) 정렬한다.
(복합 키 정의 시 Mapper와 Reducer에서는 toString메서드를 호출하여 값을 출력하므로 반드시 구현하여야 함)
write 메서드는 데이터를 직렬화(byte stream) 하고, readFields는 직렬화된 데이터(byte stream)를 해제하고 읽는다. - 데이터 포맷 클래스는 두 메서드를 구현하는 부분에서 데이터를 읽고 쓰는 기능을 처리한다.
자주 사용하는 데이터타입에 대한 Wrapper클래스를 제공한다.
Class Target DataType Size Sort Order BooleanWritable Boolean 1 false,true ByteWritable single byte 1 Ascending BytesWritable byte array DoubleWritable Double 8 Ascending FloatWritable Float 4 Ascending IntWritable Integer 4 Ascending MD5Hash byte array (md5) LongWritable Long 8 Ascending TextWrapper(Text) UTF8 Format Text 2G Alphabetic NullWritable 데이터 값이 필요 없을 경우 - InputFormat
Input Split을 Map메서드의 입력 파라미터로 사용할 수 있도록 InputFormat abstract class를 제공
InputSplit -> RecordReader -> Mapper
InputFormat Funtional Description TextInputFormat 텍스트 파일 분석용, 개행 문자(\n)로 레코드 분류
Key는 LongWritable Type 라인 번호, Value는 Text Type의 라인 내용KeyValueTextInputFormat 텍스트 파일을 사용할 때, 라인 번호 대신 임의의 키값을 지정할 수 있음
ex. getConf().set("mapreduce.input.keyvaluelinerecordreader.key.value.separator",",");NLineInputFormat InputSplit당 입력받는 텍스트 파일의 라인수를 지정할 수 있음
ex. getConf().setInt("mapreduce.input.lineinputformat.linespermap",150);
테스트 결과 InputSplit의 최대수는 10,000,000개임DelegatingInputFormat 여러 개의 서로 다른 입력 포맷을 사용하는 경우 각 경로에 대한 작업을 위임
MultipleInputs 참고CombineFileInputFormat 다른 InputFormat은 file별로 split을 생성하지만, 이것은 다수의 file을 split으로 묶어서 사용
각 node와 rack의 위치를 고려해 split을 결정함SequenceFileInputFormat binary형태의 key, value list로 구성된 텍스트 파일로
SequenceFile은 압축, 직렬화를 이용해 다양한 유형으로 저장SequenceFileAsBinaryInputFormat SequenceFile의 key, value를 임의의 binary Object로 변환하여 사용 SequenceFileAsTextInputFormat SequenceFile의 key,value를 Text Object로 변환하여 사용 - Mapper
InputSplit마다 MapTask생성, InputSplit으로부터 key, value쌍으로 한 라인씩 입력을 받아 가공, 분류하도록 사용자 프로그래밍 기능 - Combiner (Mini-Reducer or Semi-Reducer)
MapTask의 출력은 Network를 통해 ReduceTask로 전달되며, 이 과정을 Shuffle이라 함.
전송 데이터를 크기를 줄인다면 IO가 줄어들어 성능이 개선됨.
Combiner는 shuffle 할 데이터의 크기를 줄이는 역할을 하며, Mapper의 출력 데이터를 입력 데이터로 전달, MapTask와 같은 Node에서 실행됨
Reducing을 Mapping Node에서 먼저 실행(Reducer를 상속받아 reduce메서드에서 Grouping and Summery)하여 데이터 출력.
Driver Class에서 job.setCombinerClass를 통해 설정할 수 있다. - Partitioner
MapTask의 출력 데이터가 어떤 ReduceTask로 전달될지 결정(조건처럼 동작)
기본으로 HashPartitioner를 제공하며, Partitioner를 상속받아 getPartition 메서드를 재정의할 수 있다.
Driver Class에서 job.setPartitionerCalss를 통해 설정할 수 있다.
Partitioner의 개수는 Reducer의 개수와 일치하여야 하므로, setNumReduceTasks(N)로 Reducer의 개수를 지정한다.
이때, 지정한 N이 getPartition 메서드의 numReduceTasks인자가 됨. 즉, Reducer의 수로 MapTask의 출력 데이터를 나누게 된다. - Reducer
MapTask의 출력을 입력 데이터로 집계 연산 수행
입력 데이터의 Key를 바탕으로 Sorting - OutputFormat
Job Interface의 setJobOutputFormatClass로 설정, OutputFormat abstract class를 상속받아 구현한다.
OutputFormat Funtional Description TextOutputFormat 텍스트 파일에 레코드 출력하며, key, value의 구분자는 tab을 사용 SequenceFileOutputFormat 시퀀스 파일 형태로 출력 SequenceFileAsBinaryOutputFormat SequenceFileOutputFormat을 상속받아 구현,
binary format의 key와 value를 SequenceFile Container에 씀FileOutputFormat OutputFormat Class의 Wrapper Class LazyOutputFormat FileOutputFormat을 상속받은 Class는 출력 내용이 없더라도 출력 파일이 생성되나,
첫 번째 레코드가 해당 파티션(part-nnnnn)으로 보내질 때 출력을 생성NullOutputFormat 출력 데이터가 없을 때 사용
참고 서적 : 시작하세요! 하둡프로그래밍 개정 2판(위키북스) - 정재화 지음
반응형
'bigdata > hadoop' 카테고리의 다른 글
hadoop job list, kill (0) | 2016.11.30 |
---|---|
성별,연령대별 최고연봉 구하기 (0) | 2016.11.29 |
hadoop MRUnit 사용하기 (0) | 2016.11.17 |
hadoop ChainMapper, Reducer exercise (0) | 2016.11.14 |
하둡 정리 2 (0) | 2016.11.13 |
Comments