환경설정
이번에는 Java 프로그램을 통한 파일 입출력을 해보겠습니다.
먼저 Java언어로 개발을 하기위한 환경설정을 해야합니다. 제가 사용할 환경은 다음과 같습니다:
- IntelliJ IDEA Community: https://www.jetbrains.com/idea/download/#section=windows
- Gradle (IntelliJ에서 자동으로 관리)
주의해야할 사항은 Community버전이 아니면 유료라는 것입니다.
Gradle의 문법에 대해서는 따로 설명하지 않고 진행하도록 하겠습니다.
프로젝트 생성
IntelliJ IDEA에서 프로젝트를 생성해보겠습니다.
IntelliJ를 처음 실행하면 위와같은 화면이 나옵니다. 여기서 Create를 눌러주겠습니다.
위와같은 화면이 나오면 왼쪽 메뉴에서는 Gradle을 오른쪽에서는 Java를 선택해줍니다.
Project SDK에 아무것도 나오지 않는다면, IntelliJ가 Java의 경로를 모르는 것으로 이를 설정해 주어야 합니다.
(프로젝트를 작성하는 컴퓨터에 Java가 깔려있어야 합니다.)
다음은 위와같은 화면이 나오는데, 여기서는 프로젝트의 패키지명(GroupId)과 프로젝트명(ArtifactId)을 설정해줍니다.
다음으로 나오는 두개의 화면은 Next를 누르시고 마지막에 Finish를 누르시면 프로젝트 구성이 시작됩니다.
프로젝트 창이 뜨면 하단에 다음과같이 Gradle에 필요한 파일들을 다운로드 받기 시작합니다.
이 작업이 끝날때까지 기다려줍니다.
패키지 생성
이제 프로젝트에 우리가 작성해줄 프로그램의 패키지 구조를 만들어 주겠습니다.
화면 왼쪽의 프로젝트 구조를 보시고, src > main > java 폴더에 다음과같이 3개의 폴더를 연속적으로 안에 넣어 만들어줍니다. java 폴더에 오른쪽 클릭을 하시고 New > Package를 선택하시면 됩니다. 이 폴더 구조는 위에 프로젝트를 생성할 때 정해주었던 GroupId와 ArtifactId를 포함하고 있어야 합니다. 제 경우 최종 폴더 구조는 src > main > java > com > jyoon > study > filoio가 되겠습니다.
Gradle Dependency
폴더 구조를 다 만들어 주었으면 이제 실제 프로그램을 작성해보겠습니다.
먼저 하둡에 프로그램을 돌리기 위한 라이브러리를 내려받아야합니다.
프로젝트 구조를 보면 build.gradle이라는 파일이 있습니다. 이를 더블클릭으로 열어줍니다.
가장 하단에 보면 dependencies를 추가해주는 코드가 있습니다. 그 코드를 다음과 같이 바꿔주겠습니다.
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
implementation 'org.apache.hadoop:hadoop-common:3.1.2'
}
자세히 보시면 implementation으로 시작하는 줄 한줄이 추가된 것입니다.
이것은 apache에서 haoop관련된 라이브러리를 maven에 배포한 라이브러리 입니다.
코드를 추가하시면 오른쪽 하단에 위와같은 팝업이 나옵니다.
여기서 Import Changes를 누르면 maven에서 hadoop-common라이브러리를 내려받기 시작합니다.
Java 프로그램
먼저 Java 클래스를 만들어주겠습니다.
fileio 폴더에 오른쪽 마우스 클릭을 해주고 New > Java Class를 클릭합니다.
그리고 클래스 이름란에 SingleFileWriteRead라고 작성하고 OK를 클릭해줍니다.
그리고 아래 코드를 작성해주겠습니다. (가장 상단의 패키지는 생략되었습니다. 복붙하실 때 주의하세요.)
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class SingleFileWriteRead {
public static void main(String[] args){
if (args.length != 2){
System.err.println("Usage: SingleFileWriteRead <input> <output>");
System.exit(2);
}
Configuration conf = new Configuration();
try {
FileSystem hdfs = FileSystem.get(conf);
// 경로를 체크하고 존재한다면 지운다
Path path = new Path(args[0]);
if (hdfs.exists(path))
hdfs.delete(path, true);
// 파일을 저장하고 스트림을 닫는다
FSDataOutputStream outputStream = hdfs.create(path);
outputStream.writeUTF(args[1]);
outputStream.close();
// 앞서 저장한 파일을 읽어 String에 저장하고 닫는다
FSDataInputStream inputStream = hdfs.open(path);
String inputString = inputStream.readUTF();
inputStream.close();
// 읽은 내용을 출력
System.out.println("## inputString: "+ inputString);
} catch (IOException e) {
e.printStackTrace();
}
}
}
위의 코드는 2번째 입력으로 넣은 파라미터를 HDFS에 저장하고, 다시 읽어들여 그 읽은 내용을 출력하는 코드입니다.
main함수 하나만 가지고 있습니다.
main의 첫 if문을 보면 command line input을 체크하고 있습니다.
해당 jar파일을 실행할 때 argument가 두개가 없으면 프로그램을 종료하는 코드입니다.
이제 이 코드를 HDFS에서 수행할 수 있도록 실행시켜보겠습니다.
jar Build
먼저 IntelliJ에서 해당 프로젝트를 jar로 빌드해야합니다.
먼저 IntelliJ 왼쪽 상단의 메뉴에서 File > Project Structure를 클릭해줍니다.
Project Structure 창의 왼쪽 메뉴에서 Artifacts를 클릭하고, 중앙 상단의 +버튼을 누른 뒤,
JAR > From modules with dependencies를 클릭해줍니다.
그럼 위와같은 새로운 창이 뜨게 되는데 여기서 Main Class의 오른쪽에 있는 폴더버튼을 클릭해줍니다.
마지막으로 새로 나타나는 창에서 SingleFileWriteRead클래스가 선택되어있는 것을 확인하고 세개의 모든 창에 OK를 눌러주면 됩니다.
이제 Artifact를 빌드해야합니다.
상단 메뉴에 Build > Build Artifacts를 클릭합니다.
위와같이 생긴 팝업이 화면에 뜨게되는데 여기서 Build를 선택해주면 jar파일을 빌드하기 시작합니다.
빌드된 파일은 프로젝트 폴더 내의 out > artifacts > fileio_jar 폴더에 생성되게 됩니다.
이제 이 jar 파일을 하둡에서 실행시켜야 합니다.
프로그램 실행
다음 커맨드를 입력해 jar파일을 doop01기기로 옮겨줍니다. (저는 먼저 jar파일을 Downloads폴더에 옮겨주었습니다.)
> scp fileio.jar doop@doop01:~/
그리고 Java 프로그램을 이용해 String을 hdfs의 파일에 생성해주겠습니다.
> hadoop jar fileio.jar com.jyoon.study.fileio.SingleFileWriteRead hello.txt Hello,HDFS
잘 실행된다면 아까 작성했던 프로그램대로 다음과같은 출력을 내야합니다.
## inputString: Hello,HDFS
이제 HDFS에 잘 들어갔는지 확인할 차례입니다. ls명령으로 해당 파일이 들어가있는지 확인해보시기 바랍니다.
> hadoop fs -ls
참고자료
이 포스팅은 "시작하세요! 하둡 프로그래밍" 책의 예제를 무작정 따라해본 포스팅입니다.
https://wikibook.co.kr/beginning-hadoop-programming-2rev/
'빅데이터 > 하둡' 카테고리의 다른 글
하둡 1.0 튜토리얼 - (9) 항공 데이터 분석 1 (0) | 2019.07.15 |
---|---|
하둡 1.0 튜토리얼 - (8) 맵리듀스 (0) | 2019.07.14 |
하둡 1.0 튜토리얼 - (6) HDFS 명령어 (0) | 2019.07.12 |
하둡 1.0 튜토리얼 - (5) 하둡 실행 (5) | 2019.07.12 |
하둡 1.0 튜토리얼 - (4) 클러스터 구성 (0) | 2019.07.12 |