๋ฐ๋์ง, 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:\P rogram Files\J AVA\. ..
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 > ํ
์ด๋ธ ์์ฑ๋ ๊ฒ ํ์ธ
Metadata > Db Connections ์ฐํด๋ฆญ > Create Connection > MariaDB ์ ๋ณด๋ก ์
๋ ฅํ์ฌ ์์ฑ
Connection ์ฐํด๋ฆญ > Retrieve Schema
> Table, View, Synonym ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ
์ด๋ธ ์ปฌ๋ผ ์๋ ๋งคํ
๊ณ์ ์ฑํฌ๊ฐ ๋๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ํ
์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ณํํ ๋๋ง๋ค Retrieve ํด์ผ ํจ
Job Designs > Create Job
ํ๋ฉด์ tDBInput
์์ฑํ์ฌ ์๋์ฒ๋ผ ์ค์
tLogRow
์์ฑ
tDBInput
์ฐํด๋ฆญ > Row > Main > ์ฌ์ด๋ฅผ ์ฐ๊ฒฐ
์ ์ฅ ๋ฐ ์คํ : F6
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 >
tDBInput
์์ฑ > Component > member ํ
์ด๋ธ ์ธํ
tMap
์์ฑ > Row - Main์ผ๋ก ์ฐ๊ฒฐ
๋๋ธ ํด๋ฆญ > ์ฐ์ธก output ์์ฑํ์ฌ default ๊ฐ ์ ๊ฑฐ, auto map!
์คํ
tDBOutput
์์ฑ > Component > member_2 ํ
์ด๋ธ์ ์์ฑํ๊ธฐ๋ก ์ค์
๋ฐฉ๊ธ ์์ฑํ output์ row๋ก ์ฐ๊ฒฐ
tLogRow
๋ฅผ Row > Main ์ผ๋ก ์ฐ๊ฒฐ
Job ํญ > Extra > Multi Thread execution
์ ํ ์ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์๋ ๊ฐ๋ฅ
Trigger > On subjob OK
์ผ๋ก ์ฐ๊ฒฐํด ์ด์ฉํ ์๋ ์์
Job > Component > Job์ ์ด๋ฆ ์ง์ ๊ฐ๋ฅ
์ปดํฌ๋ํธ > Component > View > ์ด๋ฆ ์ง์ ๊ฐ๋ฅ
IQ-Designer ์ค์น๋ ๋๋ ํ ๋ฆฌ > custom-component > ํด๋น ์ปดํฌ๋ํธ ํด๋ > jar ํ์ผ ์ ํ
jar ํ์ผ์ด ์์ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํ์ฌ ๋์ผํ ๊ณผ์ ์ํ
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
๋ ํจ๊ป ์คํ๋๋ ๊ฒ ํ์ธ ๊ฐ๋ฅ
์๋์ ๊ฐ์ด 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
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`"
Oracle ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅ
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 =================== " );
tJavaFlex, tDBOutput์ ๊ฐ๊ฐ Map์ ์ฐ๊ฒฐํ์์
๋ํ๊ธฐ๋ฅผ ํ๊ฑฐ๋(row2.AGE + row2.SEQ
), ๋ฌธ์์ ๊ฒฐํฉ((2023 - row2.AGE) + "๋
"
)ํ ์ ์์
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋๋ฌธ์๋ก ๋ณํ(StringHandling.UPCASE(row2.CITY)
) ๊ฐ๋ฅ
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" ));
์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์์ฐฝ์์ ํ์ธ ๊ฐ๋ฅ
์กฐํ ๋ฐฉ์ ์ค์ ๊ฐ๋ฅ
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]
tPreJob์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉ
๋๋ธ ํด๋ฆญํ์ฌ, ์๋์ ๊ฐ์ด ์ ๋ณด ์ ์ฅ ๊ฐ๋ฅ
< ?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์ ์ ์ฅํ ์ ์์
Generate code
> row ๋ณ ๊ฐ ์ ์ด ๊ฐ๋ฅ
tLogRow
์ ์ฐ๊ฒฐํ์ฌ ๊ฐ ์ถ๋ ฅ ๊ฐ๋ฅ (input_row.FIRST_NAME.toLowerCase();
๋ก ์ธํด ์๋ฌธ์๋ก ์ถ๋ ฅ๋ ๊ฒ ํ์ธ)
์ค์ DB ๊ฐ์ ์๊ด์์ด ๊ธฐ์กด ๋ฐ์ดํฐ๋ก INSERT ๋จ