java로 hdfs 접근

hdfs에 있는 파일을 java로 직접 꺼내야 할 때 쓰는 방법이다.

maven을 사용했다.

pom.xml은 아래와 같다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>example</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>text</name>
	<build>
		<defaultGoal>compile</defaultGoal>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.3</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.1</version>
				<configuration>
					<port>8080</port>
					<path>/HDFSVideoDemo</path>
					<uriEncoding>UTF-8</uriEncoding>
					<finalName>HDFSVideoDemo</finalName>
					<server>tomcat7</server>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>3.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>3.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-db-client-core</artifactId>
			<version>3.1.1</version>
		</dependency>
	</dependencies>
</project>

의존성을 보면

  • hadoop-hdfs
  • hadoop-common
  • hadoop-db-client-core

3가지 라이브러리가 필요하다.

오프라인 환경에서 사용할 땐 저 3가지 라이브러리에 연계된 라이브러리들도 있기 때문에 사용하는 hadoop 경로의 hdfs, common, client 폴더 하위 jar들 전부 가져와 추가시키면 된다.

/tmp/test.json이라는 파일을 하나 해당 경로에 추가해 놓았다. 가져와서 출력해보자

package servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import java.util.stream.Stream;

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

public class getFile2Stream {

	public static void main(String[] args) throws IOException {

		// hadoop의 configuration을 생성
		Configuration config = new Configuration();

		Path filenamePath = new Path("hdfs://192.168.100.173:9000/tmp/test.json");

		// config를 HDFS로 parse
		FileSystem fs = filenamePath.getFileSystem(config);

		try {

			// filenamePath file을 읽어들임
			FSDataInputStream fout = fs.open(filenamePath);			
			InputStreamReader isr = new InputStreamReader(fout);
            Stream<String> sos = new BufferedReader(isr).lines();
            String s = sos.collect(Collectors.joining());
            
            System.out.println(s)

			fout.close();
			fs.close();

		} catch (Exception e) {
			System.out.println(e);
			System.exit(1);
		}

	}
}

비정형 데이터들 또한 위와 같이 Stream 형식으로 가져와 서버에 다운받을 수 있을 것이다.

Leave a comment