2020년 10월 11일 일요일

Apache Sqoop [3] - 유저가이드2 [ sqoop-import ]

 

[ Sqoop-Import ]


1. 일반인수 (Common arguments)

  • --connect <jdbc-uri> : JDBC 접속URI 지정
  • --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
  • --verbose : working시 더 많은 정보 출력
  • --relaxed-isolation : 매퍼에 대해 커밋되지 않은 읽기 데이터를 가져온다. HDFS에 저장되기전 데이터를 컨트롤하기 위한 인수


2. 데이터베이스 서버 접속

접속예시

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username aaron --password 12345


비밀번호가 저장된 파일을 이용하여 접속

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username venkatesh --password-file ${user.home}/.password


또는 -P 인수를 통해 비밀번호를 콘솔에서 입력할 수 있다.

$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username aaron -P
password: *****


Sqoop은 몇몇 데이터베이스(Mysql)들은 기본적으로 지원한다. 지원하는 데이터베이스들의 JDBC가 설치되어 있기 때문이다. 

그러나 다른 데이터베이스를 사용하기위해 JDBC를 설치해야 하는 경우 해당 .jar파일을 $SQOOP_HOME/lib 경로에 추가시켜야한다. (데비안-/usr/lib/sqoop/lib) 



3. 유효성관련 인수 (Validation arguments)

인수   인수   
--validate
복사된 데이터의 유효성 검사 사용, 단일 테이블 복사본만 지원

--validator <class-name>
특정 vaildator클래스 지정

--validation-threshold <class-name>
사용할 유효성 검사 임계값 클래스 지정

--validation-failurehandler <class-name>
사용할 유효성 검사 오류 처리기 클래스 지정



4. Import 관련 인수 (Import control arguments)

인수   인수   
--append
기존 HDFS의 데이터세트에 데이터 추가

--as-avrodatafile
Avro 데이터파일로 가져오기

--as-sequencefile
SequenceFiles 데이터파일로 가져오기

--as-textfile
text파일로 가져오기 (default)

--as-parquetfile
Parquet 데이터파일로 가져오기

--boundary-query <statement>
분할 작성에 사용한 경계쿼리

--columns <col,col,col…>
테이블에서 가져올 Columns

--delete-target-dir
target directory가 있을 경우 삭제

--direct
데이터베이스에 대한 직접 컨넥터 사용

--fetch-size <n>
데이터베이스에서 한 번에 읽을 항목 수

--inline-lob-limit <n>
inline LOB의 최대크기 설정

-m,--num-mappers <n>
병렬로 작업 할 map tasks 수 설정

-e,--query <statement>
쿼리로 가져올 데이터 지정

--split-by <column-name>
컬럼을 구분하는데 사용되는 유닛 ex) ","

--split-limit <n>
정수 및 날짜 열에 대한 분할크기지정

--autoreset-to-one-mapper
primary key나 분할 기준열이 없는 경우 자동적으로 매퍼가 조정

--table <table-name>
읽을 테이블 지정

--target-dir <dir>
HDFS 디렉토리 경로 

--temporary-rootdir <dir>
import될 동안 생성할 임시 HDFS 디렉토리 경로

--warehouse-dir <dir>
지정된 테이블의 상위 HDFS 디렉토리

--where <where clause>
작성할 WHERE절

-z,--compress
압축사용

--compression-codec <c>
사용할 하둡 아축 코덱 (default gzip)

--null-string <null-string>
문자열컬럼이 null일 떄 쓸 문자열

--null-non-string <null-string>
비문자열컬럼이 null일 때 쓸 문자열


예시1)

$ sqoop import \
  --table employ \ \
--columns "id,name,age" \ --where "id > 300"


예시2)

$ sqoop import \
  --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
  --split-by a.id --target-dir /user/foo/joinresults

--query 사용시 WHERE절 뒤에 "AND \$CONDITIONS" 문구를 추가하여 이 문장이 조건절을 나타내고 있다는 표시를 해줘야 한다.

Ex) "SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"

또한 복잡한 조인쿼리는 오류가 생길 수 있다.



5. 병렬 제어 (Contorlling Parallelism)

-m 또는 --num-mappers 인수로 제어 할 수 있다. 병렬시 분할 기준은 기본키 또는 지정한 키값이다. 예를 들어 기본키가 0-1000이고, -m 4(맵리듀스 4개)로 설정하면 각 맵태스크는 250개씩 나누어 작업을 한다.

기본 키값이 균일하게 분포되지 않으면 작업 불균형이 생긴다. --split-by인수를 사용해 명시적인 컬럼을 선택한다.

--split-limit옵션을 사용하여 -m 또는 --num-mapers를 재정의 할 수 있다. --split-limit옵션은 분할된 태스크의 크기를 제한한다. 같은 예시로 위의 1-1000개의 기본키가 있는 테스크를 똑같이 -m 4, 그리고 --split-limit옵션은 task 200개로 지정하면 맵퍼수가 하나 증가하며 5개로 재조정된다.



6. 저장위치

 /shared/foo 에 저장된다

$ sqoop import --connnect <connect-str> --table foo --warehouse-dir /shared \
    ...
$ sqoop import --connnect <connect-str> --table foo --target-dir /shared/foo\
    ...

--target-dir와 --warehouse-dir은 같이 쓸 수 없다. 또한 대상 디렉토리가 HDFS에 이미 존재하는 경우 작동하지 않는다. 그럴 경우 대상 디렉토리 이름을 변경하던가 --delete-target-dir인수를 사용하여 기존 파일을 지운후 가져오는 방식을 사용해야 한다.


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를 클릭해 작업을 수행한다.

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