2020년 9월 20일 일요일

Apache Zeppelin [1] - 설치 [ Install ]

[ 조건 ]

Java설치


[ 다운로드 ]

$ wget http://mirror.navercorp.com/apache/zeppelin/zeppelin-0.9.0-preview2/zeppelin-0.9.0-preview2-bin-all.tgz

$ mkdir /usr/local/zeppelin

$ mv zeppelin-0.9.0-preview2-bin-all.tgz /usr/local/zeppelin/

$ tar -xzvf zeppelin-0.9.0-preview2-bin-all.tgz

$ cd /usr/local/zeppelin/zeppelin-0.9.0-preview2-bin-all



[ Java Path ]

$ which java

/usr/bin/java


$ ls /usr/bin/java

/usr/bin/java -> /etc/alternatives/java


$ ls -l /etc/alternatives/java

/etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64/jre/bin/java


jre앞부분 /usr/lib/jvm/java-1.8.0-amazon-corretto.x86_64를 

JAVA_HOME의 환경변수로 사용



[ CDH와 연동설정 ]

vi conf/zeppelin-env.sh

-

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/

export ZEPPELIN_ADDR=123.123.123.123

export ZEPPELIN_PORT=8090

export SPARK_HONE="/opt/cloudera/parcels/CDH/lib/spark"

export HADOOP_CONF_DIR="/etc/hadoop/conf"



[ 실행 / 중지 ]

./bin/zeppelin-daemon.sh start

./bin/zeppelin-daemon.sh stop



[ Web접속 ]

http://123.123.123.123:8090/ -> Web Ui 접속



[ 로그확인 ] 

vi logs/zeppelin-root-ip-123.123.123.123.ap-northeast-1.compute.internal.log


Apache Phoenix [1] - 설치 [ Install in cloudera manager ]


[ 설치 ]

parcel 설정페이지(우측상단의 선물함아이콘)로 들어가 아래 이미지와 같이

  • https://archive.cloudera.com/phoenix/6.2.0/parcels/
  • https://archive.cloudera.com/phoenix/6.2.0/csd/

를 추가한다.




"변경내용저장" 후 "새 Parcel확인(Check for New Parcels)"를 클릭 후 생기는 PHOENIX parcel을 다운로드 한다. 다운로드 이후에는 아래 이미지와 같이 배포된다.



ls /opt/cloudera/csd 로 PHOENIX-VERSION.jar 파일이 있는지 확인한다.






[ 수동설치 ]

https://archive.cloudera.com/phoenix/6.2.0/csd/

  • PHOENIX-1.0.jar

https://archive.cloudera.com/phoenix/6.2.0/parcels/

  • PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
  • PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha


[ HBase 설정 ]

1. Cloudera manager의 HBase service 페이지로 간다.

2. 구성(Configuration) 탭을 클릭한다..

3. 범위 > HBase(서비스차원)

4. 범주 -> 고급

5. hbase-site.xml에 대한 HBase 서비스 고급구성 스니펫(안전 밸브) 에 해당 설정내용 타이핑.

<property>

<name>hbase.regionserver.wal.codec</name>

<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>

</property>


<property>

<name>phoenix.functions.allowUserDefinedFunctions</name>

<value>true</value>

</property>


<property>

<name>phoenix.default.column.encoded.bytes.attrib</name>

<value>0</value>

</property>


Save and Restart


[ 샘플 테스트 ]

phoenix-psql /opt/cloudera/parcels/<phoenix parcel>/lib/phoenix/examples/WEB_STAT.sql
/opt/cloudera/parcels/<phoenix parcel>/lib/phoenix/examples/WEB_STAT.csv
/opt/cloudera/parcels/<phoenix parcel>/lib/phoenix/examples/WEB_STAT_QUERIES.sql



* 참조
* https://docs.cloudera.com/documentation/enterprise/6/6.2/topics/phoenix_installation.html#limit
* https://programming.vip/docs/cdh6.3.2-enable-kerberos-integration-using-phoenix.html


Apache Nifi [1] - 설치 [ Install in cloudera manager ]


[ CFM배포를 설치 ]

$ cd /opt/cloudera/csd

$ wget http://archive.cloudera.com/CFM/csd/1.0.0.0/NIFI-1.9.0.1.0.0.0-90.jar

$ wget http://archive.cloudera.com/CFM/csd/1.0.0.0/NIFICA-1.9.0.1.0.0.0-90.jar

$ wget http://archive.cloudera.com/CFM/csd/1.0.0.0/NIFIREGISTRY-0.3.0.1.0.0.0-90.jar

$ chown cloudera-scm:cloudera-scm NIFI*.jar 

$ chmod 644 NIFI*.jar 

$ service cloudera-scm-server restart



[ 클라우데라 매니저 서비스 재시작 ]

cloudera manager web ui -> Cloudera Management Service -> right button -> restart



parcel 설정페이지(우측상단의 선물함아이콘)로 들어가 아래 이미지와 같이 http://archive.cloudera.com/CFM/parcels/1.0.0.0/ 를 추가한다.




"변경내용저장" 후 "새 Parcel확인(Check for New Parcels)"를 클릭 후 생기는 CFM parcel을 다운로드 한다.










[ CDM에 설치 ]

Service Add를 통해 Nifi를 설치한다.












[ 접속확인 ]

http://IpAddress:8080/nifi/ 에 접속해 Nifi가 실행되는지 확인한다.














[ 권한 ]

Nifi를 통해 Hdfs or Hive데이터가 있는 폴더에 Data Input을 위해 그룹유저 추가

Ex) $ sudo gpasswd -a nifi hive



* 설치참조 : https://community.cloudera.com/t5/Community-Articles/Install-Nifi-on-one-node-using-Cloudera-Flow-Management/ta-p/244281

* CMF배포 버전 : https://docs.cloudera.com/cfm/1.1.0/download/topics/cfm-download-locations.html

* NIFI Document : https://nifi.apache.org/docs.html


Cloudera Manger [1] - EC2 설치 [ install in EC2 ]

[ 환경 ] 

RedHat Version 7

3대이상 EC2 Server


[ EC2 보안그룹 셋팅 ]

해당 Document를 참조 : https://docs.cloudera.com/management-console/cloud/environments/topics/mc-environment-aws-security-groups.html


[ 설치 ]

- 관련 패키지 설치

$ sudo yum update -y && sudo yum install wget -y && sudo yum install -y ntp && sudo systemctl start ntpd && sudo systemctl enable ntpd && sudo yum install iptables-services -y

$ sudo chkconfig ntpd on

$ wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.6/x86_64/os/Packages/libtirpc-devel-0.2.4-0.15.el7.x86_64.rpm

$ sudo yum install  libtirpc-devel-0.2.4-0.15.el7.x86_64.rpm


- Selinux 방화벽 설정

$ sudo vi /etc/selinux/config

SELINUX=disabled

$ sudo systemctl start iptables

//Saving your firewall rules can be done as follows:

$ sudo service iptables save

$ sudo chkconfig iptables off

$ sudo service ntpd start

$ sudo service iptables stop

$ sudo systemctl disable chronyd.service


- Install Hadoop 

$ sudo apt-get install openssh-server

$ sudo apt-get install ssh

$ sudo apt-get install rsync


- ssh key 설정

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

$ chmod 0600 ~/.ssh/authorized_keys

$ ssh localhost

//if still popup password run this

$ ssh-keygen

enter

ssh-add

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

$ ssh localhost


- Aws pem파일 설정

winSCP move to name.pem in server

$ ls -l

$ mv name.pem ./.ssh/id_rsa


- 멀티클래스터를 위해 EC2 create image

Aws 콘솔에서 인스턴스 우클릭 -> 이미지 -> 이미지 생성

생성된 이미지AMI로 EC2 인스턴스 만들기


- get the source installer

$ wget https://archive.cloudera.com/cm6/6.3.1/cloudera-manager-installer.bin

- make it executable

$ sudo chmod u+x cloudera-manager-installer.bin


- install

$ sudo ./cloudera-manager-installer.bin

next next next yes ... now u ll get ...

http:publicdns:7180에 접속해서 설치를 계속 수행

next do next next next .. follow this





[ 참고 ]

* Video : https://www.youtube.com/watch?v=ZfmlmQwCeZc

* Cloudera Manager Document : https://docs.cloudera.com/cloudera-manager/7.1.1/installation/topics/cdpdc-version-and-download-information.html

* Cloudera Altus Director Informations : https://docs.cloudera.com/documentation/director/latest/topics/director_deployment_start_launcher.html



Apache Kafka [3] server.properties 환경설정


* https://www.ibm.com/support/knowledgecenter/ko/SSPFMY_1.3.5/com.ibm.scala.doc/config/iwa_cnf_scldc_kfk_prp_exmpl_c.html


$ vi /usr/local/kafka/config/server.properties


[ Server Basics ]

broker.id=1 : 브로커를 구분하기위한 ID


[ Socket Server Settings ]

listeners=PLAINTEXT://:9092 : 카프카 소켓서버가 수신하는 주소. 기본포트는 9092

num.network.threads=3 : 네트워크 요청을 처리하는 데 사용되는 스레드 수

num.io.threads=8 : 입력 및 출력 조작에 사용되는 스레드의 수

socket.send.buffer.bytes=102400 : 소켓서버가 사용하는 전송버퍼의 크기

socket.receive.buffer.bytes=102400 : 소켓서버가 사용하는 수신버퍼의 크기

socket.request.max.bytes=104857600 : 소켓 서버가 수락하는 요청의 최대 크기, Out Of Memory를 방지

queued.max.requests=16 : 네트워크 스레드가 차단되기 전에 허용되는 최대 스레드 수


[ Log Basics ]

log.dirs=/data1,/data2 : 로그 파일을 저장하려는 디렉토리

num.partitions=1 : 토픽당 기본 파티션의 수. 파티션이 많을수록 메세지 소비가 더 많은 병렬처리가 된다. 그러나 기본적으로 서버의 물리적 프로세서 수의 절반정도를 권한다. 예를 들어 8개의 프로세서가 있으면 4개로 지정

num.recovery.threads.per.data.dir=1 : 각 데이터 디렉토리에 대한 로그 복구에 사용되는 스레드 수

log.index.size.max.bytes=154624 : 오프셋 색인의 최대 크기

log.index.interval.bytes=4096 : 오프셋 색인에 추가되는 간격바이트

message.max.bytes=1000000 : 서버가 수신할 수 있는 메시지의 최대 크기

auto.create.topics.enable=true : 서버에서 토픽을 자동 생성 ( 존재하지 않는 토픽으로 메세지 보낼시 )


[ Internal Topic Settings ]

offsets.topic.replication.factor=1 : 

transaction.state.log.replication.factor=1 :

transaction.state.log.min.isr=1 : 

그룹 메타데이터 _consumer_offsets 과 _transaction_state에 대한 복제관련 설정 


Log Flush Policy ]

log.flush.interval.messages=10000 : 메시지가 플러시되기 전에 누적될 수 있는 최대 메시지 수

log.flush.interval.ms=1000 : 메시지가 플러시되기 전에 메모리에 유지할 수 있는 최대 시간

log.flush.scheduler.interval.ms=2000 : 로그가 플레시 되는 간격


Log Retention Policy ]

log.retention.hours=168 : 저장된 로그 보관시간

log.retention.bytes=1073741824 : 지정된 로그에서 보존되어야 하는 바이트 수

log.segment.bytes=1073741824 : 저장되는 로그파일 하나의 크기

log.retention.check.interval.ms=300000 : 로그 보관주기 체크시간

log.cleaner.enable=false : 로그 클리너사용. 설정 시 로그 보존 정책에서 지정된 보존 기간이 만료된 후 로그가 삭제됨


[ Zookeeper ] 

zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181/hadoop-kafka : 주키퍼 접속 정보

zookeeper.connection.timeout.ms=6000 : 브로커와 주키퍼 사이의 최대 연결 대기시간. 연결되지 않으면 타임아웃 발생


[ Group Coordinator Settings ]
group.initial.rebalance.delay.ms=0 : Group Coordinator가 초기 컨수머 재조정 시키는 시간. 개발 및 테스트를 위해 딜레이 없는 0으로 정의. 볼륨이 큰 운영환경에서는 3초 권장

Apache Kafka [2] - 설치


환경

가상머신 : Virtualbox 6.2.12

운영체제 : CentOS-7-x86_64-Everything-2003.ios

3대설치 각 host는 hadoop01, hadoop02, hadoop03으로 지정


1. virtual machine에 centOS-7을 올리고 설치


2. Java설치

카프카를 설치하기 전 주키퍼(zookeeper)를 설치해야 하는데, 주키퍼는 자바(java)애플리케이션이기에 먼저 설치해준다.

$ yum -y install java-1.8.0-openjdb


3. 호스트 이름변경

vi /etc/hosts를 열어 

111.11.11.1111    hadoop01

222.22.22.2222    hadoop02

333.33.33.3333    hadoop03

을 추가한다. ( 3대 서버 모두 )


4. Zookeeper설치

설치와 환경설정 모두 3대 서버 동일하게 진행한다. 주키퍼는 과반수투표 프로세스 때문에 3대 5대 7대와 같이 홀수로 구성해야 한다.

설치할 path로 이동한다.

$cd /usr/local

$wget http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

$tar zxf zookeeper-3.4.14.tar.gz

심볼릭링크생성

ln -s zookeeper-3.4.14 zookeeper

설치경로와른 다른 별도의 주키퍼 데이터디렉토리를 추가한다. 여기엔 주키퍼지노드 복사본인 스냅샷과 트랜잭션 로그들이 저장된다. 

mkdir -p /data

myid라는 파일을 만들고 내용을 1이라고 한다.

echo 1> /data/myid    //host hadoop01

echo 2> /data/myid    //host hadoop02

echo 3> /data/myid    //host hadoop03


5. Zookeeper환경설정

$vi /usr/local/zookeeper/conf/zoo.cfg

tickTime=2000 : 주키퍼가 사용하는 시간에 대한 기본단위(밀리초)

initLimit=10 : 팔로워가 리더와 초기에 연결하는 시간에 대한 타임아웃 tick의 수

syncLimit=5 : 팔로워가 리더와 동기화하는 시간에 대한 타임아웃 tick의 수 (주키퍼에 저장된 데이터가 크면 수를 늘려야 함)

dataDir : 주기퍼의 트랜잭션 로그와 스냅샷이 저장되는 데이터 저장경로

clientPort : 주키퍼 사용 TCP포트

maxClientCnsxns=60 : 하나의 클라이언트에서 동시접속 수 제한. 0이면 unlimit로 설정

autopurge.purgeInterval=1 : 스냅샷 및 해당 트랜잭셕로그 자동 삭제 주기. 양수(1이상)로 설정하면 ON, 0은 OFF

server.N : 주기퍼 앙상플 구성을 위한 설정


기본설정은 수정하지 않고 

dataDir=/data

server.1=hadoop01:2888:3888

server.2=hadoop02:2888:3888

server.3=hadoop03:2888:3888

만 추가한다.

2888, 3888은 기본 포트이며 앙상블 내 노드끼리 연결(2888)하고, 리더선출(3888)에 사용한다.


6. Zookeeper 실행/중지

$ /usr/local/zookeeper/bin/zkServer.sh start    //실행

Using config: /usr/local/zookeeper/bin../conf/zoo.cfg

Starting zookeeper ... STARTED

$ /usr/local/zookeeper.bin/zkServer.sh stop    //중지


7. Kafka 설치

카프카 클러스터의 브로커 수를 3대로 구성

카프카 또한 자바 애플리케이션으로 자바가 설치되어야 함.

스칼라버전 2.13버전인 kafka2.6으로 다운로드.

$ cd /usrl/local

$ wget http://mirror.navercorp.com/apache/kafka/2.6.0/kafka_2.13-2.6.0.tgz

$ tar zxf kafka_2.13-2.6.0.tgz

심볼릭 링크

ln -s kafka_2.13-2.6.0


8. 카프카 환경설정

  • 서버별 브로커 아이디
  • 카프카 저장 디렉토리
  • 주키퍼정보

서버별 브로커 아이디

호스트        브로커ID

hadoop01    broker.id=1

hadoop02    broker.id=2

kadoop03    broker.id=3


카프카 저장디렉토리

카프카는 컨슈머가 메세지 소비 후에도 저장된 데이터를 임시로 보관할 수 있다.

이 데이터들은 디스크마다 별도로 저장할 수 있는데 예제에서는 디렉토리로 대체한다.

$ mkdir -p /data1

$ mkdir -p /data2


주키퍼정보

zookeeper.connect=주키퍼호스트:주키퍼포트/지노드네임

zookeeper.connect=172.30.1.17:2181,172.30.1.59:2181,172.30.1.40:2181/hadoop-kafka


server.properties 파일을 열어 3대 모두 카프카 환경설정을 해준다.

$ vi /usr/local/kafka/config/server.properties

broker.id = 1 / 2 / 3     각 서버별로 다르게 

log.dirs=/data1,/data2

zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181/hadoop-kafka


9. 카프카 실행

--daemon 옵션을 주어 백그라운드로 실행한다.

$/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties


중지하려면 다음 명령어를 입력한다.

$/usr/local/kafka/bin/kafka-server-stop.sh


10. 카프카 정보 확인

주키퍼에 접속하여 지노드를 확인해 카프카가 잘 작동하는지 확인해본다.

$/usr/local/zookeeper/bin/zkCli.sh

zk: localhost:2181(CONNECTED) 0] ls /

[ zookeeper, hadoop-kafka]


11. 카프카 로그 확인

$cat /usr/local/kafka/logs/server.log













Apache Kafka [1] - 개요 및 아키텍처

카프카는 이벤트스크리밍(Event Streaming)기반 메세징시스템(Messaging System)으로 실시간 데이터를 저장, 조작, 다른목적지로 배치작업 등을 하기에 용이하다. 


메세징시스템이란?

메세징시스템은 한 어플리케이션에서 다른 어플리케이션으로 데이터를 전송하는 역할을 한다. 분산메세징시스템은 메세지 큐를 기반으로 어플리케이션과 메세지 큐 사이에 비동기적(Asynchronously)으로 작동한다.

보통 2개의 타입의 메세징패턴이 제공되는데 포인트 투 포인트(point-point)와 게시구독(pub-sub)시스템이다.


포인트 투 포인트 메세징시스템(point to point messaging system)

대표적인 예로 주문처리시스템을 생각하면 된다. 한 명 이상의 소비자가 큐에 있는 메세지를 소비할 수 있지만 특정 메세지는 한 명의 소비자만 소비할 수 있다.



게시-구독 메세징시스템(publish-subscribe messaging system)

포인트 투 포인트 시스템과 달리 소비자들은 하나 이상의 큐에있는 데이터를 소비할 수 있다. 게시-구독 시스템에선 생산자를 Publisher라 하고, 메세지 소비자를 Subscriber라고 한다. 간단한 예로 TV채널을 들 수 있는데, 누구나 자신이 가입한 채널을 시청할 수 있듯이 Subscriber들은 연결되기만 하면 누구든 큐에서 데이터를 가져다 올 수 있다.


카프카도 분산된 게시-구독 메세징시스템이며, 대량의 데이터를 처리함과 동시에 데이터손실을 막기위해 데이터들은 클러스터 내에 복제된다. 카프카는 Zookeeper서비스 위에서 작동하며 아파치 스톰, 스파크 등과 연동하여 실시간 스트리밍분석 또한 용이하다.


카프카의 장점(Benefits)

  • 성능(Performance) - 카프카는 고성능 TCP네트워크 프로토콜을 통해 통신하는 분산형 시스템이다. 이는 모든 쓰기가 OS(RAM) 캐시로 수행하기 때문에 가능한데, 때문에 초당 200만번의 쓰기 작업을 수행 할 수 있다. 
  • 신뢰성(Reliability) - 대기시간이 짧은 메세지 전달을 지원하며, 분산/분할/복제를 통해 시스템 장애 발생 시 결함되지 않는 안정성을 보장한다. 
  • 확장성(Scalability) - 프로듀서와 컨슈머의 분리로 Hive, Hbase, Python 등과 같이 다양한 어플리케이션과 사용하기 쉬우며 다운타임(down time)없이 쉽게 확장 가능하다.
  • 내구성(Durability) - 카프카는 분산커밋로그(Distributed commit log)를 사용하여, 중간에 데이터를 잃어도 재생할 수 있어 내구성이 뛰어나다. 



주요 개념(main concepts)


- 카프카 아키텍처(kafka architecture)

  • Topics - 특정 범주에 속하는 메세지 스트림. 토픽을 통해 Producers와 Consumers가 데이터를 전송한다.
  • Partition - Topic을 이루는 단위. 토픽은 수많은 파티션으로 구성된다.
  • Partition offset - 파티션을 구분하는 시퀀스ID
  • Replicas of partition - 파티션 백업을 위한 복제본. 데이터를 읽거나 쓰지 않으며 단지 데이터 손실이 있을 경우 사용된다.
  • Brokers - 데이터를 관리하는 시스템. 각 브로커는 주제당 0개 이상의 파티션을 가질 수 있다.
  • Kafka Cluster - 카프카 브로커 1개 이상이 있는 것을 클러스터라고 부른다. 클러스터는 다운타임(down time)없이 확장할 수 있으며 메세지 데이터의 지속성과 복제를 관리하는데 사용된다.
  • Producers - 프로듀서는 하나이상의 카프카 토픽(Topic)을 제공한다. 프로듀서는 토픽의 파티션에 데이터를 전송하며 메세지를 퍼블리싱할 때마다 브로커가 파시션의 마지막 세그먼트 파일에 메세지를 첨부한다. 
  • Consumers - 컨슈머는 하나 이상의 토픽에 연결되어 있고 브로커로부터 데이터를 읽는다.
  • Leader - 리더는 주어진 파티션에 대한 모든 읽기,쓰기를 담당하는 노드다. 모든 파티션에는 리더 역할을 하는 하나의 서버가 있다. 
  • Follower - 리더의 지시를 따르는 노드. 리더가 결함시 팔로워 중 한명이 자동으로 새로운 리더가 된다. 팔로워는 메세지를 끌어들이고 자신의 데이터 저장소를 업데이트 한다.
  • Consumer Group - 컨슈머의 집합을 구성하는 단위. 컨슈머 그룹 안의 컨슈머 수만큼 파티션의 데이터를 분산처리한다.


- 프로듀서와 컨슈머 Read/Write Work Flow