본문 바로가기

Frameworks/Hadoop

Windows 환경에서 간편하게 Hadoop 설치하기

0. 시작에 앞서

이 문서의 내용은 Hadoop Wiki에 나와있는 Windows에서 Hadoop 2.x (또는 그 이상) 버전을 빌드, 설치하는 방법의 핵심만 추출하여 인용하였다.

만약, 이 문서를 따르지 않고 Apache Hadoop official site에서 binary를 다운 받아서 진행한 경우 HDFS 데몬을 실행하는 과정에서 아래와 같은 3가지 에러 메시지를 확인 할 수 있으며 경험상 디버깅이 불가능하다.

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

FATAL datanode.DataNode: Exception in secureMain
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

FATAL datanode.DataNode: Exception in secureMain
java.lang.NullPointerException

하둡을 설치할 때에는 반드시 직접 빌드하거나, 빌드된 버전을 다운받아서 진행해야 한다.

1. 설치 준비

준비물: java, hadoop binaries

apache official site에서 제공되는 binaries는 winutils.exe 등을 포함하지 않으므로 hadoop을 build 해야한다.
하지만 어떤 고마운 사람들이 pre-compiled version을 올려주기도 한다.


참고로, 위 버전의 컴파일 환경이다.

  • Apache Maven 3.2.5
  • CMake 3.1.0
  • MinGW: Minimalist GNU for Windows, specifically with sh, mkdir, rm, cp, tar, and gzip.
  • Oracle Java 7u71. Note that the newer Java 8 will not work out of the box due to doclint errors.
  • Google Protocol Buffers 2.5.0. The pom file is hard-coded to use 2.5.0.
  • Microsoft Windows SDK for Windows 7 and .NET Framework. Alternatively, you may use Visual Studio 2010 Professional. Visual Studio 2012 and later will not work without modification of the build scripts.

환경 변수에 JAVA_HOME이라는 이름으로 java 설치 경로를 입력해준다. 이 때 공백(space)이 있으면 제대로 동작하지 않을 수 있다.

예)
set JAVA_HOME=C:\Java\jdk1.7.0_45


2. 싱글 노드 클러스터(가상 분산 모드) 구성하기

2.1. HDFS 환경설정

pre-compiled binaries 압축 파일을 풀면 여러 폴더가 있다.
그 중에 etc\hadoop은 여러가지 환경설정을 저장하고 있는 폴더이다.

편의상 하둡이 설치된 경로를 %HADOOP_PREFIX%라고 표시한다.

%HADOOP_PREFIX%\etc\hadoop\hadoop-env.cmd 파일을 열어 파일의 끝에 다음을 추가한다. 예시에서 c:\deploy가 하둡이 설치된 경로이다.

set HADOOP_PREFIX=c:\deploy
set HADOOP_CONF_DIR=%HADOOP_PREFIX%\etc\hadoop
set YARN_CONF_DIR=%HADOOP_CONF_DIR%
set PATH=%PATH%;%HADOOP_PREFIX%\bin

%HADOOP_PREFIX%\etc\hadoop\core-site.xml 파일을 열어 다음과 같이 설정한다.

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://0.0.0.0:19000</value>
  </property>
</configuration>

%HADOOP_PREFIX%\etc\hadoop\hdfs-site.xml 파일을 열어 다음과 같이 설정한다.

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

%HADOOP_PREFIX%\etc\hadoop\slaves 파일을 열어 다음과 같이 설정한다.

localhost


2.2. YARN 환경설정

%HADOOP_PREFIX%\etc\hadoop\mapred-site.xml 파일을 열거나 생성하여 다음과 같이 설정한다.

<configuration>
   <property>
     <name>mapreduce.job.user.name</name>
     <value>%USERNAME%</value>
   </property>

   <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
   </property>

  <property>
    <name>yarn.apps.stagingDir</name>
    <value>/user/%USERNAME%/staging</value>
  </property>

  <property>
    <name>mapreduce.jobtracker.address</name>
    <value>local</value>
  </property>
</configuration>

%HADOOP_PREFIX%\etc\hadoop\yarn-site.xml 파일을 열거나 생성하여 다음과 같이 설정한다.

<configuration>
  <property>
    <name>yarn.server.resourcemanager.address</name>
    <value>0.0.0.0:8020</value>
  </property>

  <property>
    <name>yarn.server.resourcemanager.application.expiry.interval</name>
    <value>60000</value>
  </property>

  <property>
    <name>yarn.server.nodemanager.address</name>
    <value>0.0.0.0:45454</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

  <property>
    <name>yarn.server.nodemanager.remote-app-log-dir</name>
    <value>/app-logs</value>
  </property>

  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/dep/logs/userlogs</value>
  </property>

  <property>
    <name>yarn.server.mapreduce-appmanager.attempt-listener.bindAddress</name>
    <value>0.0.0.0</value>
  </property>

  <property>
    <name>yarn.server.mapreduce-appmanager.client-service.bindAddress</name>
    <value>0.0.0.0</value>
  </property>

  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>

  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>-1</value>
  </property>

  <property>
    <name>yarn.application.classpath</name>
    <value>
     %HADOOP_CONF_DIR%,
     %HADOOP_COMMON_HOME%/share/hadoop/common/*,
     %HADOOP_COMMON_HOME%/share/hadoop/common/lib/*,
     %HADOOP_HDFS_HOME%/share/hadoop/hdfs/*,
     %HADOOP_HDFS_HOME%/share/hadoop/hdfs/lib/*,
     %HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*,
     %HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*,
     %HADOOP_YARN_HOME%/share/hadoop/yarn/*,
     %HADOOP_YARN_HOME%/share/hadoop/yarn/lib/*
    </value>
  </property>
</configuration>


2.3. 환경변수 초기화

%HADOOP_PREFIX%\etc\hadoop\hadoop-env.cmd 파일을 실행시킨다.


2.4. 파일시스템 포맷

command line에서 다음과 같은 명령을 통해 파일 시스템을 포맷시킨다. 실행결과가 에러메시지 없이 종료되었다면 포맷이 성공한 것이다.

%HADOOP_PREFIX%\bin\hdfs namenode -format


2.5. HDFS 데몬 시작

command line에서 다음과 같은 명령을 통해 localhost에서 NameNode와 DataNode가 실행시킨다.

%HADOOP_PREFIX%\sbin\start-dfs.cmd

제대로 HDFS 데몬이 실행되고 있다면, 다음과 같이 파일을 넣어서 테스트를 할 수 있다. 다시 한번 말하지만 C:\deploy는 하둡이 설치된 경로이다.

C:\deploy>bin\hdfs dfs -put myfile.txt /

C:\deploy>bin\hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - username supergroup          4640 2014-01-18 08:40 /myfile.txt

C:\deploy>


2.6. YARN 데몬 시작 및 YARN job 실행

command line에서 다음과 같은 명령을 통해 YARN 데몬을 실행시킨다.

%HADOOP_PREFIX%\sbin\start-yarn.cmd

클러스터가 제대로 동작하는지 확인하기 위해서 다음과 같은 wordcount job을 실행시킬 수 있다. 실행하기 전에 example jar 파일이 올바른 경로에 있는지 확인하고 동작시켜야 한다.

%HADOOP_PREFIX%\bin\yarn jar %HADOOP_PREFIX%\share\hadoop\mapreduce\hadoop-mapreduce-examples-2.6.0.jar wordcount /myfile.txt /out