본문 바로가기

Bigdata Hadoop

처음부터 라즈베리 파이 하둡/스파크 클러스터 구축하기

반응형

 

처음부터 라즈베리 파이 하둡/스파크 클러스터 구축하기 

 

소개

 

클라우드 컴퓨팅이 어떻게 작동하는지 더 잘 이해하기 위해 저와 반 친구 Andy Lin은 데이터 엔지니어의 세계를 깊이 파고들기로 했습니다. 저희의 목표는 Spark Hadoop Raspberry Pi Hadoop 클러스터를 처음부터 만드는 것이었습니다. 저희가 취한 단계를 안내하고 프로세스 전반에 걸쳐 발생할 수 있는 오류를 해결해 드리겠습니다.

 

본 포스팅의 원문 링크를 따라가세요.

 

위의 그림은 저희가 구매한 구성품을 보여줍니다: Raspberry Pi 4 *3, SD 카드 *3, 인터넷 케이블 *3, 충전 케이블 *3, 스위치 *1

 

위의 그림은 조립된 Raspberry Pi 클러스터의 모습을 보여줍니다.

 

1단계: Raspberry Pi 설정

 

운영체제 설치

 

Raspbian이라는 Debian 기반 OS를 사용하기로 했습니다. Raspbian NOOB는 Raspberry Pi에서 OS를 완벽하게 실행하는 가장 간단한 방법입니다. microSD 카드를 FAT로 포맷하고 NOOBS*.zip 아카이브를 추출합니다. 그런 다음 파일을 microSD 카드에 복사합니다. 마지막으로 microSD 카드를 Pi에 삽입하여 운영 체제를 성공적으로 설치합니다.

 

 

위의 그림은 Raspbian OS가 실행되는 모습을 보여줍니다.

 

정적 IP 주소 구성

 

Pis의 일반 네트워킹을 용이하게 하기 위해 네트워크 스위치에서 각 Pi에 대한 정적 IP 주소를 설정합니다. 각각을 raspberrypi1, raspberrypi2, raspberrypi3으로 명명했습니다. 그런 다음 각 Pi에서 /etc/dhcpcd.conf 파일을 편집하고 주석 처리를 제거합니다. 다음 줄을 편집합니다.

 

 

여기서 X는 Pi1의 경우 1, Pi2의 경우 2 등으로 대체해야 합니다.

 

Pis에 설정한 정적 ip_address는 라우터의 ip_address와 일치해야 한다는 점에 유의하세요. 예를 들어 라우터의 ip_address는 192.168.1.10X/24에서 시작하므로 각 Pi에 아래에 표시된 ip_address를 할당합니다.

 

위 그림은 raspberry pi1에 설정한 ip_address를 보여줍니다. (따라서 pi 2에는 192.168.1.102/24를 사용하고 pi 3에는 192.168.1.103/24를 사용합니다.)

 

SSH 활성화

 

그런 다음 이 링크의 지침에 따라 SSH를 활성화합니다.

 

호스트 이름 설정

 

처음에는 모든 Pi가 raspberrypi로 알려져 있고 단일 사용자가 있습니다. 네트워크의 다른 Pi 사이를 끊임없이 오가면 매우 혼란스러울 수 있습니다. 이 문제를 해결하기 위해 네트워크 스위치의 케이스 / 위치에 따라 각 Pi에 호스트 이름을 지정합니다. Pi #1은 raspberrypi1, Pi #2는 raspberrypi2로 알려집니다.

 

/etc/hosts 및 /etc/hostname을 포함하여 두 개의 파일을 편집해야 합니다. 이러한 파일 내에서 기본 호스트 이름인 raspberry pi가 각각 한 번만 나타나야 합니다. 각각을 raspberrypiX로 변경합니다. 여기서 X는 적절한 숫자 1-3입니다. 마지막으로 /etc/hosts에서만 다른 모든 Pi의 IP를 아래 그림과 같이 파일 끝에 추가합니다.

 

 

이제부터 보이는 터미널은 아래 그림과 같습니다.

 

 

SSH 간소화

 

한 pi에서 다른 pi로 연결하려면 아래 그림과 같이 일련의 명령을 입력하는 것이 정말 번거로울 수 있습니다.

 

 

공개/비공개 키 쌍을 사용하여 ssh 별칭과 암호 없는 ssh 연결을 설정하면 이 프로세스를 간소화할 수 있습니다.

 

SSH 별칭

 

특정 Pi에서 ~/.ssh/config 파일을 편집하고 다음 줄을 추가합니다.

 

 

X를 각 Pi의 번호로 바꿉니다. 이 작업은 단일 Pi에서 수행되므로 한 Pi는 ~/.ssh/config 내의 모든 코드 청크를 가져야 하며, 이는 네트워크의 각 Pi마다 변경해야 하는 X 문자를 제외하고는 위와 동일하게 보입니다.

 

 

(우리의 경우, 우리가 선택한 호스트 이름과 우리가 만든 클러스터에 세 개의 raspberrypi가 있기 때문에 위와 같이 보입니다)

 

이후, 우리의 ssh 명령 시퀀스는 위에 표시된 그림과 같이 됩니다:

 

 

하지만 이 시점에서 여전히 비밀번호를 입력해야 합니다. 공개/개인 키 쌍을 설정하여 이를 더욱 간소화할 수 있습니다.

 

공개/개인 키 쌍

 

먼저 각 Pi에서 다음 명령을 실행합니다:

 

 

이렇게 하면 ~/.ssh/ 디렉토리 내에 공개/개인 키 쌍이 생성되어 비밀번호를 입력하지 않고도 안전하게 ssh에 접속하는 데 사용할 수 있습니다. 이 파일 중 하나는 id_ed25519라고 하며, 이는 개인 키입니다. 다른 id_ed25519.pub는 공개 키입니다. 키 쌍에 대한 액세스를 보호하는 데 암호문구는 필요하지 않습니다. 공개 키는 다른 Pi와 통신하는 데 사용되며, 개인 키는 호스트 머신을 떠나지 않으며 다른 장치로 이동하거나 복사해서는 안 됩니다.

 

그런 다음 각 공개 키는 다른 모든 Pi의 ~/.ssh/authorized_keys 파일에 연결되어야 합니다. Pi #1에 "마스터" 레코드가 포함되어 있고, 이 레코드가 다른 Pi에 복사된다고 가정해 보겠습니다.

 

우선, Pi #2(및 #3 등)에서 위에 표시된 다음 명령을 실행합니다.

 

 

이렇게 하면 Pi #2의 공개 키 파일이 Pi #1의 인증 키 목록에 연결되어 Pi #2가 암호 없이 Pi #1에 ssh로 접속할 수 있는 권한이 부여됩니다(공개 키와 개인 키는 대신 연결을 검증하는 데 사용됩니다). 각 머신에 대해 이 작업을 수행하여 각 공개 키 파일을 Pi #1의 인증 키 목록에 연결해야 합니다.

 

Pi #1에도 이 작업을 수행해야 완성된 authorized_keys 파일을 다른 Pi에 복사할 때 다른 Pi도 모두 Pi #1에 ssh로 접속할 수 있는 권한이 부여됩니다. Pi #1에서 다음 명령을 실행합니다.

 

 

이 작업을 완료하고 이전 섹션을 완료하면 ssh-ing은 다음과 같이 간단합니다.

 

 

구성 복제

 

마지막으로 모든 Pi에서 암호 없는 ssh를 복제하려면 scp를 사용하여 위에서 언급한 두 파일을 Pi #1에서 다른 Pi로 복사하기만 하면 됩니다.

 

여기서 piX는 선택한 호스트 이름이어야 합니다. (저희의 경우, raspberrypi1, raspberrypi2, raspberrypi3입니다.) 이제 ssh piX만 사용하여 클러스터의 모든 Pi에 ssh로 접속할 수 있습니다.

 

사용 편의성을 위해

 

~/.bashrc 파일을 편집하고 아래 줄을 추가합니다(변경 사항을 적용하려면 ~/.bashrc를 편집할 때마다 파일을 소스로 지정하거나 로그아웃했다가 다시 로그인해야 합니다.) 그런 다음 새 함수를 호출할 수 있습니다. 아래 함수는 강력히 추천하는 함수입니다.

 

1. 이 Pi를 제외한 모든 Pi의 호스트 이름 가져오기

 

2. 모든 Pi에 동일한 명령 보내기

 

3. 클러스터 재부팅

 

4. 클러스터 종료

 

5. 모든 Pi에 동일한 파일 보내기

 

그런 다음 ~/.bashrc에 정의한 모든 사용 편의성 함수를 클러스터의 다른 모든 Pi에 복사할 수 있습니다. 아래 명령을 사용합니다.

 

 

 

2단계: Hadoop 및 Spark

 

단일 — 노드 설정

 

Hadoop 설치

 

Hadoop을 설치하기 전에 Pi에 허용 가능한 Java 버전이 있는지 확인합니다. 선택한 마스터 노드에서 단일 노드 설정을 빌드하는 것으로 시작합니다. pi#1에서 이 명령으로 Hadoop을 가져옵니다(hadoop-3.2.0.tar.gz를 가져오는 단축 링크):

 

다음으로, 아래에 표시된 명령을 사용합니다:

 

 

그런 다음, 이 디렉토리의 권한을 변경해야 합니다:

 

마지막으로, ~/.bashrc 파일을 편집하고 파일 끝에 다음 줄을 넣어 $PATH에 이 디렉토리를 추가합니다:

 

 

 

위 그림은 ~/.bashrc 파일을 편집하는 데 사용하는 줄을 보여줍니다

 

그런 다음 /opt/hadoop/etc/hadoop/hadoop-env.sh 파일을 편집하여 다음 줄을 추가합니다:

 

 

 

 

위 그림은 /opt/hadoop/etc/hadoop/hadoop-env.sh 파일을 편집하는 데 사용하는 줄을 보여줍니다

 

버전을 확인하여 Hadoop이 올바르게 설치되었는지 확인합니다:

 

 

Spark 설치

 

Hadoop을 다운로드한 것과 비슷한 방식으로 Spark를 다운로드합니다. 다음 명령을 실행합니다(이것은 spark-2.4.3-bin-hadoop2.7.tgz):

 

 

다음과 같은 명령을 사용합니다.

 

 

그런 다음 이 디렉토리의 권한을 변경해야 합니다.

 

 

마지막으로 ~/.bashrc를 편집하고 파일 끝에 다음 줄을 넣어 $PATH에 이 디렉토리를 추가합니다.

 

 

버전을 확인하여 Spark가 올바르게 설치되었는지 확인할 수 있습니다.

 

 

 

HDFS(Hadoop 분산 파일 시스템)

 

Hadoop 분산 파일 시스템(HDFS)을 가동하려면 일부 구성 파일을 수정해야 합니다.

 

  • 이 모든 파일은 /opt/hadoop/etc/hadoop에 있습니다.
  • core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml 포함

 

core-site.xml을 다음과 같이 편집합니다.

 

 

hdfs-site.xml을 다음과 같이 편집합니다.

 

 

위에 표시된 줄은 DataNode 및 NameNode 정보가 저장되는 위치를 구성하고 복제(블록이 클러스터 전체에 복사되는 횟수)를 1로 설정합니다(나중에 빌드한 DataNode 수에 따라 변경할 수 있음).

 

아래에 표시된 명령으로 이러한 디렉토리를 만듭니다.

 

 

그런 다음 이러한 디렉토리의 소유자를 조정합니다.

 

 

아래 줄을 mapred-site.xml에 추가하여 다음과 같이 만듭니다.

 

 

마지막으로 yarn-site.xml에 아래 줄을 추가하여 다음과 같이 만듭니다.

 

 

이러한 네 개의 파일을 편집하면 아래에 표시된 명령을 사용하여 HDFS를 포맷할 수 있습니다. (경고: HDFS에 이미 데이터가 있는 경우 이 작업을 수행하지 마세요! 데이터가 손실됩니다!)

 

 

그런 다음 아래에 표시된 두 명령으로 HDFS를 부팅합니다.

 

 

임시 디렉토리를 만들어 작동하는지 테스트합니다.

 

 

 

 

또는 jps 명령을 실행합니다.

 

 

 

위의 그림은 HDFS가 최소한 Pi #1에서 실행 중임을 보여줍니다. Spark와 Hadoop이 함께 작동하는지 확인하려면 아래 명령줄을 사용할 수 있습니다.

 

 

그러면 Spark 셸이 열리고 프롬프트는 Scala>입니다.

 

 

클러스터 설정

 

이 시점에서 단일 노드 클러스터가 있으며, 해당 단일 노드는 마스터와 워커 노드 역할을 합니다. 워커 노드를 설정하고(전체 클러스터에 컴퓨팅을 분산) 다음 단계를 수행합니다.

 

디렉토리 만들기

 

아래에 표시된 명령줄을 사용하여 다른 모든 Pi에 필요한 디렉토리를 만듭니다.

 

 

구성 복사

 

다음을 사용하여 /opt/hadoop에 있는 파일을 각 Pi에 복사합니다.

 

 

잠시 후 다음 명령으로 각 노드의 Hadoop 버전을 쿼리하여 파일이 올바르게 복사되었는지 확인할 수 있습니다.

 

 

 

클러스터에서 Hadoop 구성

 

클러스터에서 HDFS를 실행하려면 이전에 편집한 구성 파일을 수정해야 합니다. 이러한 모든 파일은 /opt/hadoop/etc/hadoop에 있습니다.

 

먼저 core-site.xml을 위와 같이 편집합니다.

 

hdfs-site.xml을 위와 같이 편집합니다. (우리는 DataNode가 두 개만 있다고 결정했기 때문에 이전과 같이 1을 사용하여 복제 번호를 변경하지 않았습니다.)

 

mapred-site.xml을 위와 같이 편집합니다.

 

마지막으로 yarn-site.xml을 위와 같이 편집합니다.

 

 

 

이러한 파일에 이러한 변경을 한 다음 모든 Pi에서 모든 이전 파일을 제거합니다. 다음을 사용하여 모든 Pi를 정리할 수 있습니다.

 

 

다음으로 $HADOOP_HOME/etc/hadoop/에 두 개의 파일을 만들어야 합니다. 이 파일에는 Hadoop에 어떤 Pi를 작업자 노드로 사용하고 어떤 Pi를 마스터(NameNode) 노드로 사용해야 하는지 알려줍니다.

 

먼저 앞서 언급한 디렉토리에 master라는 이름의 파일을 만들고 Pi(raspberrypi1)라는 한 줄만 추가합니다. 두 번째로 같은 디렉토리에 이름이 지정된 파일을 만들고 아래 그림과 같이 다른 모든 Pi(raspberrypi2…)를 추가합니다.

 

 

그런 다음 /etc/hosts를 다시 편집해야 합니다. 모든 Pi에서 다음과 같은 줄을 제거합니다.

 

여기서 X는 해당 Pi의 인덱스입니다.

 

그런 다음 이 파일을 다른 모든 Pi에 복사합니다.

 

 

이 파일은 더 이상 Pi 전용이 아니므로 지금 할 수 있습니다. 마지막으로 클러스터를 재부팅하여 변경 사항을 적용합니다. 모든 Pi가 재부팅되면 Pi #1에서 다음 명령을 실행합니다.

 

 

그런 다음 다음 두 명령으로 HDFS를 부팅합니다.

 

 

모든 Pi에서 HDFS에 파일을 넣고(hadoop fs -put 사용) 다른 Pi에 표시되는지 확인하여 클러스터를 테스트할 수 있습니다(hadoop fs -ls 사용). 웹 브라우저를 열고 http://192.168.1.101:9870/(저희의 경우)으로 이동하여 클러스터가 실행 중인지 확인할 수도 있습니다. 이 웹 인터페이스는 파일 탐색기와 클러스터 상태에 대한 정보를 제공합니다.

 

 

포트 9000에서 실행되는 Hadoop 웹 UI.

 

 

DataNode 통계를 보여주는 Hadoop 웹 UI

 

 

클러스터에서 Spark 구성

 

Spark가 YARN과 통신할 수 있도록 Pi #1의 ~/.bashrc에 두 개의 환경 변수를 더 구성해야 합니다. 이전에 다음을 정의했습니다.

 

 

~/.bashrc에 있습니다. 바로 아래에 두 개의 환경 변수를 추가합니다.

 

 

$HADOOP_CONF_DIR은 위에서 편집한 모든 *-site.xml 구성 파일이 들어 있는 디렉토리입니다. 다음으로 아래에 표시된 명령줄을 사용하여 Spark 구성 파일을 만듭니다.

 

 

그런 다음 이 파일의 끝에 다음 줄을 추가합니다.

 

 

이러한 값의 의미는 이 링크에서 설명합니다. 하지만 위의 내용은 머신에 따라 매우 다릅니다. 이 모든 것을 구성한 후 클러스터를 재부팅합니다. 재부팅할 때 HDFS NameNode를 다시 포맷해서는 안 됩니다. 대신 다음을 사용하여 HDFS 서비스를 중지했다가 다시 시작합니다.

 

 

이제 명령줄에서 Spark에 작업을 제출할 수 있습니다! 아래에 표시된 명령줄을 사용하여 텍스트 파일에서 간단한 RDD를 만듭니다.

 

 

출력은 아래에 표시된 그림과 같아야 합니다.

 

 

결론

 

마침내, 우리는 처음부터 라즈베리 파이 Hadoop/Spark 클러스터를 구축하는 이 프로젝트를 성공적으로 완료했습니다. 구성하고 탐색하는 데 오랜 시간이 걸렸습니다. 하지만 우리는 그것을 즐깁니다. 이것은 우리 경력의 첫 번째 데이터 엔지니어 부업 프로젝트이며, 빅데이터 분석의 세계에 대해 더 많이 배우기를 기대하고 있습니다.

 

참고문헌

 

[1]: Andrew. (July 22, 2019). Building a Raspberry Pi Hadoop / Spark Cluster

 

 

 

반응형

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