본문 바로가기

Bigdata Hadoop

빅 데이터 - 클러스터 환경: Raspberry Pi-4, Hadoop 및 Spark 기반

반응형

 

소개:

 

이 글에는 라즈베리 파이 - 4를 사용하여 저비용 고성능 빅데이터 클러스터를 만드는 자세한 지침이 포함되어 있습니다.

 

요즘 업계에서 유행하는 단어는 "빅데이터"이며, EPDT 프로그램에서 Saurabh 교수님의 지식 공유 세션에서 영감을 얻어 이 프로젝트를 시작하기로 결심했습니다.

 

이 프로젝트는 큰 시간이나 비용을 투자하지 않고도 하둡, 스파크, 클러스터 컴퓨팅에 익숙해지는 것을 목표로 합니다.

 

이 프로젝트는 라즈베리 파이 4를 사용하여 네트워크 스위치를 통해 서로 통신하는 3개의 노드로 구성된 네트워크 클러스터를 구축하고, HDFS를 설치하고, 전체 클러스터에서 YARN을 통해 분산 처리 작업으로 스파크가 실행되도록 할 것입니다.

 

이 글의 출처 문서를 따라가려면 이 링크를 클릭하세요.

 

이 글에서 다룰 내용:

 

  • Ubuntu Server LTS 20.04 설치로 개별 Raspberry Pi-4 설정
  • 물리적 클러스터 설정
  • 클러스터 설정 - 공개 키 SSH 인증, 정적 IP, 호스트/호스트 이름 구성
  • Hadoop 설치 - 단일 노드 및 다중 노드; Hadoop 3.2.1
  • Spark 설치 - YARN 및 Spark Shell을 통한 Spark 작업; Spark 3.0.1

 

하드웨어 구성 요소: 

 

Qty  Item  Configuration
3 Raspberry Pi – 4 8GB RAM
4 Cat6 Lan cable 1 Foot each
3 Power adaptor or multiport USB Adaptor :4 USB port – 5.2v min. 2.5A
3 SD cards Class 10, high speed
1 4 Port Ethernet switch 4 Port Gigabit Switch Hub

 

클러스터 구성: 

 

CPU each node: Quad-core Cortex-A72 (ARM v8) 64-bit SoC @1.5GHz

RAM : 8 x 3 = 24 GB LPDDR4

Storage: 64 x 3 = 192 GB  

 

Source:

 

물리적 클러스터 설정

 

 

1. 비용 효율적인 서버 랙

설치를 시작하려면 스페이서 스택에 Raspberry Pi를 설치합니다. 이 스페이서는 모든 전자 상거래 사이트에서 찾을 수 있습니다.

 

2. 네트워크 연결

저는 제 설치를 위해 4포트 TP-link 스위치를 통해 연결된 라우터의 유선 이더넷 연결을 사용했습니다. 또한 각 RPi-4는 1피트 cat-6 LAN 케이블을 통해 스위치에 연결됩니다.

 

3. 전원 공급 장치

전원 공급 장치를 구성하는 데는 여러 가지 옵션이 있습니다.

각 포트에서 5.2v 2.5A ~ 3A를 공급할 수 있는 다중 포트 고전력 USB 전원 어댑터를 사용합니다.

RPi-4는 고성능과 관련하여 전력에 민감하기 때문에 공식 Raspberry Pi Foundation의 전원 공급 장치를 사용하여 노드에 개별적으로 전원을 공급하는 것이 제가 선호하는 방식입니다.

 

4. 개별 Raspberry Pi 설치

 

4.1. Ubuntu Server LTS 20.04 설치

 

Raspberry Pi Imager를 사용하여 각 pi에 Ubuntu Server LTS 20.04 64비트를 기록합니다. 

라즈베리파이에 설치하는 방법은 다음 문서를 참고하세요. 

 

 

 

4.1. Pi 구성

 

Pi 구성 각 RPi에 SSH를 실행하고 몇 가지 기본 구성을 설정합니다. 각 Pi의 IP 주소를 얻는 데 어려움이 있는 경우 다음 방법을 시도해 보세요.

 

1. Fing 모바일 애플리케이션을 설치하고 wifi 네트워크에 연결하면 Ubuntu라는 이름과 IP 주소가 있는 연결된 장치 목록이 표시됩니다.

 

2. 라우터에 로그인하고 Ubuntu라는 이름이 있는 연결된 장치 목록을 확인합니다.

 

3. 편의에 따라 SSH 클라이언트를 다운로드하여 설치하세요. 저는 Putty를 선호합니다. 간편하고 다양한 용도로 사용할 수 있기 때문입니다.

 

주의: 한 번에 하나의 Pi를 플러그인하세요. 다음 Pi로 이동하기 전에 설정 구성을 완료하세요.

 

기본값 -

 

User Name: Ubuntu

Password: Ubuntu

 

연결되면 기본 비밀번호를 변경하라는 메시지가 표시됩니다. 각 RPi에서 동일한 업데이트된 비밀번호가 안전하고 기억하기 쉬운 비밀번호인지 확인하세요.

 

다음 명령을 사용하여 Pi의 시간이 동기화되었는지 확인하세요.

 

timedatectl status – 이렇게 하면

 

Last login: Tue Aug 3 23:55:14 2021 from 192.168.0.xxx

 

Last login: Tue Aug  3 23:55:14 2021 from 192.168.0.xxx
ubuntu@pi01:~$ timedatectl status
               Local time: Fri 2021-08-06 23:26:52 IST
           Universal time: Fri 2021-08-06 17:56:52 UTC
                 RTC time: n/a
                Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

시스템 시계가 동기화되고 NTP 서비스가 활성화되어 있으면 사용할 수 있습니다.

그렇지 않으면 다음 명령을 사용하여 구성합니다.

timedatectl list-timezones – 사용 가능한 시간대 목록을 표시합니다.

sudo timedatectl set-timezone Asia/Kolkata - 인도에 있는 경우, 그렇지 않은 경우 시간대를 적절히 선택합니다.

Ubuntu의 최신 구성을 업데이트하려면 다음 명령을 실행하여 개별 구성을 완료합니다. 

 

sudo apt update

sudo apt upgrade

sudo reboot 

 

업데이트 명령 후 캐시 잠금 오류가 발생하면 Pi를 재부팅하고 다음을 다시 시도하세요. 

 

Ctrl+c 

 

Sudo reboot 

 

클러스터 설정

새로운 비밀번호로 모든 RPi에 연결할 수 있다면 클러스터 설정을 진행할 수 있습니다. 여기서는 정적 IP, 호스트/호스트 이름, 공개 키 SSH 인증을 설정하여 각 Pi가 암호화된 키를 사용하여 비밀번호 없이 통신할 수 있도록 합니다.

1. 정적 IP 설정

다음 단계는 각 Pi에서 수행해야 합니다.

Ubuntu Server LTS 20.04는 네트워크 구성을 위해 Netplan이 필요합니다. 특히 몇 가지 yaml 파일을 편집합니다.

Pi에 SSH를 실행하고 다음을 실행하여 네트워크 인터페이스의 이름을 찾습니다. 

 

ip a 

 

출력 정보는 다음과 같이 표시되어야 합니다: 

 

ubuntu@pi01:~$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:a6:32:f8:a5:ce brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.xx/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::dea6:32ff:fef8:a5ce/64 scope link
       valid_lft forever preferred_lft forever

3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    link/ether dc:a6:32:f8:a5:cf brd ff:ff:ff:ff:ff:ff

 

네트워크 인터페이스 이름은 eth0 태그입니다. 이 점을 염두에 두거나 메모장을 만들어 이러한 세부 정보를 정리하고 나중에 참조할 수 있도록 저장하세요.

다음으로, nano가 구성 파일을 편집합니다.

다음 명령을 사용하여 구성 파일을 편집하여 자동 네트워크 구성을 비활성화합니다. 

 

sudo nano /etc/cloud/cloud.cfg.d/99-disable-config.cfg 

 

새로 만든 파일에 추가하기만 하면 됩니다: 

 

network: {config: disabled} 

 

이제 50-cloud-init.yaml 파일을 편집하여 고정 IP를 설정합니다. 다음 명령을 사용합니다: 

 

sudo nano /etc/netplan/50-cloud-init.yaml 

 

위 파일을 열면 다음 모습입니다.

 

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: true
            dhcp6: true
            match:
                macaddress: 2c:cf:67:29:f8:5c
            set-name: eth0
    version: 2

 

고정 IP를 설정하는 기본 템플릿은 다음과 같습니다: 

 

network:
    ethernets:
        {Network Interface Name}:
            dhcp4: false
            addresses: [{Specifc IP Adress}/24]
            gateway4: {Gateway Address}
            nameservers:
                addresses: [{Gateway Address}, 8.8.8.8]
    version: 2

 

제 구성 파일은 다음과 같습니다: (X는 각 Pi의 특정 IP 주소 마지막 숫자, 192.168.0.116, 192.168.0.115, 192.168.0.114 등). 

 

GNU nano 4.8            /etc/netplan/50-cloud-init.yaml

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: false
            addresses: [192.168.0.xx/24]
            gateway4: 192.168.0.1
            nameservers:
                addresses: [192.168.0.xx, 8.8.8.8]
    version: 2

 

파일을 편집한 후 다음 명령을 사용하여 설정을 적용합니다: 

 

sudo netplan apply 

 

이 명령은 SSH 세션을 중단하고 새 터미널 세션을 생성한 다음 위의 구성에 따라 새 IP 주소를 사용하여 Pi에 SSH합니다.

 

그런 다음 Pi를 재부팅하고 를 사용하여 고정 IP 주소가 올바르게 설정되었는지 확인합니다: 

 

ip a 

 

2. 호스트/호스트 이름 구성

다음 단계는 각 Pi에서 수행해야 합니다.

모든 클러스터가 서로 완벽하게 통신하도록 하려면 호스트 및 호스트 이름 파일을 특정 RPi 정보로 구성해야 합니다.

먼저 RPi에 SSH를 실행하고 다음을 사용하여 호스트 이름 파일을 업데이트합니다.

sudo nano /etc/hostname

호스트 이름 파일은 다음과 같아야 합니다(X는 각 Pi의 특정 IP 주소의 마지막 숫자):

pi0X 

 

예를 들어, pi01의 호스트 이름 파일은 다음과 같습니다: 

 

pi01 

 

다음으로 다음 명령을 사용하여 호스트 파일을 업데이트해야 합니다: 

 

sudo nano /etc/hosts 

 

편집 후 호스트의 파일은 다음과 같이 표시되어야 합니다: 

 

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
 
192.168.0.xxx pi01
192.168.0.xxx pi02
192.168.0.xxx pi03

 

파일에서 localhost 127.0.0.1 줄을 삭제해야 합니다.

주소 지정은 간단합니다, 

 

{IP Address} {hostname} 

 

참고로, 호스트 이름 파일은 각 RPi마다 다르지만 호스트 파일은 동일해야 합니다.

모든 구성이 완료되면 RPi를 재부팅하고 SSH 키 인증으로 넘어갑니다.

 

3. SSH 키 인증 구성

 

다른 작업을 하라는 지시가 있을 때까지 마스터 Pi에서만 이 단계를 수행합니다.

먼저 다음 명령을 사용하여 마스터 RPi에서 ssh 구성 파일을 편집합니다. 

 

nano ~/.ssh/config  

 

각 Pi의 호스트, 사용자, 호스트 이름을 포함하여 모든 노드를 구성 파일에 추가합니다.

구성 파일에 노드를 추가하는 템플릿은 다음과 같습니다. 

 

Host piXX

User ubuntu

Hostname {IP Address} 

 

모든 노드를 파일에 추가한 후 제 설정 파일은 다음과 같이 생겼습니다: 

 

 

Host pi01
User ubuntu
Hostname 192.168.0.xxx
 
Host pi02
User ubuntu
Hostname 192.168.0.xxx
 
Host pi03
User ubuntu
Hostname 192.168.0.xxx
Now, create an SSH key pair on the Pi using:

 

이제 다음을 사용하여 Pi에서 SSH 키 쌍을 생성합니다: 

 

ssh-keygen -t rsa -b 4096 

 

모든 프롬프트에서 enter를 누르세요. 키 쌍은 .ssh 디렉토리에 저장해야 하며 키 쌍은 비밀번호가 없어야 합니다.

 

출력은 다음과 비슷해야 합니다. 

 

Your identification has been saved in /your_home/.ssh/id_rsa
Your public key has been saved in /your_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---[RSA 4096]----+
|                .|
|               + |
|              +  |
| .           o . |
|o       S   . o  |
| + o. .oo. ..  .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o....|
|    =+=ooB=o.... |
+----[SHA256]-----+

 

 

 

 

scp ~/.ssh/authorized_keys piXX:~/.ssh/authorized_keys

scp ~/.ssh/config piXX:~/.ssh/config

 

노드 RPi 2와 RPi 3에서 SSH 키젠을 반복합니다.

 

그런 다음 모든 Pi(마스터 RPi 1 포함)에서 다음 명령을 사용하여 공개 키를 Pi 1의 인증된 키 목록에 복사합니다: 

 

ssh-copy-id pi01 

 

마지막으로 다음 명령을 사용하여 Pi 1의 구성 파일을 나머지 Pi에 복사할 수 있습니다.

 

아래 명령은 마스터 RPi01에서만 실행해야 하며, XX는 RPi의 특정 숫자 식별자(Rpi02, Rpi03)를 나타냅니다. 

 

scp ~/.ssh/authorized_keys piXX:~/.ssh/authorized_keys

scp ~/.ssh/config piXX:~/.ssh/config 

 

이제 비밀번호를 입력하지 않고도 모든 RPis에서 모든 노드에 ssh할 수 있어야 합니다.

 

그렇지 않은 경우 계속 진행하기 전에 구성 설정을 다시 참조하여 문제를 해결하세요. 

 

4. bashrc를 사용한 클러스터 설정

 

이 단계는 사용하기 쉽도록 몇 가지 사용자 정의 함수를 만들기 위해 .bashrc 파일을 편집하는 것으로 시작합니다.

 

마스터 파이에서 먼저 ~/.bashrc 파일을 편집합니다: 

 

nano ~/.bashrc 

 

이 파일 내에서 파일 하단에 다음 코드를 추가합니다: 

 

 

# Hadoop cluster management functions
 
#   list what other nodes are in the cluster
function cluster-other-nodes {
    grep "pi" /etc/hosts | awk '{print $2}' | grep -v $(hostname)
}
 
#   execute a command on all nodes in the cluster
function cluster-cmd {
    for node in $(cluster-other-nodes);
    do
        echo $node;
        ssh $node "$@";
    done
    cat /etc/hostname; $@
}
 
#   reboot all nodes in the cluster
function cluster-reboot {
    cluster-cmd sudo reboot now
}
 
#   shutdown all nodes in the cluster
function cluster-shutdown {
    cluster-cmd sudo shutdown now
}
 
function cluster-scp {
    for node in $(cluster-other-nodes);
    do
        echo "${node} copying...";
        cat $1 | ssh $node "sudo tee $1" > /dev/null 2>&1;
    done
    echo 'all files copied successfully'
}
 
#   start yarn and dfs on cluster
function cluster-start-hadoop {
    start-dfs.sh; start-yarn.sh
}
 
#   stop yarn and dfs on cluster
function cluster-stop-hadoop {
    stop-dfs.sh; stop-yarn.sh

}

 

마스터 Pi에서 .bashrc 파일을 소싱합니다: 

 

source ~/.bashrc 

 

이제 다음 명령을 사용하여 .bashrc를 모든 작업자 노드에 복사합니다: 

 

cluster-scp ~/.bashrc  

 

마지막으로 다음 명령을 실행하여 모든 노드에서 .bashrc 파일을 소싱합니다: 

 

cluster-cmd source ~/.bashrc  

 

이제 작동하는 클러스터 컴퓨터가 생겼습니다.

 

병렬 처리 작업을 실행하기 위해 먼저 Hadoop을 설치한 다음 Spark를 설치하겠습니다. 

 

Hadoop 3.2.2 설치

 

1. Java 8 설치

 

각 노드에 Java 8을 설치하려면 다음 명령을 사용합니다: 

 

cluster-cmd sudo apt install openjdk-8-jdk 

 

그런 다음 한동안 재부팅하지 않았으므로 다음 명령을 사용하여 Pis를 재부팅합니다: 

 

cluster-reboot 

 

모든 것이 재부팅된 후 마스터 Pi에 SSH로 접속하여 다음 명령을 실행하여 Java가 올바르게 설치되었는지 확인합니다: 

 

cluster-cmd java -version 

 

2. 하둡 싱글 노드 설치

 

별도의 지시가 있을 때까지 마스터 파이(RPi 01)에 대해서만 Hadoop 단일 노드 설치 단계를 수행합니다.

 

다음, wget을 사용하여 마스터 RPi에 다운로드합니다. 

 

wget https://downloads.apache.org/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz 

 

다음으로 다음 명령을 사용하여 tar 파일을 압축을 풀고 바이너리를 /opt 디렉터리로 옮깁니다: 

 

sudo tar -xvf hadoop-3.2.2.tar.gz -C /opt/ && cd /opt 

 

디렉터리 이름을 hadoop-3.2.2에서 hadoop로 변경합니다: 

 

sudo mv hadoop-3.2.2 hadoop 

 

디렉터리에 대한 권한을 변경합니다. 

 

sudo chown ubuntu:ubuntu -R /opt/hadoop  

 

.profile, .bashrc 및 hadoop-env.sh 환경 변수 설정 .profile을 편집하여 Hadoop 바이너리를 PATH에 추가합니다: 

 

nano /opt/hadoop/.profile 

 

다음 줄을 추가합니다: 

 

PATH=/opt/hadoop/hadoop/bin:/opt/hadoop/hadoop/sbin:$PATH  

 

.bashrc 파일을 다음과 같이 편집합니다. 

 

nano ~/.bashrc  

 

파일 하단에 다음 환경 변수를 추가합니다. 

 

# path and options for java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
 
# path and options for Hadoop
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

 

그런 다음 .bashrc 파일을 소싱하여 업데이트되도록 합니다. 

 

source ~/.bashrc  

 

다음으로, /opt/hadoop/etc/hadoop/hadoop-env.sh에서 JAVA_HOME의 값을 설정합니다. 올바른 줄을 찾으려면 아래로 스크롤해야 합니다.

해당 줄은 주석 처리됩니다. 줄의 주석 처리를 해제하고 변수에 올바른 경로를 추가합니다.

다음과 같아야 합니다. 

 

...
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
...

 

core-site.xml 및 hdfs-site.xml 설정 

 

다음 명령을 사용하여 core-site.xml 파일을 편집합니다. 

 

nano /opt/hadoop/etc/hadoop/core-site.xml  

 

편집 후에는 다음과 같이 표시되어야 합니다: 

 

 

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://pi01:9000</value>
    </property>
</configuration>



 

그런 다음 hdfs-site.xml 파일을 편집합니다: 

 

nano /opt/hadoop/etc/hadoop/hdfs-site.xml  

 

편집 후 

 

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

 

MapReduce 테스트 

 

포맷 NameNode, 모든 데이터가 삭제될 수 있으니 주의하세요! 

 

hdfs namenode –format  

 

네임노드와 데이터노드를 시작합니다: 

 

start-dfs.sh  

 

MapReduce 작업을 실행하는 데 필요한 디렉터리를 만드세요: 

 

hdfs dfs -mkdir /user

hdfs dfs -mkdir /user/ubuntu 

 

입력 파일을 분산 파일 시스템에 복사합니다: 

 

hdfs dfs -mkdir input

hdfs dfs -put /opt/hadoop/etc/hadoop/*.xml input 

 

테스트 예제를 실행합니다: 

 

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+' 

 

분산 파일 시스템에서 출력을 확인합니다: 

 

hdfs dfs -cat output/*  

 

완료되면 NameNode와 DataNode를 중지합니다: 

 

stop-dfs.sh  

 

테스트 YARN

 

구성 파일에서 다음 매개변수를 구성합니다: 

 

/opt/hadoop/etc/hadoop/mapred-site.xml:  

 

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

 

/opt/hadoop/etc/hadoop/yarn-site.xml: 

 

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>        
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

 

리소스 관리자 및 노드 관리자를 시작합니다: 

 

start-yarn.sh  

 

네임노드와 데이터노드를 시작합니다: 

 

start-dfs.sh  

 

모든 데몬이 실행 중인지 테스트합니다: 

 

jps  

 

jps 명령을 실행하면 이 출력이 표시됩니다: 

 

5616 SecondaryNameNode

5760 Jps

5233 NameNode

4674 NodeManager

5387 DataNode

4524 ResourceManager 

 

6개의 데몬이 모두 표시되면 Hadoop의 다중 노드 설치로 넘어갈 차례입니다. 모든 데몬을 중지합니다: 

 

stop-yarn.sh

stop-dfs.sh 

 

3. Hadoop 멀티노드 설치 

 

사이트 구성 파일 편집

 

다음 구성 파일을 업데이트합니다: 

 

nano /opt/hadoop/etc/hadoop/core-site.xml:  

 

nano /opt/hadoop/etc/hadoop/core-site.xml:  

 

 

nano /opt/hadoop/etc/hadoop/core-site.xml:
    <configuration>
        <property>
            <name>fs.default.name</name>
            <value>hdfs://pi01:9000</value>
        </property>
    </configuration>

 

nano /opt/hadoop/etc/hadoop/hdfs-site.xml:  

 

nano /opt/hadoop/etc/hadoop/hdfs-site.xml:  

 

<configuration>
    <property>
            <name>dfs.namenode.name.dir</name>
            <value>/opt/hadoop/data/nameNode</value>
    </property>


    <property>
            <name>dfs.datanode.data.dir</name>
            <value>/opt/hadoop/data/dataNode</value>
    </property>
    <property>
        <name>dfs.namenode.checkpoint.dir</name>
        <value>/opt/hadoop/hdfs/namenodesecondary</value>
    </property>
    <property>
            <name>dfs.replication</name>
            <value>1</value>
    </property>
</configuration>

 

nano /opt/hadoop/etc/hadoop/mapred-site.xml:  

 

nano /opt/hadoop/etc/hadoop/mapred-site.xml:  

 

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>   
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.resource.memory-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>mapreduce.map.resource.memory-mb</name>
        <value>256</value>
    </property>
    <property>
        <name>mapreduce.reduce.resource.memory-mb</name>
        <value>256</value>
    </property>
</configuration>

 

nano /opt/hadoop/etc/hadoop/yarn-site.xml:  

 

nano /opt/hadoop/etc/hadoop/yarn-site.xml:  

 

 

<configuration>
    <property>
        <name>yarn.acl.enable</name>
        <value>0</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>pi01</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>1536</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>1536</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>128</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>

 

마스터 및 워커 설정 

 

마스터에 대해서: 

 

nano /opt/hadoop/etc/hadoop/master  

 

다음과 같이 표시되어야 합니다: 

 

pi01 

 

작업자 워커에 대해서: 

 

nano /opt/hadoop/etc/hadoop/workers  

 

It should look like this:  

 

pi02

pi03 

 

나머지 노드에 Hadoop 구성 복사하기 

 

Pi 2와 Pi 3에 SSH로 접속한 후 다음 명령을 실행합니다: 

 

sudo mkdir /opt/hadoop

 

sudo chown ubuntu:ubuntu -R /opt/hadoop 

 

 

RPi 2와 RPi 3에서 /opt/hadoop 디렉토리를 만들고 디렉토리 소유자를 변경한 후 RPi 1로 다시 SSH합니다.

 

다음 명령을 사용하여 마스터 노드에서 워커 노드로 모든 파일을 복사합니다. 

 

for pi in $(cluster-other-nodes); do rsync -avxP /opt/hadoop $pi:/opt; done 

 

그런 다음 마스터 노드에서 작업자 노드로 .bashrc 파일을 복사하여 모든 노드에 소싱합니다: 

 

cluster-scp ~/.bashrc

 

cluster-cmd source ~/.bashrc 

 

모든 것이 복사된 후 각 노드에서 다음 명령을 사용하여 Hadoop이 올바르게 설치되었는지 확인할 수 있습니다: 

 

hadoop version | grep Hadoop  

 

HDFS 포맷 

 

다음 명령은 별도의 지시가 없는 한 마스터 노드에서만 실행합니다.

 

처음 실행하려면 HDFS를 포맷해야 합니다: 

 

hdfs namenode -format 

 

HDFS 및 YARN 실행 

 

HDFS를 시작하려면 마스터 노드에서 다음 명령을 실행합니다: 

 

start-dfs.sh  

 

YARN을 시작하려면 다음 명령을 실행합니다: 

 

start-yarn.sh  

 

모든 노드에서 다음 명령을 실행하여 모든 것이 작동하는지 확인합니다: 

 

jps nbsp;

 

마스터 노드에서 jps는 비슷한 출력을 반환해야 합니다: 

 

7202 SecondaryNameNode

6954 NameNode

7498 Jps

7389 ResourceManager 

 

작업자 노드에서 jps는 비슷한 출력을 반환해야 합니다: 

 

3889 Jps

3684 NodeManager

3514 DataNode 

 

HDFS에 데이터 가져오기/넣기 

 

먼저 HDFS에 사용자 홈 디렉터리를 만듭니다: 

 

hdfs dfs -mkdir -p /user/ubuntu  

 

HDFS에 books라는 디렉터리를 만듭니다: 

 

hdfs dfs -mkdir books  

 

구텐베르크 프로젝트에서 책 몇 권을 가져와 보세요: 

 

cd ~
wget -O alice.txt https://www.gutenberg.org/files/11/11-0.txt
wget -O holmes.txt https://www.gutenberg.org/files/1661/1661-0.txt
wget -O irondoor.txt https://www.gutenberg.org/files/65995/65995-0.txt

 

 

책을 HDFS의 책 디렉터리에 넣습니다: 

 

hdfs dfs -put alice.txt holmes.txt frankenstein.txt books  

 

책 디렉터리의 콘텐츠를 나열합니다: 

 

hdfs dfs -ls books 

 

책 중 하나를 로컬 파일 시스템으로 다시 옮깁니다: 

 

hdfs dfs -get books/holmes.txt 

 

현재 디렉터리를 나열하여 파일을 성공적으로 검색했는지 확인합니다: 

 

ls 

 

맵리듀스 작업 - YARN을 통한 워드 카운트 

 

"Hello, world!"를 MapReduce; WordCount로 테스트해 보겠습니다. 먼저, 샘플 WordCount jar가 포함된 작업을 YARN에 제출합니다: 

 

yarn jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount "books/*" output 

 

작업이 완료된 후(몇 분 정도 소요될 수 있음) 다음 명령어로 결과를 확인합니다: 

 

hdfs dfs -ls output  

 

그러면 다음 정보가 반환됩니다: 

 

Found 2 items
-rw-r--r--   1 ubuntu supergroup          0 2020-09-10 18:09 output/_SUCCESS
-rw-r--r--   1 ubuntu supergroup     272490 2020-09-10 18:09 output/part-r-00000

 

그런 다음 다음 명령을 사용하여 결과를 인쇄합니다(종료하려면 Ctrl-Z 사용): 

 

hdfs dfs -cat output/part-r-00000 | less  

 

축하합니다, 이제 작동하는 YARN 클러스터가 생겼습니다! 

 

Spark 설치 

 

1. 아파치 스파크 다운로드 

 

마스터 파이에서만 수행하면 됩니다. 

 

먼저 Spark 3.0.3(Hadoop 3.2 이상용으로 사전 빌드됨) 바이너리를 마스터 Pi에 다운로드합니다.  

 

wget https://downloads.apache.org/spark/spark-3.0.3/spark-3.0.3-bin-hadoop3.2.tgz 

 

다음으로, 다음 명령을 사용하여 압축을 풀고 바이너리를 /opt/hadoop/ 디렉터리로 옮깁니다: 

 

sudo tar -xvf spark-3.0.3-bin-hadoop3.2.tgz -C /opt/hadoop && cd /opt/hadoop 

 

opt/hadoop/에서 디렉터리 이름을 spark로 변경합니다: 

 

sudo mv spark-3.0.3-bin-hadoop3.2 spark  

 

디렉터리에 대한 권한을 변경합니다. 

 

sudo chown ubuntu:ubuntu -R /opt/hadoop/spark  

 

2. 스파크 통합을 위한 YARN 구성하기 

 

.bashrc 파일 끝에 다음 코드를 추가합니다: 

 

# path and options for Spark
export SPARK_HOME=/opt/hadoop/spark
export PATH=$PATH:$SPARK_HOME/bin
export LD_LIBRARY_PATH=/opt/hadoop/lib/native:$LD_LIBRARY_PATH

 

.bashrc 파일을 소싱합니다: 

 

source ~/.bashrc  

 

Hadoop 사용자 프로필을 편집하여 경로에 Spark 디렉터리를 추가합니다: 

 

nano /opt/hadoop/.profile  

 

다음 줄을 추가합니다: 

 

 

PATH=/opt/hadoop/spark/bin:$PATH
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
export SPARK_HOME=/opt/hadoop/spark
export LD_LIBRARY_PATH=/opt/hadoop/lib/native:$LD_LIBRARY_PATH

 

터미널 세션을 종료하고 다시 SSH로 돌아와 세션을 다시 시작합니다. 스파크 기본 템플릿 구성 파일의 이름을 바꿉니다: 

 

mv /opt/hadoop/spark/conf/spark-defaults.conf.template /opt/hadoop/spark/conf/spark-defaults.conf 

 

$SPARK_HOME/conf/spark-defaults.conf를 수정하고 spark.master를 yarn으로 설정합니다: 

 

sudo nano /opt/hadoop/spark/conf/spark-defaults.conf  

 

다음 구성을 설정합니다: 

 

spark.master yarn
spark.driver.memory 512m
spark.yarn.am.memory 512m
spark.executor.memory 512m

 

YARN 클러스터에 스파크 신청서 제출하기 

 

spark-submit 명령을 사용하여 다음 명령을 실행하여 Pi의 병렬 처리 계산을 테스트합니다: 

 

spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/hadoop/spark/examples/jars/spark-examples_2.12-3.0.3.jar 10

 

작업을 제출한 후 출력에 다음 줄이 표시되어야 합니다: 

 

...

Pi is roughly 3.1401351401351403

... 

 

스파크 애플리케이션 모니터링 

 

Spark의 웹 UI가 제출된 작업을 추적할 수 있도록 spark-defaults.conf 파일을 편집하여 활성화합니다: 

 

sudo nano /opt/hadoop/spark/conf/spark-defaults.conf

 

구성 파일에 다음 줄을 추가합니다: 

 

spark.eventLog.enabled            true
spark.eventLog.dir                hdfs://pi01:9000/spark-logs
spark.history.provider            org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory     hdfs://pi01:9000/spark-logs
spark.history.fs.update.interval  10s
spark.history.ui.port             18080

 

 

 

spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/hadoop/spark/examples/jars/spark-examples_2.12-3.0.3.jar 10

 

HDFS에 로그 디렉터리를 만듭니다: 

 

hdfs dfs -mkdir /spark-logs  

 

History 서버를 실행합니다: 

 

/opt/hadoop/spark/sbin/start-history-server.sh  

 

Pi 병렬 처리 작업을 다시 실행하여 HDFS에 로그를 생성합니다. 

 

spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/hadoop/spark/examples/jars/spark-examples_2.12-3.0.3.jar 10 

 

웹 브라우저에서 http://{마스터 노드 IP}:18080의 웹 UI를 통해 스파크 기록 서버에 액세스합니다. 

 

스파크 셸 사용 

 

클러스터에 있는 기존 데이터를 대화형으로 살펴보겠습니다. Spark Shell을 통해 Spark Shell을 시작하려면 다음과 같이 하세요: 

 

spark-shell  

 

그런 다음 Spark Shell의 강력한 기능을 보여주기 위해 간단한 Scala 예제를 만들어 보겠습니다. 먼저 alice.txt 파일에서 input이라는 문자열 변수를 만들어 보겠습니다. 

 

var input = spark.read.textFile("books/alice.txt")  

 

그런 다음 필터 기능을 사용하여 빈 줄이 아닌 줄의 수를 세어 보겠습니다: 

 

input.filter(line => line.length()>0).count()  

 

반환된 출력은 그래야 합니다: 

 

res0: Long = 2813  

 

 

스파크 셸을 종료하려면 다음을 사용하세요. 

 

:q 

 

축하합니다, 이제 집에서 작업할 수 있는 클러스터 컴퓨팅 환경이 생겼습니다 :). 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^