일상의 정리

'전체 글'에 해당되는 글 62건

  1. MariaDB can't create test file lower-test
  2. Hadoop Resource Manager HA 구성하기
  3. Hadoop Namenode HA 구성하기

MariaDB can't create test file lower-test

리눅스/설치

Ubuntu Server 에 MariaDB 설치 후 또는 업데이트 후에 

systemctl start mysql 로 서비스 기동 시에 아래와 같은 에러메시지 발생 시 처리 방법

Can't create test file xxx.lower-test

원인 : MariaDB 의 기본 저장 위치는 /var 아래 위치해야 하나 그 이외의 (/home 등) 위치로 설정할 경우에 문제 발생

해결 방법: 

vi /usr/lib/systemd/system/mariadb.service

ProtectHome=true

위 부분을 찾아서

ProtectHome=false

로 바꿔 준 후에

systemctl daemon-reload

systemctl start mysql

로 재시작 하면 해결

 

하지만 위와 같이 하면 다음 업데이트에서 동일 현상이 나타나므로 영구적으로 해결 하려면 아래 부분을 실행

systemctl edit mariadb

아래 구문 추가

[Service]
ProtectHome=false

저장 후에

systemctl daemon-reload

하면 완료

Hadoop Resource Manager HA 구성하기

Hadoop/설치

Namenode 를 HA 구성하여 SPOF(Single Point Of Failure)에서 벗어났지만, 이번엔 리소스관리자인 YARN이 또다른 SPOF입니다. 이번에는 Resource Manager를 HA 구성하는 방법에 대하여 알아보겠습니다.

1. 서버 구성

1.1 yarn-site.xml

yarn-site.xml을 아래와 같이 수정해 줍니다.

<configuration>

	<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
		<value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/home/hadoop/hadoopdata/yarn/nm-local-dir</value>
	</property>
	<property>
		<name>yarn.resourcemanager.fs.state-store.uri</name>
		<value>/home/hadoop/hadoopdata/yarn/system/rmstore</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop01</value>
	</property>
 	<property>
		<name>yarn.web-proxy.address</name>
		<value>0.0.0.0:8089</value>
	</property>

	<!-- for Resource Manager HA configuration -->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>cluster1</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop01</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop02</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoop01:8088</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>hadoop02:8088</value>
	</property>
	<property>
		<name>hadoop.zk.address</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property>

</configuration>

1.5 설정파일 전송

모든 설정 파일을 다른 hadoop 서버로 전송해 줍니다. 아래 명령을 이용합니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

2. 하둡 실행

아래 명령으로 하둡을 시작 합니다.

start-dfs.sh
start-yarn.sh

3. Resource Manager 상태 확인

아래 명령으로 Resource Manager의 상태를 확인합니다.

$ yarn rmadmin -getServiceState rm1
active
 
$ yarn rmadmin -getServiceState rm2
standby

4. Fail-over 테스트

4.1 Active Resource 종료

hadoop01 에서 아래 명령으로 Resource Manager 를 강제 종료 합니다.

$ jps
148195 Jps
144490 NameNode
145722 WebAppProxyServer
146696 ResourceManager
144750 JournalNode
144942 DFSZKFailoverController

$ kill -9 146696

4.2 Resource Manager 상태 확인

다음 명령으로 rm1 과 rm2 의 상태를 확인합니다.

$ yarn rmadmin -getServiceState rm1
2020-09-10 12:44:27,784 INFO ipc.Client: Retrying connect to server: hadoop01/192.168.35.81:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hadoop01/192.168.35.81 to hadoop01:8033 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
 
$ yarn rmadmin -getServiceState rm2
active

위와 같이 rm1 에서는 실패하고 rm2에서는 active 로 표시되면 정상입니다.

4.2 Job 실행

다음 명령으로 Sample Job 을 실행해 봅니다.

yarn jar  $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000

정상적으로 실행이 되면 Fail-over 가 성공한 겁니다.

 

Hadoop Namenode HA 구성하기

Hadoop/설치

기존에 설치했던 Hadoop은 멀티 노드 구성이지만 Namenode가 1개로 Namenode에 문제가 생길 경우 서비스를 계속할 수 없습니다. 따라서 Namenode를 2개로 구성하여 문제 발생 시에도 계속 서비스가 가능하도록 설정하도록 하겠습니다.

1. 서버 구성

서버는 Multi-Server 구성 그대로 4대를 이용하며, 2대는 Namenode 로 3대는 Datanode로 구성합니다. 물리 서버는 4대인데 역할은 5대가 되므로 hadoop02는 Namenode 와 Datanode 를 겸합니다.

1.1 core-site.xml

core-site.xml 파일을 아래와 같이 변경해 줍니다.

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-cluster</value>
        </property>

        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
</configuration>

fs.defaultFS 부분에 나오는 hadoop-cluster 가 namenode 클러스터명이 됩니다. 이 값은 임의로 원하는 값으로 바꾸면 됩니다.

ha.zookeeper.quorum 부분에 저널노드의 서버명:포트 순으로 넣어 줍니다. 저널노드는 3, 5, 7등 복수의 홀수개로 구성되어야 합니다. 여기서는 hadoop01~03을 이용합니다.

1.2 hdfs-site.xml

hdfs-site.xml을 아래와 같이 변경해 줍니다

<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/datanode</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/hadoopdata/hdfs/journalnode</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>hadoop-cluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.hadoop-cluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
    <value>hadoop01:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
    <value>hadoop02:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
    <value>hadoop01:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
    <value>hadoop02:50070</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hadoop-cluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(/bin/true)</value>
  </property>
  <!-- Automatic failover configuration -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>

dfs.nameservices에는 namenode 클러스터 명을 기입합니다.

이 후 나오는 dfs.ha.nameservices.<cluster-id> 와 dfs.namenode.xxx.<cluster-id> 부분에도 namenode 클러스터명을 기입합니다.

dfs.namenode.rpc-address 는 네임노드 서비스의 Host address 와 port 입니다. 네임노드는 2개 까지 가능하므로 nn1 과 nn2의 호스트가 되는 hadoop01 과 hadoop02 를 기입합니다.

dfs.namenode.http-address 는 웹 서비스 어드레스와 port입니다.

dfs.namenode.shared.edits.dir 에는 저널노드를 입력합니다. 여기서는 저널노드가 hadoop01~03이므로 위와 같이 입력합니다.

dfs.ha.fencing.methods 부분은 주키퍼가 담당하므로 shell(/bin/true)로 변경해 줍니다.

1.3 yarn-env.sh

yarn-env.sh파일은 아래와 같이 Heap 사이즈만 수정해 줍니다. 최대값을 1기가로 설정하겠다는 의미입니다.

JAVA_HEAP_MAX=Xmx1000m

1.4 yarn-site.xml

yarn-site.xml파일을 아래와 같이 수정해 줍니다.

<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/home/hadoop/hadoopdata/yarn/nm-local-dir</value>
  </property>
  <property>
        <name>yarn.resourcemanager.fs.state-store.uri</name>
        <value>/home/hadoop/hadoopdata/yarn/system/rmstore</value>
  </property>
  <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
  </property>
  <property>
        <name>yarn.web-proxy.address</name>
        <value>0.0.0.0:8089</value>
  </property>

</configuration>

1.5 설정파일 전송

모든 설정 파일을 다른 hadoop 서버로 전송해 줍니다. 아래 명령을 이용합니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

2. 하둡 실행

2.1 기존 데이터 제거

기존 구성의 데이터와 충돌이 발생할 수 있으므로 아래 명령으로 모든 데이터를 제거합니다.

이 작업은 4대의 서버 모두에서 각각 수행합니다.

cd ~
rm -rf hadoopdata/*/*

2.2 주키퍼 포맷

하둡 실행 전에 먼저 주키퍼를 초기화 해 줍니다.

아래 명령으로  주키퍼를 포맷합니다. (이 작업은 hadoop01에서만 합니다).

$HADOOP_HOME/bin/hdfs zkfc -formatZK

2.3 저널노드 시작

다음 명령으로 저널 노드 서비스를 시작합니다.

이 작업은 hadoop01 ~ 03 까지 저널노드 서버 모두에서 각각 수행합니다.

$HADOOP_HOME/bin/hdfs --daemon start journalnode

2.4 Active 네임노드 실행

hadoop01 서버에서만 실행합니다.

먼저 다음 명령으로 hdfs를 포맷해 줍니다.

 

hdfs namenode -format

이제 Active 네임노드를 실행합니다.

$HADOOP_HOME/bin/hdfs --daemon start namenode

2.5 Standby 네임노드 실행

이제 대기중인 Standby 네임노드를 실행합니다. 이 작업은 hadoop02 서버에서 실행합니다.

먼저 아래 명령으로 Active 네임노드의 메타데이터를 복사해 옵니다.

hdfs namenode -bootstrapStandby

이 명령이 성공하면 아래와 같이 나옵니다.

=====================================================
About to bootstrap Standby ID nn2 from:
           Nameservice ID: hadoop-cluster
        Other Namenode ID: nn1
  Other NN's HTTP address: http://hadoop01:50070
  Other NN's IPC  address: hadoop01/192.168.35.122:8020
             Namespace ID: 455152348
            Block pool ID: BP-1247003603-192.168.35.122-1563595795113
               Cluster ID: CID-143cb533-296b-4297-9b48-dd7749f351f1
           Layout version: -63
       isUpgradeFinalized: true
=====================================================

메타데이터 복사가 완료되면 네임노드를 실행합니다.

$HADOOP_HOME/bin/hdfs --daemon start namenode

2.6 ZooKeeper 장애 컨트롤러 (zkfc) 시작

이제 네임노드 2군데(hadoop01, hadoop02)에서 zkfc를 시작해 줍니다. 주키퍼가 장애여부를 판단하여 장애 발생 시 Standby 네임노드를 Active로 바꾸어 줍니다.

 

$HADOOP_HOME/bin/hdfs --daemon start zkfc

2.7 데이터노드 시작

hadoop02 ~ 04 까지 데이터 서버에서 각각 아래 명령을수행합니다.

$HADOOP_HOME/bin/hdfs --daemon start datanode

2.8 yarn 서비스 시작

다음 명령으로 yarn서비스를 시작합니다.

이 작업은 hadoop01서버에서 실행합니다.

start-yarn.sh

2.9 히스토리 서버 시작

hadoop01,02 서버 에서 아래 명령으로 히스토리 서버를 시작합니다.

$HADOOP_HOME/bin/mapred --daemon start historyserver

3. 서버 구동 확인

3.1 commnd-line 확인

jps 명령으로 서버들이 잘 구동중인지 확인합니다.

아래와 같이 나오면 정상입니다.

<hadoop01>
14960 Jps
13585 WebAppProxyServer
14401 NameNode
12803 JournalNode
13189 ResourceManager
13022 DFSZKFailoverController
<hadoop02>
22949 DFSZKFailoverController
23061 NodeManager
18934 JobHistoryServer
22694 DataNode
22600 NameNode
22809 JournalNode
25305 Jps

3.2 Web 확인

웹브라우저에서 http://hadoop01:50070 과 http://hadoop02:50070 으로 확인합니다.

Active 와 Standby 가 표시 되어야 정상입니다.