본문 바로가기
대학원 공부/computer science

Big Data : Hadoop : lecture_5 : Hadoop I/O

by 월곡동로봇팔 2019. 10. 30.

Block vs Split

Block vs Split

Block vs Split

 

Hadoop이 HDFS에 저장할 때, Physical , Logical split으로 나뉜다.

Data Block이 Physical 적으로 나뉘어져있고, 이는 HDFS에 저장이 되어있다. 그리고 128MB이다.

MapReduce에 input하는 split들은 logical로 나뉘어져있다.

 

InputFormat의 class Recoder

RecordReader

우리가 API를 구성할 때, FileInputFormat을 쓰게 된다.

input 값을 미리 HDFS에 저장을 해두면, 이는 block 단위로 저장이 된다.

HDFS에 저장된 data를 input으로 받으려고 할 때, block에서 실제 input할 것만 골라서 해야한다.

즉 logical 주소를 알아야 하는데, 이를 FileInputFormat의 RecordReader가 실행한다.

 

 Configuration conf = new Configuration();
 // new job을 만들기 getInstance는 conf와 job의 string을 파라미터로 받는다.
 Job job = Job.getInstance(conf, "word count");
 // ()입력하는 파라미터 jar의 클래스를 불러온다.
 // job class 생성
 job.setJarByClass(WordCount.class);
 // 파라미터의 이름을 가진 클래스(이 파일을 돌리면 만들어짐), 사용할 Mapper를 job에 구현
 job.setMapperClass(TokenizerMapper.class);
 // 파라미터의 이름을 가진 클래스(이 파일을 돌리면 만들어짐), 사용할 Reducer를 job에 구현
 job.setReducerClass(IntSumReducer.class);
 // output data 잡으로 부터 key class를 파라미터로 구현
 // IntSumReducer에서 Text key 라고 해서 Text.class (이미 import해서 따로 구현x)
 job.setOutputKeyClass(Text.class);
 // output data 잡으로부터 value class를 파라미터로 구현
 // IntSumReducer에서 InWritable (이미 import해서 따로 구현x)
 job.setOutputValueClass(IntWritable.class);
 FileInputFormat.addInputPath(job, new Path(args[0]));
 FileOutputFormat.setOutputPath(job, new Path(args[1]));

 

실제로 보면, Path에 내가 input할 data의 위치를 집어넣는데, 넣게 되면, 구현해놓은 job 안에 block으로 저장되어있던 data들을 불러서, 실제로 logical address에 맞게 split을 input으로 넣어주고, 이 input_data들을 토대로 job을 실행한다.

 

 

  start Actual Start End Line
Mapper 1 B1 : 0 B1 : 0 B2 : 150 1
Mapper 2 B2 : 128 B2 : 150 B3 : 300 2
Mapper 3 B3 : 256 B3 : 300 B3 : 300 N/A

  start Actual Start End Line
Mapper 1 B1 : 0 B1 : 0 B2 : 300 1
Mapper 2 B2 : 128 B2 : 0 B3 : 0 2
Mapper 3 B3 : 256 B3 : 300 B3 : 600 N/A

 

Data Intergrity

CheckSum

Hadoop은 Data Intergrity를 위해 CheckSum 함수를 쓴다.

Datanode는 data와 checksum을 저장하기전에 data를 검증해야한다. 

Error 가 발생한다면, Client는 ChecksumException을 받는다.

만약 checksum이 망가진다면, 어떻게 해결해야할까???

-> replication을 불러온다.

 

Compression

File Compression을 하면, 두 가지의 이점이 존재한다.

  • space를 줄일 수 있다.
  • data transfer의 속도를 줄일 수 있다.
  • DEFLATE : 파일 하나 압축
  • Bzip2: Gzip 보다 효과적으로 압축이 가능하나 그만큼 압축 속도가 느리다. 그리고 splittable하여 중간 logical적으로 나뉘어 있는 split 구간을 알 수 있다. 따라서 data를 줄여서 synchronization mark 를 알 수 있게 된다. 이는 하나의map task만 읽을 수 있게 된다. (logical 주소를 모르기 때문에!!) -> locality가 떨어진다.
  • 또한 128MB로 분산 저장하는 Hadoop에 Bzip2는 완전 적합하다.
  • Gzip : Bzip2 보다 속도가 빠르나 압축이 덜 된다. split가 되지 않는다.

 

Serialization

serialization 데이터 스토리지 문맥에서 데이터 구조 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장 (이를테면 파일이나 메모리 버퍼에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다. 

즉 데이터 구조나 오브젝트를 일련의 byte 단위로 보내는 행위를 말한다.

일련의 바이트로부터 데이터 구조를 추출하는 일은 deserialization 이라고 한다.

 

Hadoop에서는 serialization을 통해서 client의 local disk의 내용을 hadoop의 HDFS에 저장하고 연산하며, 이 ouput을 다시 local disk로 부르도록 도와준다. 이 때 쓰이는 interface가 Writable 함수이다.

 

RPC는 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술이다.

 

RPC

 

RPC는 Compact, Fast, Extensible, Interoperable을 추구한다.

 

 

댓글