본문 바로가기

업무 채널

이클립스를 이용한 하둡 hadoop hdfs 파일전송 (샘플 소스)

이클립스를 이용하여 하둡 hdfs 파일전송을 하는 방법을 알아보자

먼저 하둡 hdfs 파일전송 프로젝트를 작성해야한다.

 

1. 이클립스 프로젝트 생성

 

2. Dependency jar 파일 추가 (하단 이미지 참조)

 

3. 소스 작성

 

샘플소스 >>

import java.io.IOException;

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;

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

  Configuration conf = new Configuration();
  conf.set("fs.default.name", "hdfs://server:9000");
  FileSystem dfs = FileSystem.get(conf);
  
  System.out.println("Home Path : " + dfs.getHomeDirectory());
  System.out.println("Work Path : " + dfs.getWorkingDirectory());
  
  Path filenamePath = new Path("/tmp/hello.txt");
  System.out.println("File Exists : " + dfs.exists(filenamePath));
  
  if(dfs.exists(filenamePath)) {
   dfs.delete(filenamePath, true);
  }
  
  FSDataOutputStream out = dfs.create(filenamePath);
  out.writeUTF("Hello, world!\n");
  out.close();
  
  FSDataInputStream in = dfs.open(filenamePath);
  String messageIn = in.readUTF();
  System.out.print(messageIn);
  in.close();
  
  dfs.close();
 }

 

소스 내용 >>

HDFS(경로 폴더)로 hello.txt 라는 파일 생성

hello.txt 에 'Hello, world!\n' 쓰기

hello.txt 읽어서 출력

 

 

 java.io.IOException: Permission denied 에러 발생시 해결방안 

 

실행을 해보니 아래와 같은 오류가 발생하였다.

 

java.io.IOException: Permission denied 에러 발생 >>

 Exception in thread "main" org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=CKNB, access=WRITE, inode="user":root:supergroup:rwxr-xr-x
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:95)
at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:57)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.<init>(DFSClient.java:3424)
at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:866)
at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:193)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:555)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:536)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:443)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:435)
at HDFSClient.main(HDFSClient.java:28)
Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.security.AccessControlException: Permission denied: user=CKNB, access=WRITE, inode="user":root:supergroup:rwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:199)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:180)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:128)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5422)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:5396)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1314)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1266)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:661)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:640)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:578)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1393)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1389)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1387)

at org.apache.hadoop.ipc.Client.call(Client.java:1107)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:229)
at $Proxy1.create(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:85)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:62)
at $Proxy1.create(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.<init>(DFSClient.java:3417)
... 7 more

 

확인해보니 사용 권한이 없는 폴더에 대한 읽기/쓰기의 경우 이러한 에러가 발생한다.

 

해당 폴더에 대한 권한을 주었다.

 # bin/hadoop fs -chmod 777 /tmp/

 

777 은 모든 사용자에게 권한을 부여하는 것이다.

 

리눅스 파일 권한 설정 참조 >>

-rwxrwxrwx ( 777 )
-r--r--r--
( 444 )
-rwx--x--x ( 711 )

2~4필드 : 소유주 ( User ) 권한
5~7필드 : 그룹 ( Group ) 권한
8~10필드 : 나머지 ( Others ) 권한

 

 

 실행 결과 

 

다시 실행하니 오류없이 실행되었다.

 

 

원격 접속하여 생성된 파일을 확인해 보았다.

 

 

리눅스 단에서 파일 내용확인