하둡-데이터흐름,파일리스팅,데이터쓰기

Download Report

Transcript 하둡-데이터흐름,파일리스팅,데이터쓰기

Hadoop
김연왕 2007745012
Hadoop 예제 (데이터쓰기)
FileSystem 클래스는 파일을 생성하기 위한 다수의 메소드를 가지고있다.
생성할 파일을 Path로 입력받아 쓰려고하는 출력 스트림을 FSDataOutputStream으로
반환받는 방식이다.
Public FSDataOutputStream create(Path f) throws IOException
이 메소드는 기존의 파일을 강제로 덮어쓰기,파일의 복제 계수, 파일 쓰기의 버퍼 크기, 파일의
블록 크기, 파일 권한에 해당하는 오버로드 메소드 버전을 지원한다.
64KB의 데이터 패킷이 데이터 노드 파이프라인에 쓰일때마다 하둡에 의해 progress()메소드가
호출되고, 그때마다 마침표를 프린트하여 진행상황을 보고한다.(보고방식은 특별히 API에
지정되지 않았기 떄문에 하둡의 향후 버전에서 변경될 수 있다. 단지 API에 뭔가 일어나고 있
다는 추측을 할수 있다.
2 / 12
Hadoop 예제 (데이터쓰기)
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
public class FileCopyWithProgress {
public static void main(String[] args) throws Exception {
String localSrc = args[0];
String dst = args[1];
InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
Configuration conf = new Configuration();
3 / 12
Hadoop 예제 (데이터쓰기)
FileSystem fs = FileSystem.get(URI.create(dst),conf);
OutputStream out = fs.create(new Path(dst), new Progressable() {
public void progress() {
System.out.print(".");
}
});
IOUtils.copyBytes(in,out,4096,true);
}
}
현재 , 다른 하둡 파일시스템은 쓰는 동안에 progress()를 호출하지 않는다. 향후에 보겠지만,
진행상황은 맵리듀스 응용프로그램에서 중요하다.
4 / 12
Hadoop 예제 (파일 리스팅)
FileSystem은 디렉터리를 생성하기 위한 메소드를 제공한다.
Public boolean mkdirs(Path f) throws IOException
성공한다면 true를 반환한다. Create()를 호출한 파일쓰기는 모든 부모 디렉터리들을 자동으로
생성해 주기 떄문에 대개는 디렉터리를 명시적으로 생성할 필요가 없다.
디렉터리의 내용물을 리스트할 필요가 있을때 FileSystem의 listStatus()메소드로는 다음과 같은
것이 있다.
Public FileStatus[] listStatus(Path f) throws IOException
Public FileStatus[] listStatus(Path f, PathFilter filter) throws IOException
Public FileStatus[] listStatus(Path[] files) throws IOException
Public FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException
인자가 파일이면 , 길이가 1인 FIleStatus객체에 대한 하나의 배열을 반환
인자가 디렉터리면, 그 디렉터리에 포함된 파일과 디렉터리를 나타내기 위하여 0이상의
FIleStatus 개체를 반환한다.
5 / 12
Hadoop 예제 (파일 리스팅)
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
public class ListStatus {
public static void main (String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path[] paths = new Path[args. length];
for(int i=0; i<paths.length; i++) {
paths[i] = new Path (args[i]);
}
FileStatus[] status= fs.listStatus(paths);
Path[] listedPaths = FileUtil.stat2Paths(status);
for(Path p : listedPaths) {
System.out.println(p); }}}
6 / 12
Hadoop 예제 (파일 리스팅)
경로 집합에 대한 디렉터리 리스트의 합집합을 찾기 위하여 사용될 수 있다.
7 / 12
Hadoop 예제 (데이터흐름)
파일 읽기 해부
1단계: DistributedFileSystem의 인스턴스에 해당하는 FileSystem 객체의 open()을 호출하여 읽기
원하는 파일을 연다.
2단계: 블록의 위치를 파악하기 위해 RPC를 사용하여 네임노드를 호출한다.
3단계: 클라이언트는 해당 스트림에 대해 read()를 호출한다.
4단계: 클라이언트는 스트림에 대해 반복적으로 read()를 호출하고, 데이터는 데이터노드로
부터 전송된다.
5단계: 블록의 끝에 이르면, DFSInputStream은 데이터노드로의 연결을 닫고, 다음 블록을 위해
가장 적합한 네임노드를 찾는다.
6단계: 읽기가 끝나면, 클라이언트는 FSDataInputStream에서 close()를 호출한다.
8 / 12
Hadoop 예제 (데이터흐름)
파일 쓰기 상세
1단계:클라이언트는 DistributedFileSystem의 create()를 호출하여 파일을 생성한다.
2단계:파일시스템의 네임스페이스에 새로운파일을 생성하기위해 네임노드로 하나의 RPC를 호출한다.
3단계:클라이언트가 데이터를 쓸떄 DFSOutputStream은 그 데이터를 패킷으로 쪼개서 데이터 큐라고
불리는 내부 큐에 쓴다.
4단계:DataStreamer는 패킷을 파이프라인에 있는 첫 번째 데이터 노드로 전달한다. 두번째 데이터노드는
그 패킷을 저장하고 파이프라인의 세번째 데이터 노드로 전달한다.
5단계:하나의 패킷은 파이프라인에 있는 데이터 노드로 부터 모두 승인 되었을 때에만 승인 큐로부터
제거된다.
6단계:클라이언트는 데이터쓰기를 완료할때, 그 스트림으로 close()를 호출한다.
9 / 12
감사합니다.