2020년 3월 31일 화요일

Data Federation: 이기종 Database의 Greenplum 고속 연동



Greenplum의 데이터 연동 방식은 dblink,gpcopy,PXF, gpkafka 등 여러 방식으로 데이터 이관 또는 통합이 가능합니다.



이중 Pivotal Extension Framework (PXF)의 기본 개념은 데이터는 원천 시스템에 저장, 연산은 Greenplum에서 수행합니다.

즉, 이기종 database를 ETL과 같이 데이터 이관 없이 Greenplum에서 조회 및 연산 수행할 수 있습니다. 이는 Greenplum의 one SQL으로 멀티 소스의 데이터를 통합 분석이 가능합니다.

Greenplum 는 External Table으로 쉬운 Interface 제공(연동 편의성)하고, 고속의 병렬 Interface 기능으로 최상의 성능 제공하고 있습니다.

PXF 지원하는 이기종 시스템
 -  하둡 에코 시스템 (Hadoop, HDFS, Hive, and HBase)
 -  RDBMS (Oracle, DB2, MSSQL, MySQL, Postgresql 등)
 -  클라우드 스토리지(AWS S3, Minio, Google Cloud Storage, Azure Blob Storage and Azure Data Lake)

PXF 지원하는 포맷
 - Avro, AvroSequenceFile
 - JSON
 - ORC
 - Parquet
 - RCFile
 - SequenceFile
 - Text (plain, delimited, embedded line feeds)



아래의 예제는 PXF를 이용하여 Oracle의 데이터를 Greenplum에서 조회하는 기능입니다.

### Greenplum PXF 설정 요약 

1. Java 설치 
   - PXF는 Java로 구동되기 때문에 사전에 Java 1.8 또는 Java 11를 모든 노드에 설치합니다.
2. PXF 설정
   - Greenplum 엔진에 기본적으로 탑재되어 있어, 설정만 하면 됩니다.
   - JDBC 연동하는 경우에는 각 DBMS의 jdbc 드라이버가 필요합니다.
3. 관련 링크 
   -관련 링크: https://gpdb.docs.pivotal.io/6-5/pxf/instcfg_pxf.html



### Java 설치 및 PXF 설정, Oracle 연동  

1. PXF 를 이용하기 위한 Java 설치 (모든 노드)
    - PXF는 Java 기반으로 구성되어 Java가 필수적입니다.
    - 모든 노드에 jdk 설치 필요 합니다.

    - 개별 설치시
       # yum -y install java-1.8.0-openjdk-1.8.0*  (개별 설치시)
    - 전체 노드 일괄 설치시 (데이터 노드 전체 설치시)
    # gpssh -e -v -f gphostfile sudo yum -y install java-1.8.0-openjdk-1.8.0*

2. Java 환경 설정
   - 각 노드별로 설정 필요합니다.

   - 개별 설정 시
    $ echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.x86_64/jre' >> /home/gpadmin/.bashrc 

    - 전체 노드 일괄 설정시
    $ gpssh -e -v -f /home/gpadmin/gpconfigs/hostfile "echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre' >> /home/gpadmin/.bashrc" 

    - 설정 확인
       $ gpssh -e -v -f /home/gpadmin/gpconfigs/hostfile "cat /home/gpadmin/.bashrc | grep JAVA_HOME"
[INFO] login mdw
[INFO] login sdw2
[INFO] login sdw1
[ mdw] cat /home/gpadmin/.bashrc | grep JAVA_HOME
[ mdw] export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre
[sdw2] cat /home/gpadmin/.bashrc | grep JAVA_HOME
[sdw2] export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre
[sdw1] cat /home/gpadmin/.bashrc | grep JAVA_HOME
[sdw1] export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre
[INFO] completed successfully
       
3. Initializing PXF
   1) 마스터 노드에서 PXF 클러스터 초기구성 
   $ PXF_CONF=/usr/local/greenplum-pxf $GPHOME/pxf/bin/pxf cluster init
     Initializing PXF on master and 2 other hosts...
     PXF initialized successfully on 3 out of 3 hosts

   2) 커멘드
    $ $GPHOME/pxf/bin/pxf cluster start
    $ $GPHOME/pxf/bin/pxf cluster status
    $ $GPHOME/pxf/bin/pxf cluster stop
    $ $GPHOME/pxf/bin/pxf cluster reset
    
   3) pxf service 확인
    [gpadmin@mdw gpconfigs]$ $GPHOME/pxf/bin/pxf cluster status
     Checking status of PXF servers on 2 hosts...
     PXF. is running on 2 out of 2 hosts
     [gpadmin@mdw gpconfigs]$
     
   4) pxf binary 경로
     $ cd /usr/local/greenplum-db/pxf
     $ ls
        apache-tomcat  bin  conf  lib  pxf-service  run  templates  version
     
4. oracle jdbc 복사 및 설정
   1) oracle jdbc 파일 복사
     $ cp ojdbc6.jar $PXF_CONF/lib
     $ ls -la $PXF_CONF/lib

   2) oracle 서버 환경 설정 
     oracle의 서비스가 여려개 될 수 있기 때문에 각 서버/서비스별로 별도의 별칭으로 폴더 생성
     아래의 예시는 oracle_s1 으로 함.

     $ mkdir $PXF_CONF/servers/oracle_s1
     $ cd $PXF_CONF/server/oracle_s1
     $ vi jdbc-site.xml



<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
    <name>jdbc.driver</name>
    <value>oracle.jdbc.OracleDriver</value>
</property>
<property>
    <name>jdbc.url</name>
    <value>jdbc:oracle:thin:@172.16.127.161:1521/orcl</value>
</property>
<property>
    <name>jdbc.user</name>
    <value>scott</value>
</property>
<property>
    <name>jdbc.password</name>
    <value>tiger</value>
</property>
</configuration>


  3) 설정 파일 모든 노드에 Sync(복제)
      - 마스터 노드만 설정하고 난뒤 모든 노드에 일괄 동기화 (파일 및 설정 파일 동기화)
    $ $GPHOME/pxf/bin/pxf cluster sync
    $ gpssh -h sdw1 -h sdw2 "ls -la /usr/local/greenplum-pxf/servers/oracle_s1" 
[sdw1] 합계 4
[sdw1] drwxrwxr-x 2 gpadmin gpadmin  27  3월 31 17:56 .
[sdw1] drwxrwxr-x 5 gpadmin gpadmin  51  3월 31 17:47 ..
[sdw1] -rw-rw-r-- 1 gpadmin gpadmin 432  3월 31 17:56 jdbc-site.xml
[sdw2] 합계 4
[sdw2] drwxrwxr-x 2 gpadmin gpadmin  27  3월 31 17:56 .
[sdw2] drwxrwxr-x 5 gpadmin gpadmin  51  3월 31 17:47 ..
[sdw2] -rw-rw-r-- 1 gpadmin gpadmin 432  3월 31 17:56 jdbc-site.xml
    $ gpssh -h sdw1 -h sdw2 "ls -la /usr/local/greenplum-pxf/lib"
[sdw1] 합계 1944
[sdw1] drwxrwxr-x 2 gpadmin gpadmin      24  3월 31 17:50 .
[sdw1] drwxrwxr-x 8 gpadmin gpadmin      88  2월  7 11:39 ..
[sdw1] -rwxr-xr-x 1 gpadmin gpadmin 1988051  3월 31 17:50 ojdbc6.jar
[sdw2] 합계 1944
[sdw2] drwxrwxr-x 2 gpadmin gpadmin      24  3월 31 17:50 .
[sdw2] drwxrwxr-x 8 gpadmin gpadmin      88  2월  7 11:39 ..
[sdw2] -rwxr-xr-x 1 gpadmin gpadmin 1988051  3월 31 17:50 ojdbc6.jar
[gpadmin@mdw oracle_s1]$    

  4) pxf 설정 반영
     $ $GPHOME/pxf/bin/pxf cluster stop
     $ $GPHOME/pxf/bin/pxf cluster start

5. Greenplum 에서 oracle 접속하기 위한 유저 설정
   1) 계정 생성 및 권한 설정
     - 일반 유저로 생성합니다.
     $ psql 
      gpadmin=# CREATE EXTENSION pxf;
      gpadmin=# CREATE ROLE uorascott LOGIN ENCRYPTED PASSWORD 'oracle';
      gpadmin=# GRANT SELECT ON PROTOCOL pxf TO uorascott;
      gpadmin=# GRANT INSERT ON PROTOCOL pxf TO uorascott;
      gpadmin=# GRANT ALL ON PROTOCOL pxf TO uorascott;

  2) EXTERNAL TABLE 생성
     - 테이블 생성시 LOCATION에는 오라클의  유저계정과 테이블명 사용 (scott.tiger
     - SERVER명은 여러개의 Oracle 서버가 구성될 수 있기 때문에, 서버명을 기입해야 함.
     $ psql -U uorascott -d gpadmin     
     DROP EXTERNAL TABLE IF EXISTS EXT_R_EMP;
     CREATE EXTERNAL TABLE EXT_R_EMP
     (
        EMPNO              NUMERIC(4),
        ENAME              VARCHAR(10),
        JOB                VARCHAR(9),
        MGR                NUMERIC(4),
        HIREDATE           DATE,
        SAL                NUMERIC(7,2),
        COMM               NUMERIC(7,2),
        DEPTNO             NUMERIC(2) 
     ) 
     LOCATION ('pxf://scott.emp?PROFILE=Jdbc&SERVER=oracle_s1')
     FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');    

   3) Greenplum 에서 External table 조회
     - 조회 시점에 Oracle의 데이터를 가져옵니다.(JDBC를 통해서...)

gpadmin=> SELECT * FROM EXT_R_EMP;
 empno | ename  |    job    | mgr  |  hiredate  |   sal   |  comm   | deptno
-------+--------+-----------+------+------------+---------+---------+--------
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |         |     20
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |         |     20
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |         |     30
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |         |     10
  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |         |     20
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 |         |     10
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30
  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |         |     20
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |         |     30
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |         |     20
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |         |     10
(14 rows)

Time: 165.690 ms

6. 특수 기능
   1) Partition Options 
     - 대량의 데이터 추출이 필요할 경우 PARTITION_BY, RANGE, INTERVAL을 이용하여 멀티 프로세스로 데이터 추출 지원
     - 단 소량의 데이터일 경우에는 의미 없음. (아래는 예시입니다.)
     $ psql -U uorascott -d gpadmin     
     DROP EXTERNAL TABLE IF EXISTS EXT_R_EMP_PT;
     CREATE EXTERNAL TABLE EXT_R_EMP_PT
     (
        EMPNO              NUMERIC(4),
        ENAME              VARCHAR(10),
        JOB                VARCHAR(9),
        MGR                NUMERIC(4),
        HIREDATE           DATE,
        SAL                NUMERIC(7,2),
        COMM               NUMERIC(7,2),
        DEPTNO             NUMERIC(2) 
     ) 
     LOCATION ('pxf://scott.emp?PROFILE=Jdbc&SERVER=oracle_s1&PARTITION_BY=SAL:int&RANGE=100:10000&INTERVAL=1000')
     FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); 

     - Partition Options 조회
gpadmin=> SELECT * FROM EXT_R_EMP_PT;
 empno | ename  |    job    | mgr  |  hiredate  |   sal   |  comm   | deptno
-------+--------+-----------+------+------------+---------+---------+--------
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30
  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |         |     20
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |         |     10
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |         |     20
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |         |     30
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |         |     10
  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |         |     20
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |         |     20
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |         |     20
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |         |     30
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 |         |     10
(14 rows)

Time: 365.874 ms <<<<<<<<<<<<<< 프로세싱하는 동안 시간이 지연, 용량이 클 때 파티션 기능 유리.
gpadmin=>

   2) Named Query 
     - 사전에 쿼리를 저장하고 난 뒤에 쿼리를 이용하여 쿼리 결과를 External Table화 하는 기능
     - 자세한 내용은 메뉴얼를 참조하시면 됩니다.
     https://gpdb.docs.pivotal.io/6-5/pxf/jdbc_pxf.html

7. JDBC 설정 옵션
   1) 메뉴얼 참조 : https://gpdb.docs.pivotal.io/6-5/pxf/jdbc_pxf.html

8. PXF 주요 기능
   1) PXF Filter Pushdown
      - External table 조회시 Where 조건이 들어갈 경우에는 원천 소스시스템에서 필터링되고 난뒤의 결과값을 
        Greenplum으로 가져옵니다.
        => 즉, 파티션 스캔/인덱스 스캔 후 필요한 데이터만 네트워크를 타고 이동. 
      - 이를 위해서는 Greenplum 파라미터 중에 gp_external_enable_filter_pushdown 가 on 일때 적용됩니다. (default 값은 on )
   2) Column Projection
      - External Table에 컬럼을 많이 정의하더라도, 조회되는 컬럼에 대해서만 데이터를 추출
      

9. Oracle 셋팅
    - 소스가 되는 Oracle에서는 작업할 내역은 없습니다.
    - 기본적으로 확인하기 위해서 수행했던 스크립트는 아래와 같습니다.

   1) DB Startup and 리스너 start
      $ sqlplus "/as sysdba"
      SQL>startup
ORACLE instance started.
...
SQL>exit
     $ lsnrctl start  
     $ tnsping orcl
     $ sqlplus scott/tiger
     SQL> select * from emp;

     EMPNO ENAME      JOB        MGR  HIREDATE     SAL       COMM       DEPTNO
     ----- ---------- --------- ----- ------------ ---------- --------- -------------
      7369 SMITH      CLERK     7902 17-DEC-80      800                 20  
     
SQL> DESC EMP;
      Name            Null?    Type
      ----------------------------------------- -------- ----------------------------
      EMPNO             NOT NULL NUMBER(4)
      ENAME             VARCHAR2(10)
      JOB               VARCHAR2(9)
      MGR               NUMBER(4)
      HIREDATE          DATE
      SAL               NUMBER(7,2)
      COMM              NUMBER(7,2)
      DEPTNO            NUMBER(2)

    2) Oracle로 접속시 에러 발생될 경우 => iptables를 내려주세요.. 
[root@oracle ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]    

Pivotal 메뉴얼에 더 많은 정보가 있으니 참고하세요. 
링크: https://gpdb.docs.pivotal.io/6-5/pxf/jdbc_pxf.html


2020년 3월 11일 수요일

Greenplum 소개


1. Greenplum 소개

Greenplum은 대용량 분석 작업에 최적화된 병렬처리(MPP) 기반의 오픈소스 데이터 플랫폼입니다.

Greenplum 처음 프로젝트에서는 데이터웨어하우스를 목적으로 시작되었습니다. 국내 시장에서 2009년도에는 "병렬 처리기반의 빠른 SQL이다" 라고 해서 시장에 나오게 되었습니다. 그 당시 전통적인SMP RDBMS보다 10배~100배 정도 빨랐기 때문에 DW 용도로 서비스가 시작되었습니다.

2009년에는 빠른 병렬 SQL, 2012~2013년에 하둡 붐이 일었을 때에는 쿼리 뿐만 아니라 하둡과의 병렬 초고속 데이터 연동, 2013~2016년에는 머신러링등의 고급분석을 In-Database 병렬 분석으로 많은 포커스르 하였습니다.

현재는 정형/비정형 데이터뿐만 아니라, R/Python/GPU를 활용한 AI 분석 지원, 인프라 측면에는 Bare Metal, Private Cloud, Public Cloud를 지원하고 있습니다. 이로서 국내 뿐만 아니라 많은 해외 업체들이 Greenplum을 DW, 빅데이터 분석, 머신러링/AI 분석으로 활용하고 있습니다.


1.1 Greenplum 히스토리

  • 2003년: Greenplum 설립(Founder: Scott Yara, Luke Lonergan)
  • 2007년: Greenplum 3 출시 및 판매시작
  • 2008년: Greenplum Korea 설립
  • 2009년: 국내 Greenplum 사용시작
  • 2010년: Greenplum 4 출시, EMC에서 Greenplum 인수 및 DW Greenplum Appliance 출시
  • 2013년: EMC에서 Pivotal로 분사
  • 2015년: Pivotal에서 Open Source 전략 채택 및 오픈소스 화 (Apache 2.0 license)
  • 2017년: Greenplum 5 출시
  • 2019년: Greenplum 6 출시

1.2 Greenplum 글로벌 현황

Database 추세는 상용 Database 라이선스가 줄어들며, 오픈 소스 생태계가 활성화 되고 있습니다.

2019년 Gartner 자료에 따르면 OSS 소스 분석 Database 글로벌 1위, 전체 분석 Database 시장에서 3위를 하였습니다. 국내 뿐만 아니라 해외에서도 분석 Database로 많이 사용하고 있습니다.




2. Greenplum 아키텍처


Greenplum은 여러개의 서버를 하나의 클러스터로 구성하는 shared-nothing 아키텍처입니다.
즉, 데이터가 모든 서버에 분산이 되어 있으며, 개별 서버에서 병렬로 처리되는 아키텍처입니다.
사용자의 모든 데이터는 세그먼트(데이터) 노드에 위치하고 있으며, 데이터가 있는 곳에서 병렬로 연산합니다. 이로써 세그먼트(데이터) 노드가 많으면 많을 수록 성능 향상이 있으며, 선형적인 확장성을 제공합니다. 단일 클러스터로는 작게 수TB(Private Cloud)에서 많게는 수 PB까지 처리할 수 있습니다.


Greenplum 컴포넌트 구성

  • 마스터 노드 : 사용자가 접속하는 접점으로 커넥션/권한 체크/병렬 최적 쿼리 플랜 작성/쿼리 실행 명령
  • 세그먼트(데이터 노드) : 사용자의 데이터가 저장되고, 실제 연산을 수행, SQL뿐만 아니라 R, Python, PostGIS 등이 수행. 한 세그먼트 노드에서도 병렬처리 됨(보통 4, 6, 8, 12개 병렬 처리 됨)  
  • Interconnect 스위치: 데이터 이동이 필요한 경우 Interconnect 스위치를 활용. 물리적인 스위치와 Gnet이라고 하는 소프트웨어에서 데이터 이동 관리

3. Greenplum 특장점


3.1 Data Warehouse에서 AI 까지 단일 플랫폼에서 분석  

  • 다양한 비정형 데이터 통합 분석 지원
  • 정형 데이터 뿐만 아니라 비정형 데이터 즉, xml, Json, Document, 지리정보, Hadoop ORC 등의 다양한 포맷의 데이터를 하나의 플랫폼에서 처리
  • 전통적인 방식의 분석 플랫폼은 DW, 지리정보, 그래프, 클러스터링, 회귀분석, 텍스트 분석 등 별도로 구성하지만 Greenplum에서는 하나의 플랫폼에서 모두 분석



3.2 엔터프라이즈 데이터 사이언스

  • 병렬 머신러닝, 딥러닝, AI, GPU 지원 기능 제공
  • 병렬 In-Database 고급 분석 기법 
  • SQL base의 머신러닝 라이브러리: MADLib
  • OSS 고급 분석 라이브러리 모두 활용: R, Python, Java


  • 일반적인 분석 방법에서의 문제점으로 대용량 분석이 힘듬. 데이터가 존재하는 곳에서 분석 서버(R, SAS, Python)으로 데이터 전송 필요 (10시간/1TB, ODBC 기준, 대부분의 분석 시스템은 동일)하고, 대용량이기 때문에 서버의 메모리 및 CPU 한계 발생
  • Greenplum의 In-DB 분석은 데이터 이동없이, DB의 리소스를 사용하여 병렬 처리 지원하여 빠른 시간내에 많은 데이터 분석을 할 수 있음.
  • 국내외 사례로 3주 분석을 2일만에 처리하여 모델링을 다양하게 적용할 수 있음.
  • 해외에서도 In-Database 분석을 많이 하지만, 국내의 전체 Greenplum 중 35% 이상이  In-Database를 활용한 머신러닝, AI 분석 진행.

In-Database 분석 예시(PL/X)

  • SQL에서 지원되는 분석도 있지만, 간단하게 pl/r, pl/python으로 R, Python분석을 지원하며, 메트릭 연산으로 10배~100배 성능 개선 효과
  • 회귀분석, 클러스터링, 클래스피케이션등도 DB에서 처리



3.3 Data Federation (이기종 시스템의 고속 SQL Interface)

  • 하둡 에코시스템 연동(Hive, HDFS, Hbase) 등 병렬 데이터 Read/Write 기능 (2백만~4백Row / Sec)
  • Kafka 연동: 1백만 ~ 4백만 Row/Sec
  • 타 DBMS의 데이터도 병렬 데이터 Read 기능 제공 


Data Federation, PXF 사용법

  • External table의 심플한 인터페이스로 데이터 소스의 Read/Write 기능 제공
  • HiveORC, Hbase 등과 같이 파티션/인덱스가 있을 경우 Push Down기능 제공
  • 365일 파티션 테이블에서 1일 데이터 조회시 1일 데이터만 Read 하는 기능 제공


3.4 복합 워크로드 제어 기능(WLM)

보통 분석 시스템에서 항상 나오는 이야기가 배치는 빠른데, 일반 조회성 쿼리의 성능을 맞출 수 있느냐라는 질문을 많이 받습니다.

전사에서 보는 일별 현황이 있고, 배치도 수행하고, 머신러링 형태로 분석하는 것이 동시에 수행될 때 어느 업무가 중요할까요?

대부분 70~80% 이상은 전사 일별 현황이 가장 중요하죠. 이는 다수의 사람보는 리포트는 상대적으로 가벼운 쿼리가 대부분이고, 또 빠른 응답을 원합니다. 이에 반면에 배치 처리와 머신러닝 등과 같은 작업은 많은 리소스를 사용하게 되죠. 그리고 오랫동안 수행되는 경향이 있습니다.

이러한 고객의 다양한 요구사항을 맞추기 위해서 Greenplum에서는 Rescoue Group라는 워크로드 매니저를 지원하고 있습니다.

Greenplum Resource Manager (Resource Group)

  • REHL/CentOS 의 컨테이너 리소스 격리기술을 이용하여, CPU/Memory의 제한 설정


Resource Group 적용시 쿼리 응답시간 측정 결과

  • 동일한 Short 쿼리를 계속 실행시키면서 배치쿼리 및 분석 쿼리 실행시, Short 쿼리 응답속도 보장 


3.5 다양한 인프라 환경지원


Greenplum은 S/W으로서 다양한 인프라 환경을 지원합니다. 제 PC에서도 구성하여, 테스트를 할 수 있으며, 성능 최적화를 위한 Bare Metal 구성, 인프라의 유연성이 필요할 때  가상화, Private Cloud, Public Cloud 뿐만 아니라 쿠버네티스 환경 모두 지원합니다.

실제 많은 국내외 업체에서 다양한 인프라 환경에서 Greenplum을 사용하고 있습니다.



4. Greenplum 소개 요약


Greenplum은 DW용으로 병렬기반의 빠른 SQL로 시작하였지만, 외부 인터페이스 연동도 병렬처리, 병렬기반의 In-Database 고급 분석 처리, 비정형 데이터까지 확장하면서 MPP RDBMS가 아닌 Data 분석 플랫폼으로 자리매김하고 있습니다.

다년간의 고객 경험으로 가트너에서도 상위 랭킹을 하고 있으며, 지속적으로 발전하고 있습니다.

오픈소스로서 누구나 쉽게 도입해서 사용할 수 있기 때문에 Greenplum 경험해 보시기를 권해드립니다.


2020년 3월 9일 월요일

Greenplum에서 리소스 관리


보통 분석 시스템에서 항상 나오는 이야기가 배치는 빠른데, 일반 조회성 쿼리의 성능을 맞출 수 있느냐라는 질문을 많이 받습니다.

전사에서 보는 일별 현황이 있고, 배치도 수행하고, 머신러링 형태로 분석하는 것이 동시에 수행될 때 어느 업무가 중요할까요?

대부분 90% 이상은 전사 일별 현황이 가장 중요하죠. 이는 다수의 사람보는 리포트는 상대적으로 가벼운 쿼리가 대부분이고, 또 빠른 응답을 원합니다. 이에 반면에 배치 처리와 머신러닝 등과 같은 작업은 많은 리소스를 사용하게 되죠. 그리고 오랫동안 수행되는 경향이 있습니다.

이러한 고객의 다양한 요구사항을 맞추기 위해서 Greenplum에서는 Rescoue Group라는 워크로드 매니저를 지원하고 있습니다.

리소스 제한 테스트한 결과는 아래와 같습니다.

1. PL/R 수행시 리소스 관리 기능 예시
   1) SQL
      * 머신러링 PL/R SQL
        [gpadmin@mdw rgtest]$ cat plr.sql
        select  (dw.sp_plr_predict(id,  category, attb01_arr, attb02_arr, attb03_arr) ).*
          from dw.tb_user_data p ;      
       [gpadmin@mdw rgtest]$  
      * 일반 SQL  
        [gpadmin@mdw rgtest]$ cat query.sql
        select count(*) from abalone a, abalone b, abalone c;
        [gpadmin@mdw rgtest]$
     
   2) 수행
      - 쿼리 동시 수행
      * PL/R 쿼리 수행
      [gpadmin@mdw rgtest]$ psql -U udba -ef plr.sql -d gpadmin &
      [gpadmin@mdw rgtest]$ Timing is on.
      select  (dw.sp_plr_predict(id,  category, attb01_arr, attb02_arr, attb03_arr) ).*
          from dw.tb_user_data p ;      
         
      * 일반 SQL 수행
      [gpadmin@mdw rgtest]$ psql -U gpadmin -ef query.sql gpadmin &
      select count(*) from abalone a, abalone b, abalone c;    
      [gpadmin@mdw rgtest]$                            
     
2. 리소스 사용율 비교    
   1) Default 사용시  
      * Top 프로세스 확인(세그먼트 노드의 CPU 확인)
      top - 16:10:27 up 1 day, 11:29,  2 users,  load average: 2.46, 0.67, 0.27
      Tasks: 182 total,   8 running, 174 sleeping,   0 stopped,   0 zombie
      %Cpu(s): 80.7 us, 11.4 sy,  0.0 ni,  7.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      KiB Mem :  1867024 total,   445608 free,   504276 used,   917140 buff/cache
      KiB Swap:  2097148 total,  2050164 free,    46984 used.   679600 avail Mem 
      
         PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                 
       37956 gpadmin   20   0  637840  14108  10376 R 22.8  0.8   0:08.32 postgres:  6000, gpadmin gpadmin 172.16.25.141(19982) c+    ===> 일반 쿼리
       37957 gpadmin   20   0  637840  14108  10384 R 22.8  0.8   0:08.32 postgres:  6001, gpadmin gpadmin 172.16.25.141(36046) c+    ===> 일반 쿼리
       37981 gpadmin   20   0 1045332 196760  22724 R 22.8 10.5   0:09.32 postgres:  6001, udba gpadmin 172.16.25.141(36080) con8+    ===> PLR  쿼리
       37980 gpadmin   20   0 1045300 195480  22644 R 22.4 10.5   0:09.32 postgres:  6000, udba gpadmin 172.16.25.141(20016) con8+    ===> PLR  쿼리
         737 root      20   0  305148   1988   1500 S  0.3  0.1   1:24.78 /usr/bin/vmtoolsd                                       
       37984 gpadmin   20   0  637620  10872   7160 R  0.3  0.6   0:00.02 postgres:  6000, udba gpadmin 172.16.25.141(20024) con8+
       37985 gpadmin   20   0  637620  10864   7160 R  0.3  0.6   0:00.03 postgres:  6001, udba gpadmin 172.16.25.141(36088) con8+
       38070 root      20   0  145844   5280   4020 S  0.3  0.3   0:00.01 sshd: gpadmin [priv]                                    
           1 root      20   0  125272   2564   1568 S  0.0  0.1   0:59.37 /usr/lib/systemd/systemd --switched-root --system --des+
           2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 [kthreadd]                                              
           3 root      20   0       0      0      0 S  0.0  0.0   0:08.49 [ksoftirqd/0]                                           
           5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [kworker/0:0H]                                          
           7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 [migration/0]                                           
           8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [rcu_bh]                                                
           9 root      20   0       0      0      0 S  0.0  0.0   0:35.59 [rcu_sched]                                             
          10 root      rt   0       0      0      0 S  0.0  0.0   0:03.04 [watchdog/0]      
                          
      * Resource Group의 상태 확인 
      [gpadmin@mdw rgtest]$ alias rgs
      alias rgs='psql -c "SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment order by rsgname, hostname;"'    
      [gpadmin@mdw rgtest]$ rgs
          rsgname    | groupid | hostname | segment_id |  cpu  | memory_used
      ---------------+---------+----------+------------+-------+--------------
       admin_group   |    6438 | mdw      |         -1 |  0.52 |           6
       admin_group   |    6438 | sdw1     |          0 | 45.05 |           0
       admin_group   |    6438 | sdw1     |          1 | 44.34 |           0
       admin_group   |    6438 | sdw2     |          2 | 44.62 |           0
       admin_group   |    6438 | sdw2     |          3 | 43.71 |           0
       rgudba             |   32997 | sdw1     |          1 | 46.07 |          40
       rgudba             |   32997 | sdw1     |          0 | 45.44 |          40
       rgudba             |   32997 | sdw2     |          2 | 45.83 |          40
       rgudba             |   32997 | sdw2     |          3 | 46.52 |          40
     
   2) Resource Group 설정 변경
      gpadmin=# alter resource  GROUP admin_group  set CPU_RATE_LIMIT 30;
      ALTER RESOURCE GROUP
      Time: 70.391 ms
      gpadmin=# alter resource  GROUP rgudba  set CPU_RATE_LIMIT 10;
      ALTER RESOURCE GROUP
      Time: 51.999 ms
      gpadmin=#
     
   3) Resource Group 설정 후 리소스 확인        
      * sdw1에서 top으로 확인
       top - 16:12:11 up 1 day, 11:31,  2 users,  load average: 5.22, 2.16, 0.85
       Tasks: 178 total,   5 running, 173 sleeping,   0 stopped,   0 zombie
       %Cpu(s): 88.4 us,  5.3 sy,  0.0 ni,  6.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
       KiB Mem :  1867024 total,   393688 free,   556336 used,   917000 buff/cache
       KiB Swap:  2097148 total,  2050164 free,    46984 used.   627868 avail Mem 
       
          PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                 
        37957 gpadmin   20   0  637840  14108  10384 R 33.9  0.8   0:35.87 postgres:  6001, gpadmin gpadmin 172.16.25.141(36046) c+    ===> 일반 쿼리
        37956 gpadmin   20   0  637840  14108  10376 R 33.6  0.8   0:35.86 postgres:  6000, gpadmin gpadmin 172.16.25.141(19982) c+    ===> 일반 쿼리
        37980 gpadmin   20   0 1073064 222864  22648 R 11.3 11.9   0:27.70 postgres:  6000, udba gpadmin 172.16.25.141(20016) con8+    ===> PLR 쿼리
        37981 gpadmin   20   0 1072940 229340  22728 R 11.3 12.3   0:27.71 postgres:  6001, udba gpadmin 172.16.25.141(36080) con8+    ===> PLR 쿼리
        38004 gpadmin   20   0  157792   2376   1660 R  0.7  0.1   0:00.26 top                                                     
          559 root      20   0   36880   1520   1356 S  0.3  0.1   1:00.36 /usr/lib/systemd/systemd-journald                       
         7887 root      20   0   24252   1708   1396 S  0.3  0.1   0:04.43 /usr/lib/systemd/systemd-logind                         
            1 root      20   0  125272   2564   1568 S  0.0  0.1   0:59.42 /usr/lib/systemd/systemd --switched-root --system --des+
            2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 [kthreadd]                                              
            3 root      20   0       0      0      0 S  0.0  0.0   0:08.51 [ksoftirqd/0]                                           
            5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [kworker/0:0H]                                          
            7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 [migration/0]                                           
            8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [rcu_bh]                                                
            9 root      20   0       0      0      0 S  0.0  0.0   0:35.67 [rcu_sched]                                             
           10 root      rt   0       0      0      0 S  0.0  0.0   0:03.04 [watchdog/0]                                            
           12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [kdevtmpfs]                                             
           13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [netns]                                                 
           14 root      20   0       0      0      0 S  0.0  0.0   0:00.05 [khungtaskd]                                            
                                                          
      ==> 머신러닝 쿼리( PL/R )를 호출 할 때에도 일반 유저로 실행할 수 있으며,
          리소스 Group 에 셋팅된 값으로 시스템 리소스를 사용

      * Resource Group의 상태 확인        
      [gpadmin@mdw rgtest]$ alias rgs
      alias rgs='psql -c "SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment order by rsgname, hostname;"'    
      [gpadmin@mdw rgtest]$ rgs
          rsgname    | groupid | hostname | segment_id |  cpu  | memory_used
      ---------------+---------+----------+------------+-------+--------------
       admin_group   |    6438 | mdw      |         -1 |  0.82 |           6
       admin_group   |    6438 | sdw1     |          0 | 66.97 |           0
       admin_group   |    6438 | sdw1     |          1 | 65.07 |           0
       admin_group   |    6438 | sdw2     |          2 | 67.04 |           0
       admin_group   |    6438 | sdw2     |          3 | 67.03 |           0
       rgudba             |   32997 | sdw1     |          1 | 22.14 |          56
       rgudba             |   32997 | sdw1     |          0 | 23.70 |          56
       rgudba             |   32997 | sdw2     |          2 | 22.88 |          64
       rgudba             |   32997 | sdw2     |          3 | 22.88 |          64
      (25 rows)
     
[gpadmin@mdw rgtest]$                    

3. 리스스 그룹 설정을 위한 환경
   1) OS 버전
       - RHEL 7.x 또는 RHEL 6.X  (kernel version 2.6.32-696 or higher)
       - 참고 자료: https://gpdb.docs.pivotal.io/6-4/admin_guide/workload_mgmt_resgroups.html

   2) Resource Group 설정을 위한 OS 설정
    ###  OS 설정 및 cgroup 라이브러리 설치
    # mkdir -p /etc/cgconfig.d
    # vi /etc/cgconfig.d/gpdb.conf
    group gpdb {
         perm {
             task {
                 uid = gpadmin;
                 gid = gpadmin;
             }
             admin {
                 uid = gpadmin;
                 gid = gpadmin;
             }
         }
         cpu {
         }
         cpuacct {
         }
         memory {
         }
         cpuset {
         }
     }
   
    # yum install libcgroup-tools
    # cgconfigparser -l /etc/cgconfig.d/gpdb.conf
   
    ### 설정 확인
    # grep cgroup /proc/mounts
   
    ### 경로 확인
    tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
    cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
   
    ### 각 항목별 경로 확인 및 gpadmin:gpadmin 권한 확인
    # ls -la /sys/fs/cgroup/cpu/gpdb
    # ls -la /sys/fs/cgroup/cpuacct/gpdb
    # ls -la /sys/fs/cgroup/cpuset/gpdb
    # ls -la /sys/fs/cgroup/memory/gpdb
   
    ### 시스템 자동 설정 (서비스 등록)
    # systemctl enable cgconfig.service
    # chkconfig cgconfig on
 
   3) Resource 설정을 위한 DB 설정
   ### Resource Queue 모드에서 Resource Group으로 변경                                                                                                                                                                        
   $ gpconfig -s gp_resource_manager                                                                                                                                                                                                      
   Values on all segments are consistent                                                                                                                                    
   GUC: gp_resource_manager                        
   Master value: queue                              
   Segment value: queue                            
                                                   
   ## group으로 설정 변경                          
   $ gpconfig -c gp_resource_manager -v group      
   $ gpstop -af                                    
   $ gpstart -a                                    
                                                   
   $ gpconfig -s gp_resource_manager                
   Values on all segments are consistent            
   GUC : gp_resource_manager                        
   Master value: group                              
   Segment value: group                            
   $  
       
   ### Resource Group 생성                                      
   - CPU_RATE_LIMIT 및 MEMORY_LIMIT는 세그먼트 호스트의 총 합의 비율을 사용 함.
   - Memory_limit 의 합이 100% 를 넘을 수 없음.    

   ### RG 생성 구문                                                                                                                          
   CREATE RESOURCE GROUP name WITH (group_attribute=value [, ... ])                                            
   where group_attribute is:                                                                                    
      CPU_RATE_LIMIT=integer | CPUSET=tuple                                                                    
      MEMORY_LIMIT=integer                                                                                      
      [ CONCURRENCY=integer ]                                                                                  
      [ MEMORY_SHARED_QUOTA=integer ]                                                                          
      [ MEMORY_SPILL_RATIO=integer ]                                                                            
      [ MEMORY_AUDITOR= {vmtracker | cgroup} ]                                                                  
                                                                                                               
   ### RG 생성                                                                                                  
   CREATE RESOURCE GROUP rgoltp  WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgadhoc WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgbatch WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgroup_extcomp WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=0, CPUSET='1', MEMORY_LIMIT=10);
                                                                                                               
   ### RG 변경                                                                                                  
   --한번에 여러 개를 바꿀 수 없으며, 각각의 항목에 대해서 변경 가능                                            
   ALTER RESOURCE GROUP name SET group_attribute value                                                          
   where group_attribute is one of:                                                                            
      CONCURRENCY integer                                                                                      
      CPU_RATE_LIMIT integer                                                                                    
      CPUSET tuple                                                                                              
      MEMORY_LIMIT integer                                                                                      
      MEMORY_SHARED_QUOTA integer                                                                              
      MEMORY_SPILL_RATIO integer                                                                                
   ALTER RESOURCE GROUP rgoltp SET CONCURRENCY 7;                                                              
   ALTER RESOURCE GROUP rgadhoc SET MEMORY_LIMIT 25;                                                            
   ALTER RESOURCE GROUP rgbatch SET CPUSET '2,4';                                                              
                                                                                                               
   ### RG 삭제                                                                                                    
   DROP RESOURCE rgoltp exec;                                                                                  
                                                                                                               
   ### RG 할당                                                                                                  
   ALTER ROLE uoltp RESOURCE GROUP  rgoltp;                                                                    
   CREATE ROLE uoltp RESOURCE GROUP rgoltp;                                                                    
                                                                                                               
   ### RG Default 전환                                                                                          
   ALTER ROLE uoltp RESOURCE GROUP NONE;                                                                        
                                                                                                               
   ### RG 리소스 그룹 할당 확인                                                                                  
   SELECT rolname, rsgname FROM pg_roles, pg_resgroup                                                          
        WHERE pg_roles.rolresgroup=pg_resgroup.oid;  

   ### RG 설정 확인                                                                                              
   SELECT * FROM gp_toolkit.gp_resgroup_config;

   ## RQ 리소스 사용량 확인                            
   SELECT * FROM gp_toolkit.gp_resgroup_status;    
                                                 
   ##RG 롤 설정 확인                                
   SELECT rolname, rsgname FROM pg_roles, pg_resgroup
     WHERE pg_roles.rolresgroup=pg_resgroup.oid;



Greenplum Backup & Restore

Greenplum에서는 gpbackup과 gprestore를 이용해서 대량의 데이터를 병렬로 백업/병렬로 복구를 지원하고 있습니다. Full 백업이외에도 incremental 백업을 지원하고 있습니다.  - incremental 백업시에는 반드시 사전...