일상의 정리

yum repository가 꼬였을 경우 yum 초기화하기

리눅스

yum 명령어를 이용해서 어플리케이션을 설치하다 보면 가끔 repository가 꼬여서 yum install 이 제대로 실행이 안되거나 임시로 저장소를 추가했는데 필요 없어져서 제거할 필요가 있다거나 하는 경우가 생깁니다.

이런 경우에 아래와 같이 해당 저장소를 지워 주고 명령을 실행해 주면 됩니다.

1. /etc/yum.repos.d/ 아래의 저장소 파일 지우기

# cd /etc/yum.repos.d 			<-- repository 저장 디렉토리로 이동 
# ls -l                                  <-- 저장소 파일 확인
# rm -f "삭제할 저장소 파일"              <-- base는 지우면 안됨
# ls -l                                  <-- 지워졌는 지 확인

 

2. /var/cache/yum 아래 캐쉬 디렉토리 삭제

# cd /var/cache/yum
# ls -l           <-- 캐쉬 디렉토리 확인
# rm -rf x86_64

3. headers, packages, metadata 삭제

# yum clean headers
# yum clean packages
# yum clean metadata

 

VS Code 사용법 정리

유틸리티

VS Code 설치 후 사용법에 대한 간단 정리

VS Code 기본 화면은 좌측에 액션바/사이드바, 우측에 에디터, 아래쪽에 하단 패널로 구성되어 있다.

최초 화면 구성 설정하기

1) 커맨드창 열기: Ctl-Shift-P

2) 사이드바(SideBar) 위치 우측으로 변경
   > 커맨드창 - toggle sidebar position
   변경사유: Ctl-B 로 사이드바 보이기/안보이기 할 경우 좌측에 있으면 에디터 위치 변경으로 눈의 피로도 가중

3) 컬러 테마 설정 
   > 커맨드창 - Theme - Preference: Color Theme 선택 
   원하는 Theme을 선택 하거나 없다면 맨 아래 Install Additional Theme 에서 추가 
    Night Owl 또는 Cobalt2 추천

4) Icon 테마 설정 
   > 커맨드창 - Theme - Preference: File Icon Theme 선택 
   원하는 Theme을 선택 하거나 없다면 맨 아래 Install Additional Theme 에서 추가 
    Material Icon Theme 추천

5) Mini Map 끄기
   > Settings - minimap - Enabled 체크 제거

6) Side Bar 에서 Open Editors 항목 끄기
  Settings - open editor - 숫자를 0으로 설정
  사유: Ctl-P를 눌러서 Open Files 창에서 처리 가능함 

7) 설정을 Json 형식 으로 바꾸기
  Settings - settings json - UI -> Json 으로 변경 

8) UI 형식 설정화면 바로가기 생성
  커맨드창 - Preference : Open Keyboard Shortcut 선택 
  검색에서 Settings UI 넣고 키 바인딩에서 Ctl-Alt-, 로 설정 
사유: 잘 모르는 항목 검색이 필요할 경우 설정에서 잘 모르면 검색 부분에 원하는 내용을 넣으면 인공지능을 이용해 찾아주므로 때때로 UI 형식 설정이 필요함. 

 

유용한 Hot Key 정리

기본 Hot Key

커맨드 창 열기: Ctl-Shift - P 
설정 Ctl - ,
Sidebar 보이기/숨기기 : Ctl - B 
하단 패널(Output) 보이기/숨기기 : Ctl-J

Open 파일리스트 : Ctl-P 
위 창에서 메쏘드 리스트 @ 
위 창에서 문자열로 메쏘드 검색 #문자열 
@: 분류별로 보여 줌 (CPP인 경우는 헤더에서) 

Ctl-~ : 터미널 바로가기 
Ctl-0 : 사이드바 바로가기 
Ctl-1 : 편집기 바로가기 

변수명 또는 Method 바꾸기 
F2를 눌러 바꾸면 참조하는 모든 곳이 바뀜

Split Editor
Ctl-\ : 현재 편집 중 화면을 우측으로 분리
Ctl-K Ctl-\ : 현재 편집 중 화면을 아래쪽으로 분리

Editing Hot Key

Alt - 화살표 : 라인 이동
Alt Shift - 화살표 : 라인 복사 
Ctl Shift - K : 라인 삭제 
브라켓(Bracket) 매칭: Ctl-Shift-\


Ctl Shift - L : 현재 커서와 일치하는 단어 모두 선택
Ctl - D: 현재 커서와 일치하는 단어 모두 선택 계속 누르면 다음으로 이동
Ctl - K: 위에서 해당 내용 건너 뜀

검색 시 regex 검색 가능
검색 후에 Alt-Enter 누르고 화살표 이동 후에 전체 변경 가능

찾기
Ctl-F

GIT

Ctl-Shift G : Open GIT Window
Window 에서
Comment 넣고 Ctl-Enter 하면 Commit
Push 하는 건 Windows ...메뉴에서 Push 하거나
우측 하단 Sync 아이콘 누름
(Sync 와 Push 의 차이는 Sync 는 Pull 을 먼저 하고 Push를 함)


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 가 표시 되어야 정상입니다.

Zookeeper 설치

Hadoop/설치

Apache ZooKeeper는 탄력적이고 안정적인 분산 조정을 가능하게하는 오픈 소스 소프트웨어입니다. 일반적으로 분산 시스템에서 구성 정보, 이름 지정 서비스, 분산 동기화, 쿼럼 및 상태를 관리하는 데 사용됩니다. 또한 분산 시스템은 ZooKeeper를 사용하여 합의, 리더 선택 및 그룹 관리를 구현합니다.

RHEL/CentOS 8에 Zookeeper를 설치하는 방법을 정리해 봅니다.

1. 서버 기본 설정

각 서버의 공통 설정은 Hadoop 설치를 참고합니다.

2. Zookeeper 설치

2.1 zookeeper 사용자 생성

보안을 생각해서 별도의 zk 사용자를 생성합니다.

아래 명령어로 새로운 사용자를 생성하고 암호를 설정해 줍니다:

useradd zk
passwd zk

이후에 아래와 같이 sshd_config를 수정해서 sshd를 통해 로그인이 불가능하도록 합니다.:

vi /etc/ssh/sshd_config

내용을 아래와 같이 수정합니다.

PermitRootLogin no
DenyUsers zk

아래와 같이 sshd 를 재시작합니다.

systemctl restart sshd

2.2 zookeeper 데이터 디렉토리 생성

zookeeper 가 사용하는 데이터 디렉토리를 생성합니다.

mkdir -p /data/zookeeper
chown zk:zk /data/zookeeper

2.3 zookeeper 다운로드

아래와 같이 zookeeper 최신 버전을 다운로드 합니다. 바이너리 버전을 다운로드해야 합니다.

wget http://mirror.kakao.com/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz

2.3 zookeeper 압축 해제

/opt 디렉토리에 zookeeper 를 압축해제 합니다.

cd /opt
tar xvzf apache-zookeeper-3.6.1-bin.tar.gz

압축 해제 후 아래와 같이 사용자 권한을 설정해 줍니다.

chown -R zk:zk apache-zookeeper-3.6.1-bin
ln -s apache-zookeeper-3.6.1-bin zookeeper
chown -h zk:zk zookeeper

2.3 zookeeper 설정 파일 생성

아래 명령으로 설정 파일을 편집합니다.

vi /opt/zookeeper/conf/zoo.cfg

아래 내용으로 입력하고 저장합니다.

initLimit=5
syncLimit=2
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

위에서 각각의 내용은 다음과 같습니다.

tickTime: tick 길이를 밀리 초 단위로 설정합니다. 
          tick은 ZooKeeper에서 하트 비트 사이의 길이를 측정하는 데 사용하는 시간 단위입니다.
          최소 세션 시간 제한은 tickTime의 두 배입니다.
dataDir: 메모리 내 데이터베이스의 스냅샷 및 업데이트를위한 트랜잭션 로그를 저장하는 데 사용되는 디렉터리를 지정합니다. 
         트랜잭션 로그에 대해 별도의 디렉터리를 지정하도록 선택할 수 있습니다.
clientPort: 클라이언트 연결을 수신하는 데 사용되는 포트입니다.
maxClientCnxns: 최대 클라이언트 연결 수를 제한합니다.

3. Zookeeper 시작 및 테스트

3.1 zookeeper 서비스 시작

아래 명령어로 zk 사용자로 전환 후 zookeeper 디렉토리로 갑니다.

su -l zk
cd /opt/zookeeper

아래와 같이 zkServer.sh 명령을 실행합니다.

bin/zkServer.sh start

아래와 같은 실행결과가 화면에 표시되면 정상입니다.

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

3.2 zookeeper 테스트

아래 명령어로 로컬 ZooKeeper 서버에 접속합니다.

bin/zkCli.sh -server 127.0.0.1:2181

아래와 같이 CONNECTED 프롬프트가 나오면 정상입니다.

Connecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]

위 프롬프트에서 help 명령어를 입력하고 엔터를 칩니다. 그럼 아래와 같이 표시됩니다.

[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit
    getAcl path
    close
    connect host:port

3.2 zookeeper 서비스 종료

아래 명령어로 ZooKeeper 서비스를 종료합니다.

bin/zkServer.sh stop

4. Zookeeper 시스템 서비스 파일 생성

systemd 서비스를 이용해서 시작/종료를 할 수 있도록 서비스 파일을 생성합니다.

아래 명령어로 시스템 서비스 파일을 편집합니다.

sudo vi /etc/systemd/system/zk.service

아래 내용을 입력합니다.

[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target

[Service]    
Type=forking
WorkingDirectory=/opt/zookeeper
User=zk
Group=zk
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=default.target

이제 다음 명령어로 ZooKeeper를 실행해 봅니다.

 

sudo systemctl start zk​

아래 명령으로 정상적으로 실행 중인지 확인 합니다.

sudo systemctl status zk

정상적으로 실행이 되면, 시스템이 부팅 시에도 자동으로 실행되도록 아래와 같이 등록해 줍니다.

sudo systemctl enable zk

싱글 노드에서의 설치는 완료 되었으므로, 멀티 노드 설정 전에 다음 명령으로 서비스를 종료합니다..

sudo systemctl stop zk

4. Zookeeper 멀티 노드 설정

이제 멀티 노드 설정을 해야 합니다. ZooKeeper 는 홀수대의 노드로 구성을 해야 하므로, 3대 혹은 5대와 같이 구성을 합니다. 여기서는 3대 구성을 설명합니다.

위의 싱글노드 설정을 모든 노드에 대해 한 이후에 아래와 같이 설정을 추가합니다.

아래 명령어로 설정파일을 편집합니다.

sudo vi /opt/zookeeper/conf/zoo.cfg

아래 내용을 입력합니다.

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
initLimit=10
syncLimit=5
server.1=your_zookeeper_node_1:2888:3888
server.2=your_zookeeper_node_2:2888:3888
server.3=your_zookeeper_node_3:2888:3888

설정이 완료되면 각각의 노드의 /data/zookeeper 아래 myid 라는 파일을 생성하고 차례대로 1, 2, 3 과 같이 입력해 줍니다.

아래 명령어로 myid파일을 생성합니다.

sudo vi /data/zookeeper/myid

아래와 같이 각각의 노드에 따라 숫자를 입력해 줍니다.

1번째 노드 

1

2번째 노드 

2

3번째 노드 

3

5. Zookeeper 멀티 노드 테스트

먼저 1번 2번 노드에서 아래 명령으로 로컬에 접속합니다.

bin/zkCli.sh -server 127.0.0.1:2181

노드 1에서 아래 명령을 입력합니다.

[zkshell:] create /zk_znode_1 sample_data

노드 1에서 다음 명령으로 생성된 내용을 확인해 봅니다.

[zkshell: ] get /zk_znode_1

노드 2에서 다음 명령으로 생성된 내용을 확인해 봅니다.

[zkshell: ] get /zk_znode_1

노드 1, 노드 2 양쪽 모두 동일한 결과가 나와서 동기화가 되는 것을 확인하면 정상입니다.

아래 명령으로 znode를 삭제해 줍니다.

[zkshell: ] delete /zk_znode_1

CentOS/RHEL 8에 Hadoop 설치하기

Hadoop/설치

Hadoop은 머신 클러스터에서 대규모 데이터 세트를 저장하고 처리하는 데 사용되는 무료 오픈 소스 및 Java 기반 소프트웨어 프레임 워크입니다. HDFS를 사용하여 데이터를 저장하고 MapReduce를 사용하여 이러한 데이터를 처리합니다. 주로 데이터 마이닝 및 머신 러닝에 사용되는 빅 데이터 도구의 생태계입니다. Hadoop Common, HDFS, YARN 및 MapReduce와 같은 네 가지 주요 구성 요소가 있습니다.

RHEL/CentOS 8에 Apache Hadoop을 설치하는 방법을 정리해 봅니다.

1. 서버 기본 설정

각각의 서버에서 공통적으로 해야 하는 설치 및 설정입니다

1.1 고정IP 설정

각각의 서버에 고정IP를 설정해 줍니다. (고정IP는 각각의 서비스 상황에 맞게 IP를 설정합니다. 여기서는 81~84를 부여합니다)

고정IP 설정을 위해 아래 명령으로 파일을 수정합니다:

vi /etc/sysconfig/network-scripts

수정할 내용은 아래와 같습니다:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"                            <-- dhcp 를 none로 변경
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp1s0"
UUID="d5f41bf4-de0a-43b3-b633-7e2ec6212e58"
DEVICE="enp1s0"
ONBOOT="yes"

IPADDR=192.168.122.81                       <-- 여기서 아래 부분 추가 
PREFIX=24
GATEWAY=192.168.122.1
DNS1=192.168.122.1
DNS2=1.1.1.1

파일을 저장한 후 위의 DEVICE 부분의 인터페이스를 재시작 해서 IP를 변경내용을 적용합니다.

ifdown enp1s&& ifup enp1s0

바뀐 IP가 제대로 적용되었는 지 아래 명령으로 확인합니다.

ip addr | grep enp1s0

2.2 hostname 설정

서비스를 구성하는 각각의 서버의 서버명을 설정합니다. (여기서는 4대의 서버로 hadoop01 ~ hadoop04로 설정합니다)

아래 명령으로 각각의 서버명을 설정해 줍니다:

hostnamectl set-hostname hadoop01

hostname 설정이 되었다면 이제 각 서버마다 host명으로 접근이 가능하도록 /etc/hosts 파일에 추가해 줍니다.

다음 명령으로 /etc/hosts 파일을 수정합니다.

vi /etc/hosts

아래와 같이 수정해 줍니다.

127.0.0.1   localhost

192.168.122.81 hadoop01
192.168.122.82 hadoop02
192.168.122.83 hadoop03
192.168.122.84 hadoop04

1.3 Java 설치

Hadoop 은 Java로 작성되었고 최신 버전은 Java11도 지원하지만 아직은 Java 8에서 안정적입니다. 아래와 같이 DNF를 이용해서 OpenJDK 8을 설치합니다:

dnf install java-1.8.0-openjdk.x86_64 ant -y

설치 후 아래 명령으로 제대로 설치 되었는 지를 테스트 합니다:

java -version

다음 출력이 나오면 OK:

openjdk version "1.8.0_262" 
OpenJDK Runtime Environment (build 1.8.0_262-b10) 
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

1.4 Hadoop 사용자 생성

보안을 생각해서 별도의 Hadoop 사용자를 생성합니다.

아래 명령어로 새로운 사용자를 생성합니다:

useradd -m hadoop

다음으로 생성한 사용자의 암호를 설정해 줍니다:

passwd hadoop

아래와 같이 사용자에 대한 암호를 2번 입력합니다:

Changing password for user hadoop. 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

1.5 Configure SSH Key-based Authentication

패스워드 없이 접속이 가능하도록 ssh 키를 설정합니다.

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

다음 명령으로 공개키와 개인키를 생성합니다.

ssh-keygen -t rsa

아래와 같이 물어 보게 되는 데 엔터만 치면 됩다.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a/og+N3cNBssyE1ulKK95gys0POOC0dvj+Yh1dfZpf8 hadoop@centos8
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              .  |
|    .   o o o    |
| . . o S o o     |
| o = + O o   .   |
|o * O = B =   .  |
| + O.O.O + +   . |
|   +=*oB.+  o   E|
+----[SHA256]-----+

생성된 공개키를 로컬의 authorized_keys 에 추가하고 권한을 변경해 줍니다.

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 640 ~/.ssh/authorized_keys

다음 명령으로 패스워드 없이 접속이 되는 지 확인해 봅니다.

ssh localhost

처음 1번은 아래와 같이 호스트를 등록할 거냐고 물어 본니다. yes를 하고 엔터를 누르면 정상적으로 접속됩니다.

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:0YR1kDGu44AKg43PHn2gEnUzSvRjBBPjAT3Bwrdr3mw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sat Feb 1 02:48:55 2020
[hadoop@centos8 ~]$

1.6 Hadoop 설치

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

아래 명령어로 하둡 최신 버전(여기서는 3.3.0)을 다운 받습니다.

wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

다운이 완료되면 아래 명령어로 압축을 풀어 줍니다.

tar -xvzf hadoop-3.3.0.tar.gz

아래와 같이 심볼릭 링크를 생성해 줍니다.

ln -s hadoop-3.3.0 hadoop

이제 시스템의 Hadoop 과 Java 환경 변수를 설정해 줍니다.

아래 명령으로 ~/.bashrc 파일을 편집해 줍니다.

vi ~/.bashrc

다음 라인을 추가해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/
export HADOOP_HOME=/home/hadoop/hadoop 
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_YARN_HOME=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

파일을 저장하고 다음 명령으로 스크립트를 실행해 줍니다.

source ~/.bashrc

이번엔 하둡 환경변수 파일을 편집합니다.

vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

아래와 같이 JAVA_HOME 변수를 찾아 수정해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/

저장하고 닫아 줍니다. 이걸로 환경 설정은 끝입니다.

2. Single Node Cluster (유사분산 모드)

2.1 Configure Hadoop

먼저 Hadoop 홈 디렉토리 아래 namenode and datanode 디렉토리를 생성해야 합니다.

아래 명령으로 2개의 디렉토리를 생성해 줍니다:

mkdir -p ~/hadoopdata/hdfs/namenode 
mkdir -p ~/hadoopdata/hdfs/datanode

다음은 core-site.xml 파일에서 시스템 호스트명을 설정해 줍니다.:

vi $HADOOP_HOME/etc/hadoop/core-site.xml

아래와 같이 자신의 시스템 호스트명을 설정해 줍니다.

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

파일을 저장 후 hdfs-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래 처럼 NameNode 와 DataNode 디렉토리를 설정해 줍니다:

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/datanode</value>
        </property>
</configuration>

파일을 저장합니다. mapred-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/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>
</configuration>

파일을 저장하고, 이번에는 yarn-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

다음과 같이 변경합니다:

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

저장하면 이제 다 되었습니다.

2.2 Start Hadoop Cluster

Hadoop 클러스터를 시작하기 전에 먼저 hadoop 사용자로 Namenode를 포맷해야 합니다.

Namenode를 포맷하기 위해 아래 명령어를 실행합니다:

hdfs namenode -format

아래 내용이 표시되면 성공입니다:

2020-02-05 03:10:40,380 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 
2020-02-05 03:10:40,389 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown. 
2020-02-05 03:10:40,389 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************ 
SHUTDOWN_MSG: Shutting down NameNode at hadoop.tecadmin.com/45.58.38.202
************************************************************/

Namenode 포맷 후에, 아래 명령으로 hadoop 클러스트를 시작합니다:

start-dfs.sh

HDFS 성공적으로 시작되면, 아래와 같은 내용이 표시됩니다:

Starting namenodes on [hadoop.tecadmin.com] 
hadoop.tecadmin.com: Warning: Permanently added 'hadoop.tecadmin.com,fe80::200:2dff:fe3a:26ca%eth0' (ECDSA) to the list of known hosts. 
Starting datanodes 
Starting secondary namenodes [hadoop.tecadmin.com]

다음으로 YARN 서비스를 시작합니다:

start-yarn.sh

아래와 같은 메시지가 출력됩니다:

Starting resourcemanager 
Starting nodemanagers

2.2 상태 및 동작 확인

jps 명령으로 Hadoop 서비스의 상태를 체크해 볼 수 있습니다:

jps

다음과 같이 실행중인 서비스가 표시됩니다:

7987 DataNode 
9606 Jps
8183 SecondaryNameNode
8570 NodeManager
8445 ResourceManager 
7870 NameNode

아래 명령을 실행해서 잘 동작하는 지 확인해 봅니다:

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

정상적으로 실행되었다면 아래와 같이 표시 됩니다.

Job Finished in 36.294 seconds
Estimated value of Pi is 3.14250000000000000000

2.3 Configure Firewall

Hadoop은 포트 9870 과 8088을 사용하므로 이 포트들을 방화벽에서 허용해 주어야 합니다.

아래 명령으로 방화벽에서 허용해 줍니다:

firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8088/tcp

그리고 방화벽 규칙을 다시 로드해서 적용해 줍니다:

firewall-cmd --reload

2.4 Access Hadoop Namenode and Resource Manager

웹브라우저를 열어 http://your-server-ip:9870 으로 Namenode에 접속합니다. 그럼 아래와 같은 화면이 표시됩니다:

리소스 관리자에 접근하려면 http://your-server-ip:8088 로 접속합니다. 아래 화면이 표시됩니다:

2.5 Verify the Hadoop Cluster

Hadoop cluster 에 대한 설치 및 설정은 완료되었습니다. 이제 Hadoop을 테스트 하기 위해 HDFS 에 일부 디렉토리를 생성합니다.

다음 명령으로 테스트 디렉토리를 생성합니다:

hdfs dfs -mkdir /test1
hdfs dfs -mkdir /test2

그리고 아래 명령으로 위 디렉토리를 표시합니다:

hdfs dfs -ls /

다음과 같이 표시됩니다:

Found 2 items 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:25 /test1 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:35 /test2

웹의 Hadoop Namenode에서도 위 디렉토리가 표시되어야 합니다.

Namenode 웹페이지에서, Utilities => Browse the file system 을 클릭합니다. 아래와 같이 디렉토리가 표시되는 것을 확인할 수 있습니다:

2.6 분석 프로그램 실행

테스트를 위해 단어개수를 분석하는 예제를 실행합니다. 맵리듀스 job을 실행하기 위해서 HDFS 디렉토리를 생성합니다.

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /user/root/conf
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal $HADOOP_HOME/README.txt /input
hdfs dfs -ls /input

다음 명령으로 단어 개수를 분석하는 프로그램을 실행합니다:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input/README.txt ~/wordcount-output

실행이 완료되면 아래 명령으로 결과를 확인합니다:

hdfs dfs -ls ~/wordcount-output
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-09-03 03:43 /home/hadoop/wordcount-output/_SUCCESS
-rw-r--r--   1 hadoop supergroup        188 2020-09-03 03:43 /home/hadoop/wordcount-output/part-r-00000

hdfs dfs -cat ~/wordcount-output/part-r-00000

다음과 같이 표시됩니다:

For     1
Hadoop, 1
about   1
and     1
at:     2
http://hadoop.apache.org/       1
https://cwiki.apache.org/confluence/display/HADOOP/     1
information     1
latest  1
our     2
please  1
the     1
visit   1
website 1
wiki,   1

2.7 Stop Hadoop Cluster

Hadoop Namenode 와 Yarn 서비스는 stop-dfs.sh  stop-yarn.sh 명령으로 중지할 수 있습니다.

아래 명령으로 Hadoop Namenode 서비스를 중지합니다:

stop-dfs.sh

아래 명령으로 Hadoop Resource Manager  서비스를 중지합니다:

stop-yarn.sh

3. Multi Node Cluster (완전 분산 모드)

지금까지의 작업으로 Single Node Cluster 로 동작하는 Hadoop 설치는 완료되었습니다. 이제는 여러대의 노드로 구성된 Hadoop 설정을 하도록 하겠습니다.

3.1 ssh 공개키 설정

아래 명령으로 master(hadoop01)의 공개키를 모든 datanode로 복사합니다:

scp -rp ~/.ssh/authorized_keys hadoop@hadoop02:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop03:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop04:~/.ssh/authorized_keys

3.2 하둡 설정

3.2.1 master (마스터 노드) 설정

master 노드에서 hdfs-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래의 내용을 설정합니다.

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/namenode</value>
                <final>true</final>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/datanode</value>
                <final>true</final>
        </property>
</configuration>

master 노드에서 yarn-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

아래의 내용을 설정합니다.

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>hadoop01:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address</name>
                <value>hadoop01:8030</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address</name>
                <value>hadoop01:8031</value>
        </property>

</configuration>

아래 명령으로 workers 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/workers

아래와 같이 설정해 줍니다.

hadoop02
hadoop03
hadoop04

3.2.1 slaves (슬레이브 노드) 설정

Master 설정 파일을 모두 슬레이브로 복사해 주어야 합니다.

아래 명령으로 복사해 줍니다.

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/

아래 명령으로 기존 HDFS 저장소를 제거해 줍니다.

rm -rf ~/hadoopdata/hdfs/*

3.3 방화벽 설정

Hadoop 은 내부적으로 랜덤하게 포트를 오픈하고 사용하므로, 다음 명령으로 같은 IP 대역에 대해 방화벽을 오픈해 줍니다. (Master/Slave 모두)

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.122.0/24 port port="80-65535" protocol="tcp" accept'

다음 명령으로 방화벽을 다시 로드합니다.

firewall-cmd --reload

3.4 동작

다음 명령으로 마스터 노드에서 Hadoop을 실행합니다.

start-dfs.sh

정상적으로 실행되면 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop01 ~]$ jps
43112 SecondaryNameNode
43241 Jps
42876 NameNode

각가의 Slave에서도 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop02 ~]$ jps
36262 Jps
36207 DataNode

3.5 Multi Node 확인

웹브라우저에서 data node를 확인합니다. 아래처럼 3개가 표시되면 정상입니다.

 

X11 connection rejected because of wrong authentication.

리눅스/설치

ssh 터널링을 통해 접속한 x11 에서 sudo 를 한 경우 x app을 열려고 할 때 아래 에러를 내는 경우 처리 방법

x11 connection rejected because of wrong authentication. 

잘못된 인증으로 인해 X11 연결이 거부되었습니다.

 

sudo 를 한 터미널에서 아래 명령을 입력

xauth merge /home/<user-id>/.Xauthority

<user-id>는 접속한 사용자 id

 

이 후에 xeyes 를 해 보면 정상적으로 됩니다.

Orange pi를 이용한 IKEv2 VPN Server 설치

리눅스/설치

VPN 서비스는 외국에서 한국의 서비스를 이용하거나, mVOIP 사용량 제한을 우회하기 위해 많이 사용됩니다.
이번에 
중국에 지인이 있어서 중국의 만리 방화벽을 뚫을 수 있는 VPN 서비스를 찾다 보니 일반 공유기가 지원하는 L2TP 또는 PPTP등의 VPN 서비스는 만리 방화벽에 막혀서 안된다고 합니다. 그래서 가능한 방법을 찾아보니 IKEv2 VPN은 가능하다고 하는데 놀고 있는 Orange Pi 에 올려서 서비스를 해 보고자 방법을 찾아 공유를 합니다. 
Orange Pi 여서 Armbian 기준이며, id/password 방식을 사용하려면 mschapv2 플러그인이 필요한데 armbian 기본 패키지에서는 제공이 안되서 소스 컴파일 하여 설치를 하였습니다. 
Raspbian 에서도 잘 될 것으로 보이며, Raspbian 에서는 apt 설치 패키지에 mschapv2 플러그인이 있다면 설치 패키지를 사용하는 편이 시간이 절약될 것으로 보입니다.

 

1. Letsencrypt 인증서 발급

Ikev2 서버를 사용자 id/password 를 이용하여 접속하기 위해서는 인증서가 필요합니다.
무료인증서인 Let's Encrypt 인증서를 발급 받습니다.

# apt install certbot
# certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email your@email.com -d your_domain_name

 

2. 인증서 확인

인증서 발급이 성공하면 아래와 같이 인증서 파일이 있는 지 확인하고
인증서의 유효기간을 확인해 봅니다.

# ls -l /etc/letsencrypt/live/your_domain_name
lrwxrwxrwx 1 root root  42 Jul 29 22:36 cert.pem -> ../../archive/your.domain.name/cert1.pem
lrwxrwxrwx 1 root root  43 Jul 29 22:36 chain.pem -> ../../archive/your.domain.name/chain1.pem
lrwxrwxrwx 1 root root  47 Jul 29 22:36 fullchain.pem -> ../../archive/your.domain.name/fullchain1.pem
lrwxrwxrwx 1 root root  45 Jul 29 22:36 privkey.pem -> ../../archive/your.domain.name/privkey1.pem
-rw-r--r-- 1 root root 543 Mar  5 22:24 README
# certbot certificates
-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: your.domain.name
    Domains: your.domain.name
    Expiry Date: 2019-10-27 12:36:13+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/your.domain.name/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/your.domain.name/privkey.pem
-------------------------------------------------------------------------------

 

3. Strongswan Server download

아래 명령으로 Strongswan 최신버전을 다운로드합니다.
apt-get 으로 설치할 수 있는 Armbian 패키지는 mschapv2를 지원하지 않으므로 직접 소스에서 설치를 합니다.

# wget https://download.strongswan.org/strongswan-5.8.0.tar.gz

 

4. Strongswan Server Install

아래 명령으로 Strongswan Server를 소스에서 컴파일 하여 설치합니다..
설치되는 위치는 /usr/local/strongswan 입니다.

# tar xvzf ../down/strongswan-5.8.0.tar.gz
# cd strongswan-5.8.0
# ./configure --prefix=/usr/local/strongswan --sysconfdir=/etc --enable-openssl --enable-eap-mschapv2 --enable-md4 
# make 
# make install

 

5. 인증서 파일 링크

아래의 명령과 같이 1에서 발급 받은 인증서를 해당위치로 링크해 줍니다.
3군데 위치로 심볼릭 링크(또는 복사)해 주어야 하며, 아래에서 your.domain.name 부분을 자신의 도메인으로 수정해야 합니다.

# cd /etc/ipsec.d/certs
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/cacerts
# ln -s /etc/letsencrypt/live/your.domain.name/chain.pem .
# ln -s /etc/letsencrypt/live/your.domain.name/fullchain.pem .

# cd /etc/ipsec.d/private
# ln -s /etc/letsencrypt/live/your.domain.name/privkey.pem .

 

6. Strongswan Config

6.1 /etc/ipsec.conf 파일 수정

아래의 leftid 부분을 자신의 도메인으로 수정합니다.

# ipsec configuration <<
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

#define new ipsec connection
conn mytunnel-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
    esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@your.domain.name  <<-- 자신의 도메인으로 설정
    leftcert=fullchain.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.1.0/24
    rightdns=1.1.1.1,8.8.8.8
    rightsendcert=never
    eap_identity=%identity

 

6.2 /etc/ipsec.secrets 파일 수정

파일을 아래와 같이 수정합니다.
2번째 줄 부터 id/pass 설정이며, 콜론(:) 좌측이 id, 콜론 우측의 "" 부분이 패스워드입니다.

: RSA "privkey.pem"
alice : EAP "myPassword"
tom : EAP "tomPassword"

 

6.3 /etc/iptables.sav 파일 수정 (iptables 포워딩 설정)

포트 포워딩을 위해 iptables 저장 파일을 수정해 줍니다. 

# Generated by iptables-save v1.6.1 on Mon Mar  4 21:22:51 2019
*nat
:PREROUTING ACCEPT [10:797]
:INPUT ACCEPT [1:104]
:OUTPUT ACCEPT [2:304]
:POSTROUTING ACCEPT [2:304]
-A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
# for strongswan
-A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -i eth0 -j DROP
COMMIT
*mangle
:PREROUTING ACCEPT [207:17257]
:INPUT ACCEPT [207:17257]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [116:14048]
:POSTROUTING ACCEPT [116:14048]
#-A PREROUTING -m conntrack --ctstate INVALID -j DROP
COMMIT

위에서 -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j MASQUERADE 부분의 10.10.1.0/24 를 /etc/ipsec.conf 에서 설정한 주소와 동일하게 맞춰 줘야 합니다.
중간 부분의 # for strongswan 부분이 strongswan 에서 사용하는 포트입니다. 
공유기를 사용할 경우 500번과 4500번 포트를 별도로 포트포워딩해 주어야 합니다.

파일 저장이 끝나면 아래 명령으로 iptables 에 변경 내용을 적용합니다.

iptables-restore < /etc/iptables.sav

 

6.4 ip 포워딩 기능을 활성화 해 줍니다.

/etc/sysctl.conf 파일에 net.ipv4.ip_forward=1 을 추가해 줍니다.
저장 후 아래의 명령어를 입력해서 적용합니다.
# sysctl -p

 

7. Strongswan Server 시작/중지/상태확인

# cd /usr/local/strongswan
# sbin/ipsec start
Starting strongSwan 5.8.0 IPsec [starter]...
# sbin/ipsec status
Security Associations (0 up, 0 connecting):
  none
# sbin/ipsec stop
Stopping strongSwan IPsec...

 

8. Strongswan Server 스크립트파일 생성

vi /lib/systemd/system/strongswan.service 로 스크립트 파일 생성 후 아래 내용으로 저장한다.

[Unit]
Description=strongSwan IPsec daemon using ipsec.conf
After=network-online.target

[Service]
ExecStart=/usr/local/strongswan/sbin/ipsec start --nofork
ExecReload=/usr/local/strongswan/sbin/ipsec reload
StandardOutput=syslog
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

다음 명령으로 systemd 스크립트 적용

# systemctl daemon-reload
# systemctl enable strongswan

 

9. Strongswan Server 기동 및 상태확인

아래 명령으로 서버를 기동 후 상태를 확인합니다.

# systemctl start strongswan
# systemctl status strongswan

상태 확인 시 아래와 같이 Active: active 라고 표시 되어야 합니다.

# systemctl status strongswan
 strongswan.service - strongSwan IPsec daemon using ipsec.conf
   Loaded: loaded (/lib/systemd/system/strongswan.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-08-01 16:26:33 KST; 6min ago

 

10. 재부팅

서버를 재부팅 한 후 systemctl status strongswan 명령으로 상태를 확인해서 정상적으로 실행되면 완료입니다.

 

11. 안드로이드 클라이언트 설정

이제 서버측 설정은 완료되었으므로 안드로이드 기기의 구글 플레이에서 Strongswan 을 검색해서 설치해 줍니다.

설치 후 최초 실행화면입니다.

최초 실행화면

위 화면에서 우측 상단의 [ADD VPN PROFILE] 을 터치합니다.
그럼 아래와 같이 Profile 편집 화면이 나타납니다.

프로파일 편집 화면

아래 화면 처럼 각각의 항목을 넣어줍니다.

항목에 입력

Server: your.domain.name
VPN Type: IKEv2 EAP (Username/Password)
Username: alice
Password: 서버설정시 패스워드
CA certificate: Select automatically 체크함
Profile name: MyVPN(임의로 입력)

우측 상단의 SAVE를 터치해서 저장을 하면 아래 처럼 입력한 Profile 이 생성됩니다.

생성된 프로파일

위 화면에서 생성된 프로파일을 터치하면 서버에 접속을 시도하고 성공하면 아래와 같이 Connected 라고 표시됩니다.

상단알림바를 보시면 VPN 이라는 알림이 생깁니다. 이 상태에서 구글에서 My IP로 검색해서 내 IP를 확인해 보면 IP가 VPN IP로 바뀐 것을 확인할 수 있습니다.

접속된 화면

 

Notepad++ 64bit Hex Editor 플러그인 설치

유틸리티/Notepad++

Notepad++ 64bit 버전에서는 디폴트로 설치 가능한 플러그인이 많지 않으므로 플러그인을 사용하려면 32비트 버전을 설치하는 편이 좋다.

하지만 64비트를 사용할 필요가 있을 때 Hex Editor 플러그인을 사용하려면 다음 과 같은 방법으로 설치한다.

Notepad++ 7.6.x 에서 Test됨


먼저  https://github.com/chcg/NPP_HexEdit/releases 에서 HexEditor_0.9.8_x64.zip 파일을 다운로드 받는다.

64비트 버전이라면

C:\ProgramData\NotePad++\plugins\ 아래

HexEditor 폴더를 생성하고 그 안에 위에서 다운받은 zip 파일 안에 압축되어 있는 HexEditor.dll 파일을 복사해 넣는다.


이 후 Notepad++ 을 재시작 한 후에 플러그인 메뉴에 Hex-Editor 가 표시되면 정상적으로 설치된 것이다.

Hex-Editor - Option 에서 원하는 색상과 폰트를 설정해 주면 된다.