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/ 접속
프로젝트 생성
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..." );
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 하도록 함
- 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]
)의 수를 구하기 위한 코드 작성
System.out.println("tJavaFlex start =================== ");
String[] genderType = {"M", "F"};
String memberStr = "";
if (genderType[1].equals(outForJavaFlex.GENDER)) {
memberStr += outForJavaFlex.FIRST_NAME + ",";
}
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 됨