single node cluster 설치
- JAVA_HOME 환경변수 설정
- 그냥 hadoop 명령을 사용할 수 있음
SSH key 설정
각 서버에서 RSA 키 생성
ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -P ""
authorized_keys 파일에 추가
각 서버의 퍼블릭 키(id_rsa.pub) 파일을 모아서 마스터 노드의 ~/.ssh/authorized_keys 파일에 덧붙여야 함
게이트웨이 호스트에서 각 (마스터/데이터) 노드 호스트로부터 퍼블릭 키 파일을 복사해 와서 합침
rcp terzeron@데이터노드호스트:~/.ssh/id_rsa.pub 데이터노드호스트.pub
cat 데이터노드호스트.pub >> total.pub
게이트웨이 호스트에서 각 (마스터/데이터) 노드 호스트에 합쳐진 퍼블릭 키 파일을 복사하고 authorized_keys 파일에 덧붙임
rcp total.pub terzeron@마스터노드호스트:~/.ssh/total.pub
rsh -l 마스터노드호스트 "cd .ssh; cat total.pub >> authorized_keys; rm -f total.pub"
패스워드 입력없이 노드 간 ssh 로그인이 되는지 확인할 것
하둡 실행 전에 미리 known_hosts에 등록하기
for f in `cat apps/hadoop-2.7.1/etc/hadoop/slaves`; do ssh -oStrictHostKeyChecking=no $f "exit"; done
pseudo-distributed operation 설치
etc/hadoop/core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://네임노드IP:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/terzeron/hdfs/tmp</value>
</property>
reboot 후에 /tmp 하위 디렉토리의 데이터가 삭제될 수 있으므로 지정 필요함
etc/hadoop/hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
bin/hdfs namenode -format - sbin/start-dfs.sh
- namenode와 datanode를 실행함
- 여기서 실패하면 ssh localhost가 안 되어서 그럴 수 있으므로 확인할 것
- 서비스를 종료하려면
sbin/stop-dfs.sh
java process 확인
jps
NameNode와 DataNode, SecondaryNameNode가 실행되고 있는 것을 확인할 것
port mapping
9000: DataNode
Yarn 시작
sbin/start-yarn.sh
디렉토리 생성
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/terzeron
etc/hadoop 디렉토리를 input 디렉토리로 복사
hdfs dfs -put etc/hadoop input
input 디렉토리 확인
hdfs dfs -ls input
input 디렉토리에 대해 grep을 M/R로 수행하고 그 결과를 output 디렉토리에 저장
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar grep input output 'dfs[a-z.]+'
HDFS의 output 디렉토리를 로컬 하드의 output 디렉토리로 복사
hdfs dfs -get output output
HDFS의 output 디렉토리에 존재하는 파일 내용을 확인
hdfs dfs -cat output/*
Cluster 설치
JAVA_HOME 환경변수 설정
1.7까지만 권장
HADOOP_PREFIX 환경변수 설정
하둡의 기본 heap 크기는 1000MB임
HADOOP_HEAPSIZE, YARN_HEAPSIZE 환경변수 이용
설정 파일
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://10.24.12.202:59000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/terzeron/hdfs/tmp</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/terzeron/hdfs/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/terzeron/hdfs/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
etc/hadoop/slaves 파일 작성하기
클러스터 시작하기
bin/hdfs namenode -format 클러스터이름
reformat시에, 같은 클러스터에 속한 datanode가 내려가고 데이터가 삭제될 수 있음
sbin/hadoop-daemon.sh -script hdfs start namenode
sbin/hadoop-daemons.sh -script hdfs start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemons.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
클러스터 중단하기
sbin/hadoop-daemon.sh -script hdfs stop namenode
sbin/hadoop-daemons.sh -script hdfs stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemons.sh stop nodemanager
sbin/mr-jobmistory-daemon.sh stop historyserver
Troubleshooting
1
ls: '.': No such file or directory
사용자 홈디렉토리가 없어서 생기는 문제임
hadoop fs -mkdir -p /home/terzeron/
2
WARN util.NativeCodeLoader: Unable to load native-hadoop library for our platform… using builtin-java classes where applicable ls: '.': No such file or directory
비트가 맞지 않아서 생기는 문제임
소스 컴파일을 할 것
maven 설치
mvn package -Pdist,native -DskipTest=true -Dtar
3
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.lang.IllegalArgumentException: Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority.
네임노드 접속 url을 설정 파일에 지정하지 않아서 생긴 문제임
core-site.xml의 fs.default.name 항목의 값을 지정할 필요가 있음
4
java.net.BindException: Problem binding to 0.0.0.0:50010
java.net.BindException: 주소가 이미 사용 중입니다; For more details see: http://wiki.apache.org/hadoop/BindException
해당 포트번호가 다른 프로세스에 의해 사용되고 있음 - lsof -i:포트번호 - 어떤 프로세스가 해당 포트를 점유했는지 확인하고 필요하면 core-site.xml의 포트를 변경해야 함
5
java.io.IOException: Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
위 에러 항목 참고
6
WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /home/terzeron/hdfs/datanode: namenode clusterID = CID-6b2568db-1a8e-455f-b6e1-2a725d3bfbe4; datanode clusterID = CID-6a708635-eecc-40af-a054-189f317bb482 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool (Datanode Uuid unassigned) service to localhost/127.0.0.1:9000. Exiting. java.io.IOException: All specified directories are failed to load.
hdfs 디렉토리의 datanode/current/VERSION 파일에 기록된 clusterID 값을 네임노드가 알고 있는 값으로 일치시켜야 함
ACL 설정
- DataNode 프로세스가 NameNode로 원격 접속을 하기 때문에 NameNode의 port에 대해 ACL을 허용하는 설정이 필요할 수 있음
- core-site.xml의 fs.defaultFS 항목 값 중 port 번호 참고할 것
- 어드민 웹 페이지
- NameNode는 50070 포트를
- DataNode는 50010과 50020 포트를 점유하고 있음
- 기본 포트 설정
- 50010: datanode (data transfer) (O)
- 50020: datanode IPC (O)
- 50030: MR jobtracker http
- 50060: MR tasktracker http
- 50070: namenode http (O)
- 50075: datanode http (O)
- 50090: secondary namenode http (O)
- 50091: secondary namenode https
- 8031: resourcemanager RMI
- 8040: nodemanager localizer
- 8042: jetty http
- 8088: yarn http
참고 문서
- 기본 설정
- http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/core-default.xml
- http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- http://keithwiley.com/writing/HowToDeployHadoopYarnOnEC2.shtml
- Yarn 클러스터 구성에 대해 자세한 내용이 기술되어 있음
- EC2 환경에 Cloudera 버전을 설치하는 내용이지만 Yarn 클러스터 설치 및 구동은 큰 차이 없음
- http://www.openankus.org/download/attachments/6193569/하둡 클러스터 구축 과정_v1.2.pdf?version=1&modificationDate=1413867217456&api=v2