본문 바로가기

Bigdata Hadoop

데이터 과학/빅데이터 실험실 - 4부 중 2부: 3노드 클러스터에서 Ubuntu 20.04를 통한 Hadoop 3.2.1 및 Spark 3.0.0 사용하기

반응형

 

데이터 과학/빅데이터 실험실 - 4부 중 2부: 3노드 클러스터에서 Ubuntu 20.04를 통한 Hadoop 3.2.1 및 Spark 3.0.0 사용하기  

 

데이터 과학/빅데이터 실험실을 Raspberry Pi 4 또는 VM 클러스터에서 Hadoop, Spark, Hive, Kafka, Zookeeper 및 PostgreSQL로 조립하기 

 

서두는 같다. 

 

면책 조항: 이 글은 누구나 무료로 사용할 수 있도록 제공되며 책임은 본인에게 있습니다. 모든 출처를 인용하는 데 주의를 기울였지만 누락된 부분이 있다고 생각되면 메모를 보내주세요. 소프트웨어 버전에 따라 종속성 때문에 다른 방식으로 작동할 수 있으므로 처음 시도할 때 사용한 것과 동일한 버전을 사용하는 것이 좋습니다. 

모든 구성 파일은 [1]에서 확인할 수 있습니다: 

 

4부분으로 작성한 문서 링크를 아래에 나타냅니다. 원 문서는 1편 아래 참고 문서에 있습니다.

 

 

3. Hadoop 및 Spark 설치

 

Hadoop 및 Spark 설치는 [3, 4]의 지침과 다른 소스를 함께 고려했습니다.

 

Apache 웹사이트의 업데이트된 버전을 사용했습니다.

 

  • hadoop-3.2.1.tar.gz
  • spark-2.4.5-bin-hadoop2.7.tgz

 

3.1 환경 설정

 

먼저: 파일을 다운로드하고 /opt에 압축을 풉니다. pi 사용자에게 액세스 권한을 부여합니다. 

 

sudo tar -xvf hadoop-3.2.1.tar.gz -C /opt/
sudo tar -xvf spark-2.4.5-bin-hadoop2.7.tgz  -C /opt/
cd /opt/
pi@pi1:/opt$ sudo mv hadoop-3.2.1 hadoop
pi@pi1:/opt$ sudo mv spark-2.4.5-bin-hadoop2.7 spark
pi@pi1:/opt$ sudo chown -R pi:pi /opt/spark
pi@pi1:/opt$ sudo chown -R pi:pi /opt/hadoop

 

home/pi/.bashrc에 추가합니다: 

 

##  path for hadoop and spark


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH


export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

 

 

편집 후 

 

source /home/pi/.bashrc

 

3.2 Hadoop과 Spark를 단일 노드로 구성하기

 

이제 Hadoop과 Spark를 구성해야 합니다.

 

명확히 말해서, 먼저 단일 노드로 구성한 다음 클러스터에 맞게 수정합니다. GitHub의 내 리포지토리에는 최종 클러스터 구성 파일만 있습니다.

 

3.2.1 Hadoop

 

폴더로 이동

 

/opt/hadoop/etc/hadoop

 

이 시점에서 많은 문제가 발생했습니다. 실수로 파일 헤더 위에 빈 줄 하나를 삽입했습니다. 이 빈 줄로 인해 구문 분석 오류가 발생했고 Hadoop이 계속 실패하다가 문제를 깨달았습니다.

 

파일을 편집합니다.

 

/opt/hadoop/etc/hadoop/hadoop-env.sh,

 

다음 줄을 끝에 추가합니다. 

 

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64

 

다음에서 구성 편집 

 

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

 

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

 

 

다음에서 구성 편집 

 

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

 

<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///opt/hadoop_tmp/hdfs/datanode</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///opt/hadoop_tmp/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

 

이제 데이터 영역을 준비합니다: 

 

$ sudo mkdir -p /opt/hadoop_tmp/hdfs/datanode
$ sudo mkdir -p /opt/hadoop_tmp/hdfs/namenode
sudo chown -R pi:pi /opt/hadoop_tmp

 

다음에서 구성 편집 

 

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

 

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</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.auxservices.mapreduce.shuffle.class</name>  
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
</configuration>

 

데이터 공간을 준비합니다: 

 

$ hdfs namenode -format -force
$ start-dfs.sh
$ start-yarn.sh
$ hadoop fs -mkdir /tmp
$ hadoop fs -ls /
Found 1 items
drwzr-xr-x   - pi supergroup          0 2019-04-09 16:51 /tmp

 

jps를 사용하여 모든 서비스가 켜져 있는지 확인합니다(번호 변경...): 

 

$ jps
2736 NameNode
2850 DataNode
3430 NodeManager
3318 ResourceManager
3020 SecondaryNameNode

 

이 다섯 가지 서비스를 켜야 합니다! 

 

3.2.2 테스트

 

단일 노드를 테스트하려면 튜토리얼 [2]을 참조하세요.

 

다음 명령을 실행합니다. 

 

pi@pi1:/opt$ hadoop fs -put $SPARK_HOME/README.md /
2020-06-24 19:16:02,822 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2020-06-24 19:16:06,389 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
pi@pi1:/opt$ spark-shell
2020-06-24 19:16:23,814 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://pi1:4040
Spark context available as 'sc' (master = local[*], app id = local-1593026210941).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 3.0.0
      /_/
Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_252)
Type in expressions to have them evaluated.
Type :help for more information.
scala> val textFile = sc.textFile("hdfs://pi1:9000/README.md")
textFile: org.apache.spark.rdd.RDD[String] = hdfs://pi1:9000/README.md MapPartitionsRDD[1] at textFile at <console>:24
scala> textFile.first()
res0: String = # Apache Spark
scala>

 

이 시점에서 다음과 유사한 반복되는 메시지로 인해 멈췄습니다.

 

INFO yarn.Client: Application report for application_1434263747091_0023 (state: ACCEPTED)

 

[4] 및 기타 출처의 제안을 따르고 다음 파일 /opt/hadoop/etc/hadoop/capacity-scheduler.xml을 변경했습니다.

 

리소스가 적은 단일 머신에서 클러스터를 실행하는 경우 매개변수 yarn.scheduler.capacity.maximum-am-resource-percent를 설정해야 합니다. 이 설정은 애플리케이션 마스터에 할당할 수 있는 리소스의 일부를 나타내며, 가능한 동시 애플리케이션 수를 늘립니다. 이는 리소스에 따라 달라집니다. 제 Pi 4 4GB 램에서 작동했습니다.

 

다음 속성을 추가하여 파일을 편집합니다.

 

/opt/hadoop/etc/hadoop/capacity-scheduler.xml 

 

<property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.5</value>
    <description>
      Maximum percent of resources in the cluster which can be used to 
      run application masters i.e. controls number of concurrent running
      applications.
    </description>
  </property>

 

참고 - 튜토리얼에서는 일반적으로 경고를 표시하지 않는 명령어를 제공합니다. 하지만 실험할 때는 이러한 경고가 표시되는 것을 선호합니다. 제거하려면 첫 번째 튜토리얼을 참조하세요. 

 

3.3 Yarn을 사용한 클러스터의 Hadoop

 

이제 단일 노드에서 완벽하게 작동하는 설치가 하나 있어야 합니다. Hadoop을 클러스터로 옮길 때입니다!

 

튜토리얼을 실행했지만 여러 가지 문제에 직면했습니다. 이는 예상된 것입니다. 환경이 다르고 소프트웨어 버전이 다릅니다.

 

몇 가지 실험을 한 후 안정적인 환경을 만들었습니다. 클러스터에서 Yarn과 함께 작동하도록 Hadoop을 구성하는 다음 단계는 [2, 4]의 혼합입니다.

 

참고 - 모든 노드는 Spark 때문에 노드 pi1(pi1 -> master)을 제외하고 동일한 구성(p2, p3, ... -> workers)을 갖습니다. 다시 말하지만, 제 GitHub 저장소에는 사용 가능한 구성이 있습니다. 모든 노드에 대한 구성을 사용할 수 있도록 했습니다.

 

모든 노드에 대한 폴더를 만들고 권한 부여하기: 

 

$ clustercmd-sudo mkdir -p /opt/hadoop_tmp/hdfs
$ clustercmd-sudo chown –R pi:pi /opt/hadoop_tmp
$ clustercmd-sudo mkdir -p /opt/hadoop
$ clustercmd-sudo chown -R pi:pi /opt/Hadoop

 

다음은 Hadoop에서 모든 데이터를 제거합니다. 중요한 것이 있으면 먼저 백업을 하세요. 

 

$ clustercmd rm –rf /opt/hadoop_tmp/hdfs/datanode/*
$ clustercmd rm –rf /opt/hadoop_tmp/hdfs/namenode/*

 

Spark는 마스터에만 존재한다는 점에 유의하세요.

 

Hadoop 복사:

 

pi1에서: 

 

pi@pi1:~$  rsync -vaz  /opt/hadoop   pi2:/opt/ hadoop   
pi@pi1:~$  rsync -vaz  /opt/hadoop   pi3:/opt/ hadoop   
pi@pi1:~$  rsync -vaz  /opt/hadoop   pi4:/opt/ hadoop

 

모든 노드에 대해 이를 수행합니다.

 

저는 하나씩 수행하고 비정상적인 동작이 없는지 확인하는 것을 선호합니다.

 

이제 다음 파일을 편집하여 구성을 변경해야 합니다.

 

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

 

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>fs.default.name</name>
		<value>hdfs://pi1:9000</value>
	</property>
</configuration>

 

 

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

 

<configuration>

	<property>
		<name>dfs.datanode.data.dir</name>
		<value>/opt/hadoop_tmp/hdfs/datanode</value>
	</property>
	
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>/opt/hadoop_tmp/hdfs/namenode</value>
	</property>
	
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>

	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>
	
</configuration>

 

참고 - dfs.replication 속성은 클러스터에서 데이터가 복제되는 횟수를 나타냅니다. 모든 데이터가 두 개 이상의 노드에 복제되도록 설정할 수 있습니다. 실제 작업자 노드 수보다 높은 값을 입력하지 마세요. 저는 16GB 마이크로 SD를 사용하고 있었기 때문에 1을 사용했습니다. 코로나19 사태로 인해 일부 부품이 늦게 게시되었습니다. 잘못 구성하면 리소스 부족으로 인해 스파크 애플리케이션이 "수락됨" 상태로 멈추게 됩니다.

 

참고 - 마지막 속성인 dfs.permissions.enabled를 false로 설정하여 권한 확인을 비활성화했습니다. 저는 클러스터 외부의 컴퓨터에서 스파크(spark)를 사용하는데, 이렇게 하면 쉽게 액세스할 수 있습니다. 물론 프로덕션 환경에서는 이 설정을 사용하지 않는 것이 좋습니다. 안전 모드도 비활성화했습니다. 이렇게 하려면 설치를 완료한 후 실행합니다: 

 

 hdfs dfsadmin -safemode leave

 

클러스터에서 데이터가 복제되는 횟수입니다. 두 개 이상의 노드에 모든 데이터가 복제되도록 설정할 수 있습니다. 실제 작업자 노드 수보다 높은 값을 입력하지 마세요. 저는 16GB 마이크로 SD를 사용하고 있었기 때문에 1을 사용했습니다. 코로나19 사태로 인해 일부 부품이 늦게 게시되었습니다. 잘못 구성하면 리소스 부족으로 인해 스파크 애플리케이션이 '수락됨' 상태로 멈추게 됩니다. 

 

/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.mb</name>
		<value>512</value>
	</property>

	<property>
		<name>mapreduce.map.memory.mb</name>
		<value>256</value>
	</property>

	<property>
		<name>mapreduce.reduce.memory.mb</name>
		<value>256</value>
	</property>

</configuration>

 

/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>pi1</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>

 

 

두 개의 파일을 만듭니다: 

 

/opt/hadoop/etc/hadoop/master 

 

pi1

 

/opt/hadoop/etc/hadoop/workers 

 

pi2
pi3

 

 

모든 노드에서 구성 파일을 업데이트한 후 데이터 공간을 포맷하고 클러스터를 시작해야 합니다(어느 노드에서나 시작할 수 있음): 

 

$ hdfs namenode -format -force
$ start-dfs.sh
$ start-yarn.sh

 

 

3.4 SPARK 구성

 

기본적으로 다음 구성 파일을 생성/편집해야 합니다.

 

/opt/spark/conf/spark-defaults.conf 

 

spark.master            yarn
spark.driver.memory     2g
spark.yarn.am.memory    512m
spark.executor.memory   512m
spark.executor.cores    2

 

 

이 값은 하드웨어에 맞게 조정할 수 있지만 Raspberry Pi 4 4GB에서 작동합니다.

 

환경 변수를 다음 위치에서 설정하세요.

 

/opt/spark/conf/spark-env.sh 

 

export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

 

모든 노드에 다음 패키지를 설치하여 노드가 파이썬/파이스파크에서 준비된 작업을 처리할 수 있도록 합니다: 

 

sudo apt intall python3 python-is-python3

 

 

3.5 클러스터 테스트하기

 

모든 노드를 재부팅하고 서비스를 다시 시작합니다: 

$ start-dfs.sh
$ start-yarn.sh

 

스파크 테스트를 위해 하나의 애플리케이션 예제를 보낼 수 있습니다: 

 

$ spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/spark/examples/jars/spark-examples_2.12-3.0.0.jar

 

 

처리가 끝나면 PI 값에 대한 대략적인 계산값을 받게 됩니다: 

 

Pi is roughly 3.140555702778514

 

(이 PI 계산은 개선이 필요합니다!!!!) 

 

 

3.6 Hadoop 및 Yarn용 웹 앱

 

3.6.1 Hadoop webUi

 

http://pi1:9870/ 

 

 

처음에는 온라인에서 파일을 처리(업로드/삭제)할 수 없었습니다. 해결 방법은 다음과 같습니다: 

 

https://towardsdatascience.com/assembling-a-personal-data-science-big-data-laboratory-in-a-raspberry-pi-4-or-vms-cluster-e4c5a0473025

 

A Data Science/Big Data Laboratory — part 2 of 4: Hadoop 3 and Spark 3 on Ubuntu in a 3-node…

Assembling a Data Science/Big Data Laboratory in a Raspberry Pi 4 or VMs cluster with Hadoop, Spark, Hive, Kafka, Zookeeper and PostgreSQL

towardsdatascience.com

 

 

이 해결 방법은 Hadoop core-site.xml에 다음 속성을 추가하여 구현됩니다: 

 

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

	<property>
		<name>fs.default.name</name>
		<value>hdfs://pi1:9000</value>
	</property>

	<property>
		<name>hadoop.proxyuser.pi.hosts</name>
		<value>*</value>
	</property>
	<property>
		<name>hadoop.proxyuser.pi.groups</name>
		<value>*</value>
	</property>

</configuration>

 

Yarn WebUi 

 

http://pi1:8088/ 

 

 

 

[1] P. G. Taranti. https://github.com/ptaranti/RaspberryPiCluster

[2] A. W. Watson. Building a Raspberry Pi Hadoop / Spark Cluster (2019)

[3] W. H. Liang. Build Raspberry Pi Hadoop/Spark Cluster from scratch (2019)

[4] F. Houbart. How to Install and Set Up a 3-Node Hadoop Cluster (2019)

 

 

힘드냐고? 아니, 전혀 안 드는데. 오히려 재미있어. ㅋㅋㅋㅋ

 

어떤 계기는 진짜 사람과 가짜 사람을 구분하는 계기가 되는데, 그런 일은 가끔 필요한 일이야. 그래야 에너지를 아낄 수 있거든.

 

 

반응형

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