[InnoQuartz] 이노쿼츠 설치 / IQ-Designer 및 IQ-Server 사용법

EUN JY·2022년 9월 6일
1

Database

목록 보기
19/21

IQ-Designer

설치

  • 반디집, mariaDB, JDK 1.8 version 설치 필요
  • 형상 관리를 위해 Git 설치
  • InnoQuartzDesigner-DI-type-P-V7.2.1.20201221.zip 압축 해제 후 TOS_DI-win-x86_64.exe 실행

세팅

  • TOS_DI-win-x86_64.ini 파일에서 Java 버전 변경 가능
vm
C:\Program Files\JAVA\...

구성

  • IQ-Designer (압축 해제 후 바로 사용 가능)
    • T* : talend 컴포넌트
    • Q* : 이노쿼츠 컴포넌트
  • IQ-Server
  • resource 폴더

시작

  • TOS_DI-win-x86_64.exe 실행 > 'Local Project' 생성 후 Finish
  • Job Designs > Import Item > EduJobs_v3.01.zip > 전체 선택 후 Finish

실습

  • qe103_DB_SETUP > Local DB Connection > Component 확인 > DB 정보 확인 가능
  • Run
  • qe201_CREATE_MEMBER > Run
  • DBeaver > 테이블 생성된 것 확인

DB Connection 생성

  • Metadata > Db Connections 우클릭 > Create Connection > MariaDB 정보로 입력하여 생성
  • Connection 우클릭 > Retrieve Schema > Table, View, Synonym 정보를 가져와 테이블 컬럼 자동 매핑
    • 계속 싱크가 되는 것은 아니기 때문에 테이블 구조가 변화할 때마다 Retrieve 해야 함

JOB 생성

  • Job Designs > Create Job
  • 화면에 tDBInput 생성하여 아래처럼 설정
  • tLogRow 생성
  • tDBInput 우클릭 > Row > Main > 사이를 연결
  • 저장 및 실행 : F6

Job 삭제

  • Job 삭제 시, 휴지통으로 이동되기 때문에 완전 삭제 전까지 동일한 이름의 Job 생성 불가
  • 삭제한 Job은 휴지통으로 이동됨
  • 휴지통 수동 비우기 > ~\IQD_DI-V7.3.1.20220308\workspace\LOCAL_PROJECT > recycle_bin.index > 아래와 같이 파일 정보 삭제
    • 실제 파일이 들어있던 \process 폴더에서 파일 삭제까지 해주어야 함
<?xml version="1.0" encoding="UTF-8"?>
<recyclebin:RecycleBin xmlns:recyclebin="http://www.talend.org/recyclebin" lastUpdate="2022-09-21T10:26:18.436+0900">
</recyclebin:RecycleBin>

tDBOutput 사용

  • tDBInput 생성 > Component > member 테이블 세팅
  • tMap 생성 > Row - Main으로 연결
  • 더블 클릭 > 우측 output 생성하여 default 값 제거, auto map! 실행
  • tDBOutput 생성 > Component > member_2 테이블을 생성하기로 설정
  • 방금 생성한 output을 row로 연결
  • tLogRow를 Row > Main 으로 연결

Multi Thread

  • Job 탭 > Extra > Multi Thread execution 선택 시 멀티 스레드 방식으로 작동 가능
  • Trigger > On subjob OK으로 연결해 이용할 수도 있음

이름 지정

  • Job > Component > Job의 이름 지정 가능
  • 컴포넌트 > Component > View > 이름 지정 가능

컴포넌트 패치

  • IQ-Designer 설치된 디렉토리 > custom-component > 해당 컴포넌트 폴더 > jar 파일 선택
  • jar 파일이 없을 경우 다운로드하여 동일한 과정 수행

IQ-Server

시작

  • iqs-startup.bat 파일 수정 (innoquartz-server-4.2.3.24.RELEASE.war과 버전이 맞는지 확인)
  • C:\Users\YNJCH\InnoQuartz\Education\IQ-Server에서 iqs-startup.bat 실행
  • http://localhost:9090/ 접속
    • admin / admin 으로 로그인하였음

프로젝트 생성

# source DB 정보
src_db_host=localhost
src_db_user=root
src_db_password=innoquartz
  • Job > List > 생성한 프로젝트 선택 > 목록 화면 확인
  • Create > Job 이름 입력 후 저장 > 재진입하여 Deploy Path 확인
    • /projects/1/jobs/1/upload-job-archive

연결

  • 공통으로 쓰는 접속 정보 관리
  • Window > Preperences > InnoQuartz > Project setting 에서 설정 가능
iq_host_Default=http://localhost
iq_port_Default=9090
iq_access_id_Default=admin
iq_access_passwd_Default=admin
iq_exclude_jar_Default=
iq_global_jar_Default=

배포

  • Job > Contexts > + 버튼으로 추가
    • Name : iq_job_path
    • Default - Value : /projects/1/jobs/1/upload-job-archive (Deploy Path)
  • 좌측 Job 우클릭 > Build Job > 아래와 같이 설정 후 Finish 하여 DEPLOY OK 상태 확인
    • To archive file : 빌드하여 zip 파일로 만들 위치 선택
    • Context Scripts 체크, 빌드 환경 선택 (예 : LOCAL, DEV)
    • Apply context to children : RunJob을 사용하고 있다면 반드시 체크해야 선택한 Context 환경이 전달됨
    • Items 체크(ETL Job 구조로 반드시 체크해야 함 > 빌드한 zip 파일을 import해서 사용할 때 Designer에서 열리지 않기 때문)
    • Java Sources 체크 해제, 불필요한 소스까지 빌드되는 것 방지
    • Deploy > Auto Deploy 사용하려면 YES 선택

배포 (IQ-SERVER Job 연결)

  • http://localhost:9090/ 접속 > Job > List > 새로운 Job 생성하여 Deploy Path 복사
  • Job > Contexts > iq_job_path
    • 우측 + 버튼 선택 > 'LOCAL' 이름으로 저장 > 생겨난 LOCAL 확인
    • LOCAL - Value : /projects/1/jobs/2/upload-job-archive (Deploy Path)
  • 좌측 Job 우클릭 > Build Job > Context scripts > LOCAL로 설정하여 Finish > DEPLOY OK 상태 확인

연결

  • http://localhost:9090/ 접속
  • 생성한 sample_job, sample_job2 에서 sample_job 클릭
  • Post Job 탭 > Execute another Job > When Job execution success > sample_job2 선택
  • 저장 후 sample_job 실행하면 sample_job2도 함께 실행되는 것 확인 가능

Prejob, Postjob

  • 아래와 같이 tPrejob, tPostjob, tJava 구성
  • qPre > Component
    • Print Project Properties 선택 (로그 출력 시 properties 값 출력되도록 설정)
    • CONTEXT > LOCAL 추가된 것 확인
  • qPre > Contexts(런타임 환경 정보 변수)
    • 런타임 변수 : Job 시작부터 종료까지 사용하는 static 변수
    • 환경 정보 : 로컬, 개발, 운영 등 ETL 서버 환경마다 정의되는 공통 변수
    • 변수 : Job 하드코딩 또는 Server의 project properties의 값, Global 변수 등
    • 런타임 기본 환경 설정 가능, Context 환경 추가 가능
  • qPre > Context > LOCAL Value / Component > CONTEXT값 LOCAL / Project Setting의 iq_host_LOCAL 등의 정보가 모두 일치해야 함
  • Context 탭의 + 버튼을 이용해 추가 가능하며 하단 셀렉트 박스에서 Default context environment 선택 가능

서버 로그

  • tDBInput > Component > Host, Username을 아래와 같이 설정
    • IQ-Server의 Project properties 설정한 값 이름으로 설정함
QProp.getPropMap("src_db_host")
QProp.getPropMap("src_db_user")
  • tJava > 로그 출력을 위해 다음과 같이 작성
System.out.println( "select count > " + ((Integer)globalMap.get("tDBInput_1_NB_LINE")) );
System.out.println( "job end..." );
  • Run > 아래와 같이 로그 뜨는 것 확인
sample_job
LOG               2022.09.06 15:33:33 src_db_host=localhost
LOG               2022.09.06 15:33:33 src_db_user=root
LOG               2022.09.06 15:33:33 src_db_password=innoquartz
LOG               2022.09.06 15:33:34 BIZ START DATE : 2022-09-06 15:12:18
(생략)
100|Ulysses|Arthur|F|13|Pierre|ONLINE|2022-09-06 11:17:47.0|2022-09-06 11:17:47.0
select count > 100
job end...
LOG               2022.09.06 15:12:18 BIZ END DATE : 2022-09-06 15:12:18

IQ-Designer 실습

Job 구성

  • MySQL localhost의 member 테이블을 Oracle localhost의 MEMBER_MYSQL로 CREATE 및 데이터 INSERT 하도록 함

tDBInput

  • MySQL 정보는 다음과 같이 입력
  • 날짜 패턴 관련 오류 발생 시, Edit Schema > "yyyy-MM-dd hh:mm:ss" 로 설정
  • Guess Query 버튼 클릭하여 아래 쿼리 확인
"SELECT 
  `member`.`SEQ`, 
  `member`.`FIRST_NAME`, 
  `member`.`LAST_NAME`, 
  `member`.`GENDER`, 
  `member`.`AGE`, 
  `member`.`CITY`, 
  `member`.`JOIN_TYPE`, 
  `member`.`CREATE_DT`, 
  `member`.`MODIFY_DT`
FROM `member`"

tDBOutput

  • Oracle 정보는 다음과 같이 입력

tJavaFlex

  • Start code, End code의 내용을 수행하며 중간의 Main code 내용을 반복하여 수행
  • 여성 회원(genderType[1])의 수를 구하기 위한 코드 작성
// start part of your Java code
System.out.println("tJavaFlex start =================== ");
String[] genderType = {"M", "F"};
String memberStr = "";

// here is the main part of the component,
// a piece of code executed in the row
// loop
if (genderType[1].equals(outForJavaFlex.GENDER)) {
	memberStr += outForJavaFlex.FIRST_NAME + ",";
}

// end of the component, outside/closing the loop
String[] memberArr = memberStr.split(",");
System.out.println("memberArr.length is... " + memberArr.length);
System.out.println("tJavaFlex end =================== ");

tMap

  • tJavaFlex, tDBOutput에 각각 Map을 연결하였음
  • 더하기를 하거나(row2.AGE + row2.SEQ), 문자와 결합((2023 - row2.AGE) + "년" )할 수 있음
  • 함수를 이용하여 대문자로 변환(StringHandling.UPCASE(row2.CITY)) 가능

tJava

  • tDBOutput과 연결하여 콘솔창에서 수행 결과를 조회
System.out.println("tDBOutput tPrejob_1_SUBPROCESS_STATE >>> " + globalMap.get("tPrejob_1_SUBPROCESS_STATE"));
System.out.println("tDBOutput tDBInput_2_NB_LINE >>> " + globalMap.get("tDBInput_2_NB_LINE"));
System.out.println("tDBOutput tDBOutput_2_NB_LINE_UPDATED >>> " + globalMap.get("tDBOutput_2_NB_LINE_UPDATED"));
System.out.println("tDBOutput tDBInput_2_SUBPROCESS_STATE >>> " + globalMap.get("tDBInput_2_SUBPROCESS_STATE"));
System.out.println("tDBOutput tDBOutput_2_NB_LINE_DELETED >>> " + globalMap.get("tDBOutput_2_NB_LINE_DELETED"));
System.out.println("tDBOutput tDBOutput_2_NB_LINE >>> " + globalMap.get("tDBOutput_2_NB_LINE"));
System.out.println("tDBOutput tJava_2_SUBPROCESS_STATE >>> " + globalMap.get("tJava_2_SUBPROCESS_STATE"));
System.out.println("tDBOutput tDBOutput_2_NB_LINE_REJECTED >>> " + globalMap.get("tDBOutput_2_NB_LINE_REJECTED"));
System.out.println("tDBOutput tDBOutput_2_NB_LINE_INSERTED >>> " + globalMap.get("tDBOutput_2_NB_LINE_INSERTED"));

tLogRow

  • 수행 결과를 콘솔창에서 확인 가능
  • 조회 방식 설정 가능

tPrejob, tPostjob

  • tPostjob에 tJava 연결, 콘솔창에서 수행 결과를 조회
System.out.println("tPostjob >>> " + projectName + " - " + jobName + " <<<");
System.out.println("tPostjob >>> " + globalMap.get("concurrentHashMap").toString());
System.out.println("tPostjob >>> " + globalMap.get("tPrejob_1_SUBPROCESS_STATE"));
System.out.println("tPostjob >>> " + globalMap.get("Java_1_SUBPROCESS_STATE"));
  • tLogCatcher에 Catch Java Exception, Catch tWarn, Catch tWarn 체크
  • tLogCatcher에 tDBOutput 연결, 에러 로그를 MEMBER_MYSQL_LOG 테이블에 남기도록 설정
  • tDBOutput으로 내려온 데이터는 tLogRow를 통해 콘솔창에 보여짐

수행 결과

Starting job MYSQLtoORACLE at 15:05 15/09/2022.
[statistics] connecting to socket on port 3999
[statistics] connected
tJavaFlex start =================== 
tDBOutput tPrejob_1_SUBPROCESS_STATE >>> 1
tDBOutput tDBInput_2_NB_LINE >>> 100
tDBOutput tDBOutput_2_NB_LINE_UPDATED >>> 0
tDBOutput tDBInput_2_SUBPROCESS_STATE >>> 0
tDBOutput tDBOutput_2_NB_LINE_DELETED >>> 0
tDBOutput tDBOutput_2_NB_LINE >>> 100
tDBOutput tJava_2_SUBPROCESS_STATE >>> 0
tDBOutput tDBOutput_2_NB_LINE_REJECTED >>> 0
tDBOutput tDBOutput_2_NB_LINE_INSERTED >>> 100
.----------+----------+----------+------+---+-----------+----------+--------------+--------------+---------+----------+----------.
|                                                           tLogRow_1                                                            |
|=---------+----------+----------+------+---+-----------+----------+--------------+--------------+---------+----------+---------=|
|SEQ_NUMBER|FIRST_NAME|LAST_NAME |GENDER|AGE|AGE_SEQ_SUM|BIRTH_YEAR|CITY_UPPER    |CITY          |JOIN_TYPE|CREATE_DT |MODIFY_DT |
|=---------+----------+----------+------+---+-----------+----------+--------------+--------------+---------+----------+---------=|
|1         |Millard   |Buchanan  |F     |13 |14         |2010|TRENTON       |Trenton       |ONLINE   |06-09-2022|06-09-2022|
|2         |Abraham   |Johnson   |M     |46 |48         |1977|HELENA        |Helena        |ONLINE   |06-09-2022|06-09-2022|
(생략)
|99        |Thomas    |McKinley  |M     |64 |163        |1959|BOISE         |Boise         |ONLINE   |06-09-2022|06-09-2022|
|100       |Ulysses   |Arthur    |F     |13 |113        |2010|PIERRE        |Pierre        |ONLINE   |06-09-2022|06-09-2022|
'----------+----------+----------+------+---+-----------+----------+--------------+--------------+---------+----------+----------'

memberArr.length is... 51
tJavaFlex end =================== 
tPostjob >>> LOCAL_PROJECT - MYSQLtoORACLE <<<
tPostjob >>> {}
tPostjob >>> 1
tPostjob >>> null
.------+---+--------+----------+-------+---+-------+--------+----+------+-------+----.
|                                     tLogRow_2                                      |
|=-----+---+--------+----------+-------+---+-------+--------+----+------+-------+---=|
|moment|pid|root_pid|father_pid|project|job|context|priority|type|origin|message|code|
|=-----+---+--------+----------+-------+---+-------+--------+----+------+-------+---=|
'------+---+--------+----------+-------+---+-------+--------+----+------+-------+----'

[statistics] disconnected

Job MYSQLtoORACLE ended at 15:05 15/09/2022. [exit code  = 0]

IQ-Designer 컴포넌트

tDBConnection

  • tPreJob에 연결하여 사용

tRowGenerator

  • 더블 클릭하여, 아래와 같이 정보 저장 가능
<?xml version="1.0" encoding="UTF-8"?>
<schema>
	<column comment="" default="" function="TalendDataGenerator.getFirstName()" key="false" label="FIRST_NAME" length="-1" nullable="true" 
		originalDbColumnName="FIRST_NAME" originalLength="-1" parameter="" pattern="" precision="-1" preview="" talendType="id_String" type=""/>
	<column comment="" default="" function="TalendDataGenerator.getLastName()" key="false" label="LAST_NAME" length="-1" nullable="true" 
		originalDbColumnName="LAST_NAME" originalLength="-1" parameter="" pattern="" precision="-1" preview="" talendType="id_String" type=""/>
</schema>
  • tMap과 연결, tDBOutput을 연결하여 DB에 저장할 수 있음

tJavaRow

  • Generate code > row 별 값 제어 가능
  • tLogRow와 연결하여 값 출력 가능 (input_row.FIRST_NAME.toLowerCase();로 인해 소문자로 출력된 것 확인)
  • 실제 DB 값은 상관없이 기존 데이터로 INSERT 됨
profile
개린이

0개의 댓글