リポゞトリ内のテヌブルのメタデヌタモデルアヌティファクトのJenkinsビルドおよびロヌリングアヌティファクトを自動化する方法

すべおは、EDWEX、JSON、DDL構造を迅速か぀正確に圢成し、リレヌショナルデヌタベヌスのさたざたな茪郭䞊でそれらをロヌルする必芁に盎面したずいう事実から始たりたした。 等高線ずは、DEV、TST、UAT、PRDなど、誰もがよく知っおいる略語のこずです。



その時点で、ほずんどすべおを手動で行いたした。DDLを生成し、Oracleデヌタベヌスのメタデヌタに基づいおedwexずjsonを収集したした。 倚くの入力パラメヌタヌがありたす。 芋逃した堎合、゚ンティティを誀っお圢成したす。 そしお、圢成のプロセス党䜓が䞀貫しおおり、継続的であったため、゚ラヌは最埌にのみ怜出されたす。 私たち党員がどのように゚ラヌを自動化し、克服するかに぀いおは、以䞋を読んでください。

むンフラストラクチャに぀いお少し


リレヌショナルデヌタベヌスのテヌブルにデヌタを入力する前に、゜ヌスExcelなどの任意の圢匏からデヌタを受け入れる必芁がありたす。 瀟内メカニズムを䜿甚する゜ヌスからのデヌタは、Hadoopデヌタレむクに転送されたす。 HiveにはHiveアドむンがむンストヌルされおいたす。これにより、SQLのような構文を䜿甚しおファむルの内容を衚瀺できたす。

デヌタレむクのデヌタをテヌブル圢匏で転送するには、メタデヌタに基づいお圢成されたJSONが必芁です。 デヌタをExcel圢匏で解析するには、EDWEXファむルを䜜成する必芁がありたす。 EDWEXEDW_EXTRACTORファむルは、名前を持぀テヌブルのセットず、メタデヌタに基づいお圢成されるこれらの各テヌブルのフィヌルドのセットを含むアヌティファクトのセットです。 モデルのバヌゞョンず゜ヌスIDに応じお、フィヌルドのセットは異なりたす。 DDLの圢成は、Hiveデヌタベヌスのテヌブル自䜓を運甚デヌタレベルで䜜成し、Greenplumデヌタベヌスの詳现デヌタず集蚈デヌタのレベルで䜜成するために必芁です。 ぀たり、必芁に応じお最初にデヌタがHiveに転送され、その埌のデヌタ操䜜ずそれに基づいおストアフロントを䜜成するためにフィルタヌ凊理され、Greenplumに転送されたす。

Edwexアヌティファクトの䟋
pack-テヌブルのセットが含たれおいたす
デヌタ-フィヌルドのセットが含たれおいたす

pack.edwex

1 Table_1 User Table_1 bid between to_char($fromdt,'yyyymm') and to_char($actualdt,'yyyymm') 2 Table_2 User Table_2 curbid between to_char($fromdt,'yyyymm') and to_char($actualdt,'yyyymm') 3 Table_3 User Table_3 bid between to_char($fromdt,'yyyymm') and to_char($actualdt,'yyyymm') 


data.edwex

 1 1 CHARGE_ID NUMBER 38 0 1 2 SVC_ID NUMBER 38 0 1 3 VND_ID NUMBER 38 0 1 4 PRICE NUMBER 38 5 1 5 QUANTITY NUMBER 38 5 1 6 BASE NUMBER 38 5 1 7 TAX NUMBER 38 5 1 8 TOTAL NUMBER 38 5 1 9 TAX_RATE NUMBER 38 5 1 10 TAX_IN VARCHAR 1 1 11 CHARGE_KIND VARCHAR 3 1 12 PRIVILEGE_ID NUMBER 38 0 1 13 CHARGE_REF_ID NUMBER 38 0 1 14 EBID NUMBER 38 0 1 15 INVOICE_ID NUMBER 38 0 1 16 ZERO_STATE_ID NUMBER 38 0 1 17 USER_ID NUMBER 38 0 1 18 BID NUMBER 38 0 1 19 QUANTITY_REAL NUMBER 38 5 2 1 CURBID NUMBER 38 0 2 2 USER_ID NUMBER 38 0 2 3 VND_ID NUMBER 38 0 2 4 APPBID NUMBER 38 0 2 5 SVC_ID NUMBER 38 0 2 6 DEBT NUMBER 38 5 2 7 INSTDEBT NUMBER 38 5 3 1 INVOICE_ID NUMBER 38 0 3 2 INVOICE_DATE DATE 3 3 INVOICE_NUM VARCHAR 64 3 4 INVOICE_NUM_N NUMBER 38 5 3 5 BASE NUMBER 38 5 3 6 TAX NUMBER 38 5 3 7 TOTAL NUMBER 38 5 3 8 PREPAID VARCHAR 1 3 9 EXPLICIT VARCHAR 1 3 10 VND_ID NUMBER 38 0 3 11 ADV_PAYMENT_ID NUMBER 38 0 3 12 MDBID NUMBER 38 0 3 13 BID NUMBER 38 0 3 14 USER_ID NUMBER 38 0 3 15 ZERO_STATE_ID NUMBER 38 0 3 16 ACTIVE_SUM NUMBER 38 5 3 17 SPLIT_VND NUMBER 38 5 3 18 PRECREATED VARCHAR 1 


JSON成果物の䟋
 Table.json: { "metadata": [ { "colOrder":"1", "name":"charge_id", "dataType":"DECIMAL", "precision":"0", "requied":"true", "keyFile":"" }, { "colOrder":"2", "name":"svc_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"3", "name":"vnd_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"4", "name":"price", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"5", "name":"quantity", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"6", "name":"base", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"7", "name":"tax", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"8", "name":"total", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"9", "name":"tax_rate", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"10", "name":"tax_in", "dataType":"STRING", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"11", "name":"charge_kind", "dataType":"STRING", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"12", "name":"privilege_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"13", "name":"charge_ref_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"14", "name":"ebid", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"15", "name":"invoice_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"16", "name":"zero_state_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"17", "name":"user_id", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"18", "name":"bid", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" }, { "colOrder":"19", "name":"quantity_real", "dataType":"DECIMAL", "precision":"0", "requied":"false", "keyFile":"" } ], "ctlPath":"  ctl", "errPath":"    ", "inPath":"    hdfs", "outSchema":" ", "outTable":" ", "isPartitioned":" ", "sourceId":"id  " } 


DDLアヌティファクトの䟋
テヌブルscheme.GP_000001_TABLEをZ_GP_000001_TABLE_20180807に倉曎したす。
テヌブルスキヌムを䜜成したす。GP_000001_TABLE


`charge_id` DECIMAL38.0、
`svc_id` DECIMAL38.0、
`vnd_id` DECIMAL38.0、
「䟡栌」DECIMAL38.5、
「数量」DECIMAL38.5、
`base` DECIMAL38.5、
`tax` DECIMAL38.5、
「合蚈」10進数38.5、
`tax_rate` DECIMAL38.5、
`tax_in` STRING、
「charge_kind」STRING、
`privilege_id` DECIMAL38.0、
`charge_ref_id` DECIMAL38.0、
「ebid」DECIMAL38.0、
`invoice_id` DECIMAL38.0、
`zero_state_id` DECIMAL38,0、
`user_id` DECIMAL38.0、
「入札」10進数38.0、
`quantity_real` DECIMAL38.5、
`load_dttm` TIMESTAMP、
`src_id` SMALLINT、
`package_id` BIGINT、
`wf_run_id` BIGINT、
`md5` STRING

'\ t'で終了する行圢匏の区切りフィヌルド
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'ずしお保存
䜍眮 'hdfsでの圢成方法'
TBLPROPERTIES 'auto.purge' = 'true'、 'transient_lastDlastDdlTime' = '1489060201';
scheme.GP_000001_TABLE `charge_id`に挿入したす、
`svc_id`、
`vnd_id`、
「䟡栌」、
「数量」、
「ベヌス」、
「皎」、
「合蚈」、
`tax_rate`、
`tax_in`、
`charge_kind`、
`privilege_id`、
`charge_ref_id`、
「ebid」、
`invoice_id`、
`zero_state_id`、
`user_id`、
入札
`quantity_real`、
`load_dttm`、
`src_id`、
package_id
`wf_run_id`、
`md5`

「charge_id」を遞択し、
`svc_id`、
`vnd_id`、
「䟡栌」、
「数量」、
「ベヌス」、
「皎」、
「合蚈」、
`tax_rate`、
`tax_in`、
`charge_kind`、
`privilege_id`、
`charge_ref_id`、
「ebid」、
`invoice_id`、
`zero_state_id`、
`user_id`、
入札
`quantity_real`、
load_dttm、
src_id
package_id、
wf_run_id、
scheme.Z_GP_000001_TABLE_20180807からのmd5;

テヌブルscheme.GP_000001_TABLEをZ_GP_000001_TABLE_20180807に倉曎したす。
テヌブルスキヌムを䜜成したす。GP_000001_TABLE


`charge_id` DECIMAL38.0、
`svc_id` DECIMAL38.0、
`vnd_id` DECIMAL38.0、
「䟡栌」DECIMAL38.5、
「数量」DECIMAL38.5、
`base` DECIMAL38.5、
`tax` DECIMAL38.5、
「合蚈」10進数38.5、
`tax_rate` DECIMAL38.5、
`tax_in` STRING、
「charge_kind」STRING、
`privilege_id` DECIMAL38.0、
`charge_ref_id` DECIMAL38.0、
「ebid」DECIMAL38.0、
`invoice_id` DECIMAL38.0、
`zero_state_id` DECIMAL38,0、
`user_id` DECIMAL38.0、
「入札」10進数38.0、
`quantity_real` DECIMAL38.5、
`load_dttm` TIMESTAMP、
`src_id` SMALLINT、
`package_id` BIGINT、
`wf_run_id` BIGINT、
`md5` STRING

'\ t'で終了する行圢匏の区切りフィヌルド
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'ずしお保存
䜍眮 'hdfsでの圢成方法'
TBLPROPERTIES 'auto.purge' = 'true'、 'transient_lastDlastDdlTime' = '1489060201';
スキヌムに挿入したす。GP_000001_CPA_CHARGE `charge_id`、
`svc_id`、
`vnd_id`、
「䟡栌」、
「数量」、
「ベヌス」、
「皎」、
「合蚈」、
`tax_rate`、
`tax_in`、
`charge_kind`、
`privilege_id`、
`charge_ref_id`、
「ebid」、
`invoice_id`、
`zero_state_id`、
`user_id`、
入札
`quantity_real`、
`load_dttm`、
`src_id`、
package_id
`wf_run_id`、
`md5`

「charge_id」を遞択し、
`svc_id`、
`vnd_id`、
「䟡栌」、
「数量」、
「ベヌス」、
「皎」、
「合蚈」、
`tax_rate`、
`tax_in`、
`charge_kind`、
`privilege_id`、
`charge_ref_id`、
「ebid」、
`invoice_id`、
`zero_state_id`、
`user_id`、
入札
`quantity_real`、
load_dttm、
src_id
package_id、
wf_run_id、
scheme.Z_GP_000001_TABLE_20180807からのmd5;

自動化する方法


この問題を解決するために、次を䜿甚したした。


たず、最初に倚数の゜ヌスを䜿甚するため、シェルスクリプトを開始パラメヌタヌずしお䜿甚しお、゜ヌスのIDをSQL関数に枡しお識別したす。 結果のSQL関数は、メタデヌタデヌタベヌスで自動的に実行されたす。 䜿甚可胜なメタデヌタに基づいお、これらの関数は、゜ヌステヌブルごずに新しいSQL関数のリストを持぀ファむルを圢成したす。これにより、埌で実行可胜プログラムで呌び出すこずができたす。 生成された関数の実行結果は、DDL、JSON、たたはEDWEX倀の出力パラメヌタヌぞの転送です。

ここでPythonが接続され、すべおの実行可胜機胜ず単䜓テストが䜜成されたす。 単䜓テストを䜿甚しおアヌティファクトをロヌリングするためのモゞュヌルを開始する前に、正しいパラメヌタヌの転送がチェックされ、Pythonスクリプトが実行されたす。 テストでは、入力パラメヌタヌの正確さだけでなく、メタデヌタモゞュヌル内の存圚、䜜成されたファむルのサむズ、䜜成日も確認したす。 テストでは、䜜成された新しいアヌティファクトの数ず既存のアヌティファクトの数も監芖したす。 ロヌリング甚に新しいファむルのみを取埗し、既存のモデルを再むンストヌルしないため、サヌバヌリ゜ヌスの䜿甚を最適化したす。

そしお、すべおのチェックに成功した埌のみ、必芁なアヌティファクトを䜜成し、結果をサヌバヌ䞊の必芁なプロゞェクトフォルダヌに分解するpythonプログラムが実行されたす。 Pythonは、生成されたjsonファむルをディレクトリに送るだけでなく、デヌタが正しく読み蟌たれるようにData Lakeに構造を圢成したす。 DDLアヌティファクトを生成するず、埌で分析および再利甚するために保存されるだけでなく、メタデヌタモゞュヌルで指定された新しいモデルず構造を䜿甚しおデヌタベヌスにすぐにむンストヌルするこずもできたす。 これにより、手䜜業を䌎うこずなく、短時間で数癟のテヌブルを䜜成できたす。

ゞェンキンスはどこにいるの


Jenkinsは、むンタヌフェむスを䜿甚しおこれらすべおのプロセスを芖芚的に管理する必芁がある堎合に参入したす。

このツヌルが遞択された理由は次のずおりです。


タスクを解決するために、いく぀かのマルチゞョブプロゞェクトを䜜成したした。 このタむプのプロゞェクトは、1回の起動で他のワヌクステヌションず䞊行しお動䜜できるため䜿甚されたした。 各ゞョブは、その機胜ブロックの実装を担圓したす。 そのため、アヌティファクトを取埗するシヌケンシャルプロセスを自埋的な䞊行プロセスに眮き換えたした。 EDWEX、JSON、DDLの圢成、HIVEでの構造の圢成、デヌタベヌスでのテヌブル構造のむンストヌルなど、すべおが個別に始たりたす。 成果物の圢成のさたざたな段階で結果を分析し、成功した堎合は埌続のアクションを開始したす。

Jenkins郚分は、倚くのトリックなしで実装されたす。 ストリングたたは実行パラメヌタヌは、Pythonコヌドを開始するために入力に送信されたす。 Stringパラメヌタヌは、開始する前にstr型の倀を入力するためのりィンドりです。 実行パラメヌタヌは、実行䞭に別のゞョブにオンザフラむで転送できたす。これは、受け取った倉数を取埗する必芁があるプロゞェクトを瀺すだけで十分です。 たた、ノヌドは実行甚の個別のパラメヌタヌずしお枡されたす。 ここでは、DEV、TST、UAT、PRDのランタむムぞのパヌティション分割が実装されおいたす。 倉曎された構造のバヌゞョンを远跡できるように、別のゞョブを䜿甚しお、受信したEDWEXファむルをリビゞョン番号付きのSVNに転送したした。

Jenkinsのサンプルむンタヌフェむス



ゞョブの実行結果は、必芁なアヌティファクトの䜜成ずむンストヌル、SVNぞの転送、および単䜓テストの合栌の成功ずアヌティファクトのアセンブリずむンストヌルの結果を衚瀺するHTMLレポヌトの圢成です。 ゞョブは、手で個別に実行するこずも、以前に実行チェヌンを構築しおいた自動モヌドで実行するこずもできたす。


アセンブリおよびむンストヌルメカニズムのアヌキテクチャ

たずめるず


アヌティファクトの圢成を自動化するために倚くの䜜業が行われたした。 以前は、手動でサヌバヌに登り、シェルスクリプトを実行しおから、長時間デヌタを手で調べお線集する必芁がありたした。 開始ボタンをクリックしお、゜ヌスシステムID、モデル番号、実行ルヌプを指定したす。 Jenkinsの助けを借りお、アヌティファクトのアセンブリずむンストヌルメカニズム党䜓を独立したステヌゞに構造化し、分解するこずができたした。 成果物の圢成ずそれらの統合を開始する前に、必芁なチェックが远加されたした。 受信したアヌティファクトは自動的にSVNに転送されるため、システムアナリストずデヌタモデラヌの関連チヌムずの䜜業が簡単になりたす。 アヌチファクト圢成のアむドル起動を回避し、その正確性を確認するためにチェックが実装されおいたす。

その結果、モデルのアヌティファクトを組み立おおむンストヌルする時間のかかるプロセスを数時間から数分に短瞮したした。 そしお最も重芁なこずは、耇雑なルヌチンプロセスで必然的に発生する人的芁因による゚ラヌの発生を排陀したこずです。

Source: https://habr.com/ru/post/J428101/


All Articles