본문으로 바로가기
반응형

앞서서 hdfs 파일 시스템에 접근하는 명령어들을 알아봤습니다.


커멘트 창이 아닌 코드상에서 hdfs내부에 접근하려면 org.apache.hadoop.fs 패키지를 이용해야 합니다.

간단하게 코드로 hdfs 파일 쓰기, 읽기에 대한 예제는 아래와 같습니다.


먼저 IntellJ에서 kotlin maven 설정을 하는 방법은 하기 링크에서 확인하시기 바랍니다

https://tourspace.tistory.com/225


예제를 실행하려면 maven에 관련 라이브러리를 추가해야 합니다.

pom.xml 파일에 아래와 같이 dependency를 추가합니다.

※ 본 예제는 Kotlin을 사용하였습니다.

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

class HadoopTest {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            if (args.isEmpty()) {
                System.err.println("Contents for file is needed!!")
                System.exit(-1)
            }

            // 파일이름 설정
            val fileName = "test"
            val path = Path(fileName)

            // HDFS File system 획득.
            val configure = Configuration()
            val hdfsFileSystem = FileSystem.get(configure)

            // 기존 파일 체크
            if (hdfsFileSystem.exists(path)) {
                hdfsFileSystem.delete(path, true)
            }

            // 파일 저장
            val outStream = hdfsFileSystem.create(path)
            outStream.use { it.writeUTF(args[0]) }

            // 파일 출력
            val inStream = hdfsFileSystem.open(path)
            val inputStr = inStream.use { it.readUTF() }

            println("Input Data:$inputStr")

        }
    }
}


코드 수행시 text를 입력받아 test라는 파일을 생성하는 코드 입니다.


위 예제에서 사용된 Configuration() 이나 FileSystem 등의 class는 org.apache.hadoop.fs 패키지에 존재합니다.

IDE에서 자동완성시 해당 package를 import하도록 해야 합니다.


Kotlin의 main

추가적으로 kotlin으로 작성되었기에 일반 자바의 main함수의 사용을 아래와 같이 해야 합니다.

class HadoopTest {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
...


java의 main 함수를 companion object 내부에 넣어서 static으로 만들어 줘야 하며, 다른 자바 class에서 호출 가능하도록 @JvmStatic을 annotation으로 달아줘야 나중에 정상적으로 실행시킬 수 있습니다.


사용된 package

코틀린으로 사용하다보니 코드가 간소화 되어 변수의 class명이 생략되었습니다.
부가적인 설명을 하면
1. hdfsFileSystem.create() 하면 FSDataoutputStream 객체가 반환됩니다.
2. hdfsFileSystem.open() 하면 FSDataInputStream 객체가 반환됩니다.

실행

~ hadoop jar [jar파일] [main 함수가 있는 class 전체 경로] <args>

~ hadoop jar ./comhadooptest5.jar com.hadoop.test5.HadoopTest myfirsthadoop

위와 같이 실행하면 hdfs 내부에 "test"란 파일을 생성합니다.
해당 파일을 cat 해보면 "myfirsthadoop"이란 단어가 들어가 있는걸 확인할 수 있습니다.

참고로 IntelliJ에서 jar 파일 생성하는 방법은 하기 링크를 확인하시기 바랍니다.


반응형