2020년 10월 6일 화요일

Apache Sqoop [2] - 유저가이드1 [ Sqoop Tools ]


[ 1. Sqoop Tools ]


스쿱은 도구모음이다. 커맨드라인에 커맨드와 인자를 입력하여 사용한다. 다른 프로그램없이 자체 스쿱소스로 컴파일 될 경우, bin/sqoop 프로그램을 실행하여 sqoop을 사용할 수 있다. 스쿱 패키지 배포(apache bigtop과 함께 제공된 RPM등) 사용자는 프로그램을 /usr/bin/sqoop으로 설치하게 된다. 

Sqoop의 사용설명서는 'help'로 볼 수 있다.

$sqoop help

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

특정 인자에 대한 설명은 아래와 같이 메뉴얼을 확인할 수 있다.

$ sqoop help import



1-1. 커맨드별칭(Using Command Aliases)

sqoop import를 sqoop-import로, sqoop export를 sqoop-export 별칭으로 사용가능하다.



1-2. 하둡 설치 제어 (Controlling the hadoop Installation)

스쿱을 통해 하둡 bin/hadoop 스크립트를 실행 할 수 있다. 여러 개의 하툽이 설치되어 있는 경우 $HADOOP_CONMANY_HOME 또는 $HADOOP_MAPRED_HOME 환경변수를 이용해 하둡을 선택하여 설치한다.

예시 :

$ HADOOP_COMMON_HOME=/path/to/some/hadoop \
  HADOOP_MAPRED_HOME=/path/to/some/hadoop-mapreduce \
  sqoop import --arguments...

또는 :

$ export HADOOP_COMMON_HOME=/some/path/to/hadoop
$ export HADOOP_MAPRED_HOME=/some/path/to/hadoop-mapreduce
$ sqoop import --arguments...



1-3. 인수사용 ( Using Generic and Specific Arguments )

* 일반 인수

  • --connect <jdbc-uri> : 접속할 JDBC 주소
  • --connect-manager <class-name> : 사용할 연결 관리자
  • --driver <class-name> : JDBC driver class 지정
  • --hadoop-mapred-home <dir> : Override $HADOOP_MAPRED_HOME
  • --help : 도움말
  • --password-file : 인증관련 파일 경로
  • -P : 콘솔에서 비밀번호를 읽을 때
  • --password <password> : 인증패스워드 SET
  • --username <username> : 유저이름 SET
  • --hadoop-home <dir> : Override $HADOOP_HOME

* 하둡 관련 인수

  • -conf : 특성 어플리케이션 설정파일 지정
  • -D <property=value> : 주어진 property-value를 사용한다.
  • -fs <local | namenode:port> : 네임노드 지정
  • -files <comma separated list of files> :  지정할 맵리듀스 클러스터 파일
  • -libjars <comma separated list of jars> : 지정할 jar파일 경로
  • -archives <comma separated list of archives> : 지정할 아카이브


-conf, -D와 같은 인수는 --connect와 같은 인수 앞에 같이 사용 할 수 있다. 하둡인수는 단일 대쉬문자(-)로 표현되고 도구별 인수는 (--)더블 대쉬로 표현된다.

-files, -libjars, -archives 인수는 sqoop과 함께 사용되지 않지만, 하둡 내부 인수로 시스템 일부에 포함되어있다. 



1.4 옵션 파일을 이용한 명령어

$sqoop import --connect jdbc:mysql://localhost/db --username john --table TT

$sqoop --options-file /user/home/work/import.txt --table TT


*import.txt 내용

import
--connect
jdbc:mysql://localhost/db
--username
foo






2020년 9월 28일 월요일

Apache Hive [1] - 하이브 쿼리 퍼포먼스(속도)를 높이는 방법


[ 1. Tez Engine을 사용 ]

Apache Tez는 데이터 처리 작업의 복합 비순환 방향 그래프(DAG)를 생성하는 프레임 워크이다. 하둡의 YARN에 의해 매니징되면, 맵리듀스의 능력을 유지함과 동시에 대용량데이터 처리 속도를 높힌다.

[ Tez와 MR아키텍처 비교 ]


하이브 엔진으로 Tez를 사용하여 쿼리속도를 높힌다.

* set hive.execution.engine=tez;



[ 2. 백터화 (Vectorization) ]

백터화는 작업시 단일 행을 가져오지 않고 한번의 작업으로 1,024개의 행을 가져온다. filter, join, aggregation과 같은 작업의 성능을 향상시킨다.

아래 커맨드로 환경구성을 한다.

* set hive.vectorized.execution.enabled=true;

* set hive.vectorized.execution.reduce.enabled=true;



[ 3. ORC파일, ORC SerDe ]

ORC(Optimized Row Columnar)파일 형식은 데이터원본 크기의 78%까지 줄여 저장시 매우 효율적인 방법을 제공한다. 

[ https://blog.cloudera.com/orcfile-in-hdp-2-better-compression-better-performance ]


초기 컬럼(row)단위로 저장되는 RC파일형식은 읽기과정에서 조인의 수행시간이 길었다. 그래서 컬럼과 함께 인덱스까지 저장하는 ORC파일형식의 등장으로 데이터의 압축과 함께 읽고 쓰는데 향상된 퍼포먼스를 제공할 수 있게 되었다.



Create Table Emp ( empId int, empName varchar(100), age int)

STORED AS ORC tblproperties("compress.mode"="SNAPPY") 



[ 4. 파티셔닝( Partitioning ) ]

하이브는 RDBMS와 다르게 디렉토리로 파일을 분리하여 저장한다. 분리되는 기준은 어떻게 테이블을 파티션을 했느냐에 따라 달라지며 쿼리성능을 좌우한다. 

* 파티션 생성예제 :

CREATE TABLE tb1( col1 STRING ) PARTITIONED BY ( yymmdd STRING );



[ 5. 버켓팅(Bucketing) ]

버켓팅은 데이터를 파일별로 나누어 저장한다. 지정된 컬럼의 값이 해쉬처리되어 조인시 쿼리속도가 더 빠르다. 파티션을 버켓으로 더욱 세분화하여 성능을 향상시킬 수 있다.

* 버켓 생성예제 : 

CREATE TABLE tb1 (col1 STRING ) CLUSTERED BY (col1) INTO 50 BUCKETS;



[ 6. CBO(Cost-Based Optimizer) ]

하이브의 CBO는 쿼리처리의 핵심 컴포넌트이다. Apache Calcite의 구동되며 쿼리질의에 대한 비용을 최적화하고 계산한다. 

Calcite는 쿼리재작성, Join수정 및 제거 등으로 다양한 최적화 작업을 한다. Calcite를 거친 논리작업은 Hive에의해 tree로 변환되어 물리적으로 최적화되고 Tez작업으로 바뀐 후 Hadoop클러스터에서 실행된다.

비용기반 최적화(CBO)를 사용하려면 아래 매개변수를 설정한다.

* set hive.cbo.enable=true;

* set hive.compute.query.using.stats=true;

* set hive.stats.fetch.column.stats=true;

* set hive.stats.fetch.partition.stats=true;



2020년 9월 27일 일요일

zeppelin [ 4 ] - crontab


[ zeppelin-site.xml 설정 ]

sudo vi /usr/local/zeppelin/conf/zeppelin-site.xml

-- 추가 -- 

<property>

  <name>zeppelin.notebook.cron.enable</name>

  <value>true</value>

  <description>Notebook enable cron scheduler feature</description>

</property>



[ web UI crontab 설정 ]


Cron Expressions

seconds - minutes - hours - day of month - month - day of week - year

예시

0 0/5 * * * ? : 매 5분

10 0/5 * * * ? : 매 5분 10초 ( 10:00:10, 10:05:10 )

0 30 10-12 ? * WED,FRI : 10:30, 11:30, 12:30 매주 수요일,금요일

0 30 8 5,20 * ? : 5일~20일 매일 8시 30분




* 재플린Doc : https://zeppelin.apache.org/docs/0.8.2/usage/other_features/cron_scheduler.html#setting-up-a-cron-scheduler-on-a-notebook

* 크론 표현 : https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html



2020년 9월 22일 화요일

zeppelin [ 3 ] - spark CDH(cloudera manager)와 연동

 

1. CDH 작동확인

해당 웹UI를 통해 실행확인

HDFS : http://<hostname>:50070

YARN http://<hostname>:8088/cluster



2. 재플린 환경파일 설정

vi /zeppelinPath/conf/zeppelin-env.sh

export MASTER=yarn-client
export HADOOP_CONF_DIR=[your_hadoop_conf_path]
export SPARK_HOME=[your_spark_home_path]


HADOOP_CONF_DIR : 

도커설치시 : /scripts/docker/spark-cluster-managers/cdh/hdfs_conf

일반설치시 : /etc/hadoop/conf



3. 인터프린터 수정 및 실행

인터프린터 설정페이지에서 위 그림의 master를 yarn-client로 변경한다.



재플린에서 스파크를 실행한다.



Web Ui( http://<hostname>:8088/cluster/apps ) 로 접속하여 재플린 런닝상태를 확인한다.




* https://zeppelin.apache.org/docs/0.9.0-preview1/setup/deployment/cdh.html


2020년 9월 21일 월요일

Apache Zeppelin [2] - Hive 설치 [ Install ]


[ Interpreter 추가 ]

제플린 웹UI에서 우측상단의 Interpreter를 클릭한다. Default로 Hive는 설치되어있지않아 Hive Interpreter를 추가해야한다.




Interpreter name : hive( 임의로 )

Interpreter group : jdbc

properties :

dependencies :



타이핑 후 'Save'를 버튼을 누른다. 관련 파일을 다운로드 받은 후 Name옆에 초록색불이 뜨면 완료다.

아래 zeppelin document를 참고 

* https://zeppelin.apache.org/docs/0.9.0-preview1/interpreter/jdbc.html#apache-hive



[ 호환성 ]

Java와 hive-jdbc, zeppelin 삼박자에 맞는 서로 호환되는 버전을 설치해 주어야한다. 고려하지 않을 시엔 아래와 같은 메세지를 경험하게 될 것이다. 



위 메세지는 InPlaceUpdateStream Class를 찾지 못한다는 것인데 이 Class는 Hive-jdbc 2.2버전에 추가되었다. 따라서 내 hive version이 2.1.x이하라면 오류메세지를 띄운다. 


아래와 같이 각 버전을 맞춰 설치한다. 두번째 zeppelin-0.9.0-preview1는 현재 사용하고 있는 버전이다. 

  • zeppelin-0.8.2 / jdk 1.7 / hive-jdbc-0.14.x ~ 2.1.x / Mac OSX, Ubuntu14.X, CenOS 6.X Windows 7 Pro SP1
  • zeppelin-0.9.0-preview1 / jdk 1.8(171) / hive-jdbc-0.14.x ~ 2.1.x / Mac OSX, Ubuntu16.X, CenOS 7.X
  • zeppelin-0.9.0-preview2 / jdk 1.8(151+) / hive-jdbc-2.2.x + / Mac OSX, Ubuntu16.X, CenOS 7.X




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