HDFS - 실습 (3)

jaewonnow_·2025년 11월 27일

DataEngineering

목록 보기
4/19

분산형 클러스터 구축

: 분산형 구축은 여러 대의 머신을 이용하여 구축하는 방법.

실제로 데이터를 분산하여 저장할 수 있고, 각 노드들은 서로 다른 머신에 동작시켜 데이터를 분산해 저장할 수 있다. 실제로 많이 사용하는 방법이다.

master : NameNode 와 Jobtracker 를 동작시킬 머신
backupmaster : Secondary NameNode 를 동작시킬 머신
slave 1, 2, 3, 4: DataNode 와 TaskTracker 를 동작시킬 머신

분산 구축을 위한 SSH 설정

master 서버에서 NameNode 와 Jobtracker 가 동작하고 , master 서버가 backupmaster , slave 1, 2, 3, 4 서버에 SSH로 로그인하여 필요한 노드들을 구동시킨다. 이때 SSH 를 사용하여 다른 서버로 접속.

SSH-keygen -t rsa -P '' 로 생성  

hadoop-env.sh
: 하둡이 실행하는 모든 프로세스에 적용되는 시스템 환경 스크립트

# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME.  All others are
# optional.  When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

# Extra Java CLASSPATH elements.  Optional.
# export HADOOP_CLASSPATH=

# The maximum amount of heap to use, in MB. Default is 1000.
# export HADOOP_HEAPSIZE=2000

# Extra Java runtime options.  Empty by default.
# export HADOOP_OPTS=-server

# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
# export HADOOP_TASKTRACKER_OPTS=
# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
# export HADOOP_CLIENT_OPTS

# Extra ssh options.  Empty by default.
# export HADOOP_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR"

# Where log files are stored.  $HADOOP_HOME/logs by default.
# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs

# File naming remote slave hosts.  $HADOOP_HOME/conf/slaves by default.
# export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

# host:path where hadoop code should be rsync'd from.  Unset by default.
# export HADOOP_MASTER=master:/home/$USER/src/hadoop

# Seconds to sleep between slave commands.  Unset by default.  This
# can be useful in large clusters, where, e.g., slave rsyncs can
# otherwise arrive faster than the master can service them.
# export HADOOP_SLAVE_SLEEP=0.1

# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
#       the users that are going to run the hadoop daemons.  Otherwise there is
#       the potential for a symlink attack.
# export HADOOP_PID_DIR=/var/hadoop/pids

# A string representing this instance of hadoop. $USER by default.
# export HADOOP_IDENT_STRING=$USER

# The scheduling priority for daemon processes.  See 'man nice'.
# export HADOOP_NICENESS=10

export 의 Option 을 정하는 코드로 JVM 옵션을 추가한 것이다.

core-site.xml
: 하둡 파일 시스템과 하둡 맵리듀스에 모두 적용할 수 있는 스크립트

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/root/data-hadoop</value>
        </property>
</configuration>

기본 파일 시스템 이름 , 임시(tmp) 디렉토리 주소의 위치를 설정한 것

hdfs-site.xml
: 하둡 분산 파일 시스템 설정 스크립트

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

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

데이터들의 복제본 - Slave 1,2,3,4 4대의 머신이 존재하니까 dfs.replication 의 개수를 3개로 설정한 것 (4대라서 3개가 아니라 복제본의 기본값)

mapred-site.xml
: 하둡 맵리듀스 설정 스크립트

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>localhost:9001</value>
        </property>
</configuration>

Jobtracker 가 실행되는 주소를 정의할 수 있다.

masters / slave
masters: 세컨더리 네임노드가 동작하는 노드를 명시
slaves : 데이터노드와 태스크 트래커가 동작하는 노드를 명시
NameNode 포맷
Hadoop 클러스터를 처음 만들 때 (최초 1회) NameNode 가 쓸 메타데이터 저장소가 아직 빈 폴더 상태 → 포맷으로 HDFS 생성 필요하다.

start-all.sh

# Start all hadoop daemons.  Run this on master node.

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

if [ -e "$bin/../libexec/hadoop-config.sh" ]; then
  . "$bin"/../libexec/hadoop-config.sh
else
  . "$bin/hadoop-config.sh"
fi

# start dfs daemons
"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR

# start mapred daemons
"$bin"/start-mapred.sh --config $HADOOP_CONF_DIR

start-all.sh 를 통해 start-dfs , start-mapred 쉘 스크립트 파일을 열게 된다.

Node 개별 명령어

namenode 명령어

namenode 를 동작시키는 명령어 : 만약 동작 중 NameNode 에 문제가 발생시 NameNode 만 개별 실행 가능

bin/hadoop namenode 2>namenodelogfile.log&

Secondarynamenode 명령어

Secondarynamenode 를 동작시키는 명령어 : 만약 동작 중 Secondary NameNode 에 문제가 발생시 SecondaryNameNode 만 개별 실행 가능

bin/hadoop Secondarynamenode 2>Secondarynamenodelogfile.log&

datanode 명령어

datanode 를 동작시키는 명령어 : 만약 동작 중 datanode 에 문제가 발생시 datanode 만 개별 실행 가능

bin/hadoop datanode 2>datanodelogfile.log&

dfsadmin 명령어

하둡 분산 파일 시스템의 관리자 권한의 명령 실행 가능
자세한건 dfsadmin --help를 이용하자

bin/hadoop dfsadmin -report

HDFS 에서의 Multi-Thread

HDFS 에서의 멀티 쓰레드 기반 파싱은 단일 프로세스보다 빠르기 때문에 성능적 측면에서 앞선다.

그러나 고려할 점은 WordCount 작업에서의 단어 빈도수에 대한 최종 결과를 여러 쓰레드들이 공유하므로 정확한 데이터 처리를 하기 위해선 Lock 이 필요하다

결국 멀티 쓰레드에서도 하나의 쓰레드만 공유 데이터를 읽고 써야 한다. 멀티 쓰레드를 사용하는 순간 락은 필수 불가결적인 요소이고, 그로 인해 데이터 처리 속도가 지연되거나 에러가 발생할 수 있다.

락으로 인한 성능 감소를 막기 위해서 중간 카운팅 결과를 Combiner 가 메모리에 저장 하여 데이터 처리 속도를 일부 향상할 수 있다.

Big Data + MultiThread

근데 처리해야 할 데이터가 페타바이트 규모라면? 중간 카운팅 메모리도 굉장히 큰 용량을 가질 것이고 이는 메모리에 담을 수 없을 것이다. 위의 문제는 분할 처리하는 방법으로 이어진다.

한 데이터를 분할하여 저장하고 단일 머신에서 각각의 분할된 데이터를 파싱하고 카운팅하는 구조를 생각할 수 있다. 이조차 메모리 문제를 해결하지 못한다. 분할되거나 분할되지 않는 데이터의 중간 카운팅 메모리는 동일하기 때문이다.

WORM 속성

Map 작업 후 Key-Value 쌍들을 모아놓은 것을 Data Collection 이라고 하는데

이들은 WORM 속성을 가지고 , 서로 의존관계를 가지지 않는다.

WORM 속성이란 WORM = Write Once, Read Many 를 뜻한다.

WORM 속성을 가지면 데이터를 읽어서 분석하는 과정을 병렬화할 수 있다. 서로 의존관계를 가지고 있지 않으므로, 읽고 처리하는 과정의 순서가 달라도 같은 결과를 가질 수 있다.

두 속성을 가지는 Data Collection 은 여러 데이터를 쪼개서 각자의 일을 수행하고 모아서 처리하는데 용이해진다.

profile
0 to 100 Data Engineer

0개의 댓글