2020년 9월 21일 월요일

HADOOP HDFS [1] - CDH block count 임계값 오류


[ 원인 ]

 Hive로 실시간데이터를 받아오니 아래 그림과 같이 Data Block의 임계값 초과 경고문구가 뜬다. Default size가 128MB인 data block은 hdfs에서 유한한 저장공간 때문에 그 갯수를 제한하고 있다.  




[ 해결 ]

1. 블록 임계값 늘리기

CDM에서 HDFS->구성에 들어가 해당 "DataNode 블록 수 임계값"을 더 높게 설정한다. 



2. 필요없는 데이터 삭제하기 

데이터를 삭제하여 data block을 확보한다.



3. HDFS Rebalancing 수행

새로운 데이터노드를 추가하거나 삭제하기 때문에 데이터가 불균형하게 배포될 수 있다. 리밸런싱을 통한 데이터노드의 데이터 균일화로 불필요한 블록 수를 줄인다.

a. HDFS 서비스로 간다.

b. 상단의 Actions -> Rebalance를 클릭해 작업을 수행한다.

( 리밸런싱이 불필요한 경우 표시되지 않는다. )




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