Upload
hidenori-fujioka
View
605
Download
6
Embed Size (px)
Citation preview
2016年11月
日本アイ・ビー・エム株式会社藤岡英典
Spark on z/OSとAsakusa Frameworkによる基幹バッチアプリケーション開発
2
免責事項この資料の掲載内容は作成者自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
3
IBM z Systems
本資料では、Spark on z/OSを活用して基幹バッチを開発・実行するソリューションの実際についてご紹介しています
(オープンソースAsakusa Framework*と組み合わせたソリューション)
Asakusa Framework
* ノーチラス・テクノロジーズ社の登録商標http://www.asakusafw.com/
Asakusa Frameworkとは
4
Asakusa Frameworkは、基幹向けの分散バッチアプリケーションを開発するためのフレームワークです。
現在のところ、Asakusa Frameworkはバッチ処理基盤にHadoop/Sparkを採用しています。Asakusa Frameworkでは、基幹向けのバッチアプリケーションの作成に主眼を置いた、独自のドメイン特化言語 (Domain Specific Language : DSL) である「Asakusa DSL」を利用してアプリケーションを作成します。Asakusa DSLはJavaプログラミング言語をベースに作成されており、Hadoopや分散処理特有のプログラムをほとんど記述することなく、 シンプルなJavaのプログラムの組み合せで複雑なHadoop/Spark上のアプリケーションを作成することができます。
基幹バッチシステムに必要な開発環境・実行環境・運用環境を実装しているため、Asakusa Frameworkを使えば、複雑な業務処理もHadoop/Sparkを意識せずに開発可能です。
Asakusa Framework 参考資料
ドキュメント– http://docs.asakusafw.com/
チュートリアル– http://docs.asakusafw.com/basic-tutorial/
– こちらのシナリオをベースに、Spark on z/OSでの動作検証を行っています
技術情報: バッチ設計と実装ガイド– http://www.asakusafw.com/techinfo/methodology.html
技術情報: 参考資料– http://www.asakusafw.com/techinfo/reference.html
5
基幹バッチをSpark on z/OS上で実行する目的
6
スキルセキュリティ
処理の外出しを検討したが、基幹データなので外部システムにエクスポートしたくない。
これからはJavaのような、主流なスキルセットを持つ人財にも適した仕組みが必要。
コスト
CPU消費を抑えることで、月額のコストを削減できないか。
これらのビジネス課題を解決することを目指す
IBM z/OS Platform for Apache Spark
USS上で稼働するApache Spark– 2016/3/25出荷開始。– Apache Spark単体(コミュニティ版)と、後述するMDSSとのセットになった製品版がある。
製品版には各種データソースへのアクセスが可能な Mainframe Data Service for Apache Spark
z/OS (MDSS) を同梱– 表中のデータソースに対するANSI 92レベルのSQLアクセスを提供
データソースにアクセスするためのJDBCドライバーを含む– Spark でDB2、IMS、VSAM、SAMなどのメインフレーム・データや分散システムのデータを利用する事が可能
7
メインフレーム・データ分散(Linux/Unix/Windows )上の
データベース
• IBM DB2
• IBM IMS
• VSAMファイル• シーケンシャルファイル• Software AG Adabas
• IBM DB2
• Apache Derby
• IBM Informix
• Oracle
• Microsoft SQL Server
・・・以降、Spark on z/OSと略記
Sparkとメインフレームデータを接続するMDSS
8
Spark
MDSS
Data Service Studio
(Eclipseツール)
DB2 IMS VSAM
z/OS
Windows PC
JDBC
JDBC
MDSSへJDBCで接続し、Virtual Tableに対してSQL発行する。実際のデータソースへのアクセスはMDSSが行う
SAMデータソース
Virtual Table
(データソースの投影)
Virtual tableとデータソースのマッピングを行う
Spark on z/OSと基幹オンラインの連携
9
z/OS
Sparkアプリケーション
Java z/OS (USS上で稼働)
Spark SQLSpark
StreamingMLlib
(機械学習)GraphX
Apache Spark Core
RDD RDD RDD RDD RDD
外部分散システムMDSS
OLTPアプリケーション
(CICS、IMS…)
Sparkを基幹業務の延長線上と考えオンラインから利用
DB2 IMS VSAM SAM
Asakusa FrameworkによってSparkは基幹バッチにも適用できる
10
z/OS
Java z/OS (USS上で稼働)
Spark SQLSpark
StreamingMLlib
(機械学習)GraphX
外部分散システム
バッチアプリケーション
OLTPアプリケーション
(CICS、IMS…)
Sparkを基幹業務の延長線上と考えバッチから利用
Sparkアプリケーション
Apache Spark Core
RDD RDD RDD RDD RDD
MDSS
DB2 IMS VSAM SAM
コストについて
Q: CPUもメモリーも多く使いそうだけど・・・
A: z Systemsの戦略的に、高額にならないような仕掛けがあります。
11
Though the standard pricing for IBM System z Integrated Information Processors (zIIPs) and memory might not be competitive, as part of the IBM z/OS Platform for Apache Spark offering IBM is offering specially priced zIIPs and memory.
http://www.redbooks.ibm.com/redbooks/pdfs/sg248325.pdf
zIIP* という特殊なCPUとメモリーについて、Spark on z/OSの用途向けのオファリングがあります(詳細はお問い合わせください)
zIIPとは: Javaなどをオフロードすることができる、専用CPU。zIIPはソフトウェア課金の対象外なので、Spark実行時のコスト増大を抑えることができる。なお、zIIPは通常のCPU(GCP)と比較して割安に価格設定されている。
Asakusaとのバージョン整合性は厳密に合わせること
Q: Spark on z/OSのバージョンは?
A: 1.5.2です(2016/11現在)。これに対応するAsakusaのバージョンは0.7.6ですので、今回はこれを使用しました。
12
開発環境 実行環境
Asakusa
Framework
Asakusa
on SparkGradle Spark Hadoop
0.8.0 0.3.0 2.12 1.6.1 2.x
0.7.6 0.2.2 2.8 1.5.2 2.x
Spark 1.5.2に適合するAsakusa 0.7.6を使用
その他、気になること
Q: Sparkはあることがわかったけれど、Hadoopは?
A: z/OSでは提供されていません。今回はAsakusa FrameworkをHadoopなしで実行します。
Q: では、HDFSに処理対象のデータは置かない?
A: 置きません。AsakusaのWindGate機能から、MDSS-JDBC経由のメインフレームデータ、もしくはUNIXファイルシステムのデータを使用します。
Q: データの文字コードは?
A: z/OSデータセットに関しては、EBCDICです。日本語の文字も扱うことができます。Unixファイルに関しては、Asakusaで入出力するデータはUTF-8です。
13
バッチアプリ開発・実行
結論: Asakusa on z/OSのアプリケーションが正常実行できた。– hadoopコマンドがないというメッセージは出るものの、実行自体には問題ない
開発: 売上データの振り分け・マスターデータとの結合・集計を行うサンプルアプリケーション(チュートリアル)をベースに、入力データをz/OSデータセットに変換・配置して実行– http://docs.asakusafw.com/basic-tutorial/
詳細: いくつかのノウハウがある。本資料の「補足」にて後述。
性能: 想定通り、zIIPでほとんどのCPU処理を行うことができ、実用的なスループットが得られた。(次ページに検証)
14
Asakusa on z/OS検証環境
z/OS
Java z/OS (USS上で稼働)
Apache Spark Core
USSSAM
データセット
MDSS
アプリケーション
店舗マスター商品マスター売上明細
集計結果
Telnet接続し、YAESSによりバッチアプリケーション実行
操作端末
15
データソースをホストデータとして準備
チュートリアルのシナリオにて、売り上げ情報のレコード数を増幅してアプリケーションを実行
入力データをz/OSデータセットとして準備し、MDSS経由で読み取り
商品マスタAZK.ASAKUSA.SAMPLE.SEQFILES(ITEMINFO)
店舗マスタAZK.ASAKUSA.SAMPLE.SEQFILES(STORINFO)
売上明細AZK.ASAKUSA.SAMPLE.SEQFILE4
922010001000Milk Chocolate M 110Snack 1600ChocolateSnack ...ツ2010/04/012010/04/012019/12/331 922010001001PREMIUM Chocolate 110Snack 1600ChocolateSnack ...¢2010/04/012010/04/012019/12/331 922010001002Almond Crunch mini 110Snack 1600ChocolateSnack ...ナ2010/04/012010/04/012019/12/331 922020002000CupNoodle Shoyu 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922020002001CupNoodle Salt 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922020002002CupNoodle Curry 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922030003000CupIce YubariMelon 110Snack 1300IceCream ...エ2010/04/012010/04/012019/12/331 922030003001Maccha Sundae 110Snack 1300IceCream ...¥2010/04/012010/04/012019/12/331 922030003002RockIce Ichigo 110Snack 1300IceCream ...2010/04/012010/04/012019/12/331
0000SuperMakuhari-HQ 0001SuperMakuhari-Shinagawa0002SuperMakuhari-Shibuya 0055SuperMakuhari-Heiwajima0004SuperMakuhari-Nishiarai
2011-04-01 10:30:0000014922010001000.......ツ...ツDUMMY2011-04-01 10:31:0000014922020002000.......イ...DDUMMY2011-04-01 10:32:0000014922030003000.......エ....DUMMY2011-04-01 10:30:0000014922010001000.......ツ...ツDUMMY2011-04-01 10:31:0000014922020002000.......イ...DDUMMY2011-04-01 10:32:0000014922030003000.......エ....DUMMY...
16
結果:処理スループットは現実的
YAESS実行ログに出力される処理時間で比較
ケース# レコード数 データサイズ(bytes) Elapse(msec)
1 5 265 21,129
2 10,000,002 530,000,106 62,779
3 20,000,004 1,060,000,212 88,430
0
10000
20000
30000
40000
50000
60000
70000
80000
90000
100000
0 500000000 1E+09 1.5E+09
Ela
pse(m
sec)
bytes
0
10000
20000
30000
40000
50000
60000
70000
80000
90000
100000
0 5000000 10000000 15000000 20000000 25000000
Ela
pse(m
sec)
# of records
17
結果:CPU使用は、大部分をzIIPに逃がせられた
前頁のケース3(レコード数20,000,004件)でのCPU時間– RMF(Workload Activity Report) より
Application (Spark) MDSS
GCP(汎用CPU) 4.847 0.035
zIIP 99.178 0
単位:秒
18
まとめ
Asakusa FrameworkによるバッチアプリケーションをSpark on z/OS上で実行することができた。
セキュリティ、スキル、コストの観点で、バッチアプリケーションを進化できるソリューションになり得る。
19
20
補足
アプリケーション開発の概要手順
開発シナリオ
Asakusa Frameworkでは、小売店の売り上げ情報をカテゴリー別に集計するサンプル・アプリケーションをベースにしたチュートリアルが提供されています。
http://docs.asakusafw.com/basic-tutorial/latest/release/ja/html/index.html
この節では、上のチュートリアルをベースに、一部必要な箇所を修正しながらApache Spark on z/OS上でアプリケーションを稼働させる際に必要なポイントをご紹介していきます。
開発環境としてCentOS 7.2, Jinrikisha 0.7.6を使用し稼働確認を行った結果に基づいて記述しています。
21
前提SWバージョン
Asakusa Framework (実行環境)
IBM z/OS Platform for Apache Spark (Spark on z/OS)
Asakusa
Framework
Asakusa on Spark Apache
Spark
Apache Hadoop
0.8.1 0.3.1 1.6.2 2.7.2
0.8.0 0.3.0 1.6.1 2.7.2
0.7.6 0.2.2 1.5.2 1.2.1
2.6.0
0.7.5 0.2.1 1.5.2 1.2.1
2.6.0
Spark on z/OS Apache Spark z/OS Bash Java
1.1 1.5.2 2.1 以降 4.2.53以降 IBM 64bit SDK V8 SR2 FP10
IBM z/OS Platform for Apache Sparkに対応するAsakusa Frameworkは0.7.6 もしくは0.7.5
(2016年9月時点)
22
前提SWバージョン
Asakusa Framework (開発環境)
Jinrikisha(人力車)– Asakusa Frameworkの開発環境を手軽に構築するパッケージ
パッケージ内にはAsakusa Framework、Apache Spark、関連ツールなどが同梱され、わずかな手順でセットアップ可能
– 同梱SW
Asakusa Framework Platform ビルドツール(Gradle)
Java
(JDK)
Eclipse Hadoop
Win Mac Ubuntu Desktop
0.7.6 7(SP1)
10
10.9
10.11
12.04
14.04
2.8 1.7.0_76
1.8.0.66
4.4.2
4.5.1
1.2.1
2.6.0
0.7.5 7(SP1)
10
10.9
10.11
12.04
14.04
2.8 1.7.0_76
1.8.0.66
4.4.2
4.5.1
1.2.1
2.6.0
Jinrikisha Asakusa Framework Platform Eclipse Apache
Spark
Hadoop
Ubuntu Desktop CentOS Mac
0.7.6 0.7.6 16.04 7.2 10.11 4.5.1 × 1.2.1
0.7.5 0.7.5 16.04 7.2 10.11 4.5.1 × 1.2.1
Spark on z/OSに対応するJinrikisha(Asakusa Framework)で開発を行う場合、Apache Sparkが同梱されていない為、対応するApache Spark(1.5.2)を開発環境に別途用意する必要があるので注意
23
開発の流れ
(1) 対象データの準備– z/OS上のデータ(シーケンシャル・データ、DB2, IMS上のデータ等)を、MDSS提供のJDBCドライバー経由でアクセスすることを想定
------------------------------------Asakusa Frameworkでの開発 (ここから)--------------------------------------
(2) データモデルの作成– 対象データに関して、Asakusa Framework上で操作するためにデータ・モデルを定義する
(3) 演算子の作成– バッチアプリケーションを構成する処理の単位となる 演算子 を作成
(4) フロー部品の作成– 演算子を組み合わせてフローの部品を作成
(5) ジョブフローの作成– フロー部品を組み合わせて一連のフローを作成
(6) バッチの作成– ジョブ・フローを組み合わせて業務バッチを作成
(7) デプロイメント・アーカイブの作成– Spark on z/OS上で稼働させるためのモジュール生成
------------------------------------Asakusa Frameworkでの開発 (ここまで)--------------------------------------
(8) デプロイ/実行24
(1) 対象データの準備
対象データはMDSS経由でアクセスされるz/OS上データ(VSAM, SAM, IMS DB等)、もしくは、USS上のファイルとする。
MDSS経由でアクセスするデータの場合、Virtual TableなどJDBCでアクセスできるようにするためのMDSS上の設定は別途必要(ここでは詳細は触れない)。
USS上のファイルの場合、データはUTF-8で用意する。
※ z/OSではHadoopはサポートされていない
25
(2) データモデルの作成
データ入出力の仕組みは、Direct I/Oは使用できない(*)ため、WindGate経由のアクセス(JDBCアクセスorローカルファイルシステムアクセス)を行う必要がある。
MDSS経由のデータアクセスの場合、WindGateによるJDBCアクセスを行う。– MDSSで使用できるSQLの型には制限があるので注意。
WindGate でサポートされる型
http://docs.asakusafw.com/latest/release/ja/html/windgate/user-
guide.html#dmdljdbc
• MDSS でサポートされる型
http://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.
azkc100/dvs_ag_ref_SQL_Type_Support_by_Shadow_Server_Interface.htm
– 例えば、Asakusaチュートリアルで使用されているDate, TimeはMDSS経由のシーケンシャルファイルでは使用できないため、必要に応じて型の変換等を考慮する必要がある。
USS上のファイルを使用する場合、WindGateによるローカルファイルシステムアクセスを行う– データはCSV形式、UTF-8で用意する。
26
参考: DMDL記述例
"店舗マスタ"@windgate.jdbc.table(name = "D_STORE_INFO")store_info = {
"店舗コード"@windgate.jdbc.column(name = "D_STORE_CODE")store_code : TEXT;
"店舗名称"@windgate.jdbc.column(name = "D_STORE_NAME")store_name : TEXT;
};
"売上明細"@windgate.csv(
has_header = TRUE,datetime = "yyyy-MM-dd HH:mm:ss"
)sales_detail = {
"売上日時"@windgate.csv.field(name = "日時")sales_date_time : DATETIME;
"店舗コード"@windgate.csv.field(name = "店舗コード")store_code : TEXT;
"商品コード"@windgate.csv.field(name = "商品コード")item_code : TEXT;
"数量"@windgate.csv.field(name = "数量")amount : INT;
"販売単価"@windgate.csv.field(name = "販売単価")unit_selling_price : INT;
"販売金額"@windgate.csv.field(name = "販売金額")selling_price : INT;
"ファイル名"@windgate.csv.file_namefile_name : TEXT;
};
WindGateローカルファイルシステムアクセス(USS上のcsvファイルの場合)
WindGate JDBCアクセス(MDSS経由のメインフレームデータの場合)
27
(3) 演算子の作成、(4) フロー部品の作成
この部分の開発は、実際のデータの持ち方には直接依存しないため、一般的なAsakusa Framework
の作法に従えばよく、特にSpark on z/OS特有の考慮点は無い。
ただし、前述の通り、使用できる型の制約等があり、ロジックで型変換などの対応が必要であれば、その部分を考慮した実装は必要。
28
(5) ジョブフローの作成
前述の通り、Apache Spark for z/OSで稼働させる際にはDirect I/Oは使用できないため、WindGate機能を利用したJDBCアクセス/ローカルファイルシステムアクセスを行う必要がある。
インポーター記述 / エクスポーター記述は、DMDLで指定した入出力方法に合わせた記述を行う必要がある。– JDBC
インポーター記述
http://docs.asakusafw.com/latest/release/ja/html/windgate/user-guide.html#id59
• エクスポーター記述
http://docs.asakusafw.com/latest/release/ja/html/windgate/user-guide.html#id62
– ローカルファイル インポーター記述
http://docs.asakusafw.com/latest/release/ja/html/windgate/user-guide.html#id48
エクスポーター記述
http://docs.asakusafw.com/latest/release/ja/html/windgate/user-guide.html#id51
MDSS経由のJDBCアクセスでは、データの種類によってはRead-onlyとなるので注意– Read-onlyのデータソースに対して出力させない (エクスポーター記述を行わない)
– JobFlowTesterやBatchTesterを使用したテストは、Excelで準備したテストデータを実DBMSに流し込みテストを行うことになるため、Read-onlyのデータソースに対しては利用不可(次頁参照)
FlowPartTestの利用や、書き込み可能な代替環境を用意するなど考慮が必要
29
(6) バッチの作成
(5) ジョブフロー作成と同様、テスト時のMDSSアクセス(Read-only)に注意
30
(7)デプロイメント・アーカイブの作成
Spark on z/OSのバージョンは V1.5.2 であるため、関連するコンポーネントのバージョンもそれに合わせる必要がある。
開発環境 実行環境
Asakusa on Spark Asakusa Framework Gradle Spark Hadoop
0.3.0 0.8.0 2.12 1.6.1 2.x
0.2.2 0.7.6 2.8 1.5.2 2.x
31
(7)デプロイメント・アーカイブの作成…
各コンポーネントのバージョン情報に合わせて、Sparkモジュール生成用にbuild.gradleを修正
buildscript {repositories {
maven { url'http://asakusafw.s3.amazonaws.com/maven/releases' }
}dependencies {
classpath group: 'com.asakusafw.spark', name: 'asakusa-spark-gradle', version: '0.2.2'
}}
task wrapper(type: Wrapper) {distributionUrl
'http://services.gradle.org/distributions/gradle-2.8-bin.zip'
jarFile file('.buildtools/gradlew.jar')}
apply plugin: 'asakusafw'apply plugin: 'asakusafw-organizer'apply plugin: 'eclipse'apply plugin: 'asakusafw-spark'
asakusafw {asakusafwVersion '0.7.6-hadoop2'
modelgen {modelgenSourcePackage 'com.example.modelgen'
}compiler {
compiledSourcePackage 'com.example.batchapp'}
}
asakusafwOrganizer {profiles.prod {
asakusafwVersion asakusafw.asakusafwVersionarchiveName "${project.name}.tar.gz"assembly.into('example-dataset') {
put 'src/test/example-dataset'}
}}
dependencies {compile group: 'com.asakusafw.sdk', name:
'asakusa-sdk-core', version: asakusafw.asakusafwVersion
compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: asakusafw.asakusafwVersion
compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: asakusafw.asakusafwVersion
provided (group: 'org.apache.hadoop', name: 'hadoop-client', version: '2.7.1') {
exclude module: 'junit'exclude module: 'mockito-all'exclude module: 'slf4j-log4j12'
}}
32
(8) デプロイ / 実行
前提– Spark on z/OS実行可能なユーザーで操作する想定
生成された.tar.gzファイルをUSS上にバイナリーモードで転送し、gunzipを行う– gzipが入っていない環境の場合、tarに変換してから転送– 例: /u/asakusa/asakusa-develop/asakusa_MDSS01に展開
環境変数を作業シェルに適用
SPARKID:/u/asakusa/asakusa-develop:>mkdir asakusa_MDSS01SPARKID:/u/asakusa/asakusa-develop:>cd asakusa_MDSS01SPARKID:/u/asakusa/asakusa-develop/asakusa_MDSS01:>tar -xvf ../asakusa-tutorial076-mdss01.tar
SPARKID:/u/asakusa/asakusa-develop:>cat env.shexport JAVA_HOME=/usr/lpp/java/J8.0_64#export HADOOP_CMD=export SPARK_HOME=/usr/lpp/IBM/Sparkexport SPARK_CMD=/usr/lpp/IBM/Spark/bin/spark-submitexport ASAKUSA_HOME=/u/asakusa/asakusa-develop/asakusa_MDSS01export ASAKUSA_DEVELOP_HOME=/u/asakusa/asakusa-developexport _BPX_SPAWN_SCRIPT=YESexport _BPXK_AUTOCVT=ONexport PATH=$PATH:/bin:/usr/lpp/rocket/bash-4.2/bin:$JAVA_HOME/binexport CLASSPATH=$CLASSPATH:/usr/lpp/IBM/Spark/lib/*:/usr/lpp/IBM/Spark/lib
SPARKID:/u/asakusa/asakusa-develop:>. ./env.sh
33
(8) デプロイ / 実行…
.shファイル、.propertiesファイルをEBCDICに変換し、.shファイルに実行権限を与える
SPARKID:/u/asakusa/asakusa-develop:>cat conv.sh#!/bin/sh
cd ~for n in `find $ASAKUSA_HOME -name *.sh`; domv $n $n.orgiconv -f IBM-943 -t IBM-939 $n.org > $ndone
for n in `find $ASAKUSA_HOME -name *.properties`; domv $n $n.orgiconv -f IBM-943 -t IBM-939 $n.org > $ndone
for n in `find $ASAKUSA_HOME -name *.sh`; dochmod +x $ndone
SPARKID:/u/asakusa/asakusa-develop:>./conv.sh
34
(8) デプロイ / 実行…
ASAKUSAHOMEのwindgate/libに、Spark on z/OS提供のHadoop関連のjarのシンボリックリンク作成
SPARKID:/u/asakusa/asakusa-develop:>cat link.sh#!/bin/sh
cd $ASAKUSA_HOME/windgate/libln -s $SPARK_HOME/lib/spark-assembly-1.5.2-hadoop2.6.0.jar hadoop.jar
SPARKID:/u/asakusa/asakusa-develop:>./link.sh
SPARKID:/u/asakusa/asakusa-develop:>ls -la $ASAKUSA_HOME/windgate/libtotal 2336drwxr-xr-x 2 SPARKID SPKGRP 8192 Aug 9 18:55 .drwxr-xr-x 8 SPARKID SPKGRP 8192 Aug 9 17:24 ..-rw-r--r-- 1 SPARKID SPKGRP 20763 Aug 9 17:24 asakusa-windgate-bootstrap-0.7.6-hadoop2.jar-rw-r--r-- 1 SPARKID SPKGRP 97998 Aug 9 17:24 asakusa-windgate-core-0.7.6-hadoop2.jarlrwxrwxrwx 1 SPARKID SPKGRP 59 Aug 9 18:55 hadoop.jar -> /usr/lpp/IBM/Spark/lib/spark-assembly-1.5.2-hadoop2.6.0.jar-rw-r--r-- 1 SPARKID SPKGRP 263829 Aug 9 17:24 jsch-0.1.51.jar-rw-r--r-- 1 SPARKID SPKGRP 4960 Aug 9 17:24 jul-to-slf4j-1.7.5.jar-rw-r--r-- 1 SPARKID SPKGRP 270750 Aug 9 17:24 logback-classic-1.1.2.jar-rw-r--r-- 1 SPARKID SPKGRP 427729 Aug 9 17:24 logback-core-1.1.2.jar-rw-r--r-- 1 SPARKID SPKGRP 26084 Aug 9 17:24 slf4j-api-1.7.5.jar
35
(8) デプロイ / 実行…
WindGateのプロファイルにMDSSアクセス用のJDBCの設定、および、ローカルファイルシステムアクセス用の設定を行う– $ASAKUSA_HOME/windgate/profile/asakusa.properties 抜粋
...
# Local File Systemresource.local=com.asakusafw.windgate.stream.file.FileResourceProviderresource.local.basePath=/u/asakusa/asakusa-develop/asakusa_MDSS01/example-dataset
# JDBCresource.jdbc=com.asakusafw.windgate.jdbc.JdbcResourceProviderresource.jdbc.driver=com.rs.jdbc.dv.DvDriverresource.jdbc.url=jdbc:rs:dv://mdsshostname:1200resource.jdbc.user=sparkidresource.jdbc.password=xxxxxxxxresource.jdbc.batchGetUnit=1000resource.jdbc.batchPutUnit=1000resource.jdbc.connect.retryCount=3resource.jdbc.connect.retryInterval=10resource.jdbc.statement.truncate=TRUNCATE TABLE {0}resource.jdbc.properties.loginTimeout=10resource.jdbc.properties.DatabaseType=DVSresource.jdbc.properties.NetworkTimeout=30
...
36
(8) デプロイ / 実行…
MDSSアクセス用JDBCドライバーの設定を行う– Spark on z/OSインストールディレクトリのlibに提供されている以下のjarを、
$ASAKUSA_HOME/windgate/plugin/にコピー
bashに変更し、yaessによりバッチアプリケーションを実行
dv-jdbc-3.1.22756.jarlog4j-api-2.4.1.jarlog4j-core-2.4.1.jar datanucleus-api-jdo-3.2.6.jardatanucleus-core-3.2.10.jar datanucleus-rdbms-3.2.9.jar
SPARKID:/u/asakusa/asakusa-develop:>bashbash-4.2$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh spark.example.summarizeSales -A date=2011-04-01
37
メモ
各種バージョンの整合性(開発環境、実行環境)は厳密に合わせる必要がある。– Asakusa Frameworkとしては基本的にソースの上位互換はある。
Asakusa Frameworkとしての開発作法に従う必要がある。– 設計から実装までの工程は、単純なアプリでもステップが多い。– データのマッピング、フローの作成、ともにJavaのコーディング・スキルが必要。– Asakusa Frameworkでデータ構造を表すクラスを自動生成してくれるが、それを直接意識してフローをコーディングする必要があるため、Frameworkでどのような定義を行うとどのようなクラスが生成されるかを理解しておく必要がある。
z/OS上のデータを扱う場合、MDSSの制約に注意する必要がある。– Read-onlyの場合、一部eclipse上から単体テストが行えない。– 使用できるデータの型に制約が生じる。– MDSSとしての読み取り可能なレコード数上限に注意
構成パラメーター: SQLENGMAXDBREAD(デフォルト 25,000レコード)
稼働手順に文字コード変換、権限設定のステップを組み込む必要がある。
一部z/OS上でHadoopが使えないことによる考慮が必要(Asakusa Frameworkでは内部的にHadoop
機能を使用する場合があるため)。– Spark on z/OS環境にてSpark提供のHadoop関連のjarを設定– 実行時にHadoop関連のWarning, Errorメッセージが出る場合がある(無視してよい)
38
データ型Asakusa
Framework
DMDL
Javaクラス JDBC
Spark on z/OS
DB2MDSS
(IMS,VSAM,etc)
32bit符号付き整数 INTint
(IntOption)int ○ ○
64bit符号付き整数 LONGlong
(LongOption)long
○(SQL_Bigint)
※(将来対応予定)
単精度浮動小数点 FLOATfloat
(FloatOption)float ○
倍精度浮動小数点 DOUBLEDouble
(DoubleOption) double ○
文字列 TEXTText
(StringOption)String ○ ○
10進数 DECIMALBigDecimal
(DecimalOption)BigDecimal ○ ○
日付 DATEDate
(DateOption)java.sql.Date ○
日時 DATETIMEDateTime
(DateTimeOption)
Java.sql.Timesta
mp
※(SQL_Time)
論理値 BOOLEANBoolean
(BooleanOption)boolean
8bit符号付き整数 BYTEbyte
(ByteOption)byte
○(SQL_Binary)
○
16bit符号付き整数 SHORTShort
(ShortOption)short
○(SQL_Smallint)
○
Spark on z/OSとAsakusa Framework DMDLデータ型の対応
39
COBOL型 SQL_Type
PIC X(30)PIC A(30)
SQL_Char
PIC S9(3)V9(3)PIC S9(3)V9(3) USAGE DISPLAY
SQL_Char
PIC G(30) USAGE DISPLAY-1 SQL_Graphic
PIC S9(03)V9(3) USAGE COMP-3 SQL_Decimal
PIC S9(n) USAGE BINARYPIC S9(n) USAGE COMPPIC S9(n) USAGE COMP-4PIC S9(n) USAGE COMP-5PIC 9(n) USAGE COMP-5
n=1-4 : SQL_Smallint
n=5-9 : SQL_Integer
n=10-18 : SQL_Binary
※ n=10-18は将来SQL_Bigintをサポート予定
USAGE IS COMP-1 SQL_Float
USAGE IS COMP-2 SQL_Double
PIC S9(03)V9(3) USAGE COMP-3PIC S9(03)V9(3) USAGE PACKED-DECIMAL
SQL_Decimal
Spark on z/OSのCOBOLデータ型とSQLデータ型マッピング
http://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.azkc100/dvs_ag_ref_COBOL1.htm
40
参考
Asakusa Frameworkチュートリアルのシナリオ*をSpark on z/OS上で稼働させるための詳細手順
* http://docs.asakusafw.com/basic-tutorial/0.8/release/ja/html/index.html
41
データ準備
概要– 入力データはz/OS上に固定長フィールドのデータとして準備し、出力データ(集計結果)はUSS上のファイルとしてCSV形式で生成することを想定
入力データ用COBOL COPYBOOK
– 商品マスター: COPYITEM
– 店舗マスター: COPYSTOR
– 売り上げ情報: COPYSALE
01 DATAFIELDS. 05 D_ITEM_CODE PIC X(13). 05 D_ITEM_NAME PIC X(40). 05 D_DEPARTMENT_CODE PIC X(3). 05 D_DEPARTMENT_NAME PIC X(10). 05 D_CATEGORY_CODE PIC X(4). 05 D_CATEGORY_NAME PIC X(20). 05 D_UNIT_SELLING_PRICE PIC S9(09) COMP. 05 D_REGISTERED_DATE PIC X(10). 05 D_BEGIN_DATE PIC X(10). 05 D_END_DATE PIC X(10).
01 DATAFIELDS. 05 D_STORE_CODE PIC X(04). 05 D_STORE_NAME PIC X(100).
01 DATAFIELDS. 05 D_SALES_DATE_TIME PIC X(19). 05 D_STORE_CODE PIC X(4). 05 D_ITEM_CODE PIC X(13). 05 D_AMOUNT PIC S9(09) COMP. 05 D_UNIT_SELLING_PRICE PIC S9(09) COMP. 05 D_SELLING_PRICE PIC S9(09) COMP. 05 D_FILE_NAME PIC X(5).
DATE型はサポートされないため、日付は文字列型
として定義
DATETIME型はサポートされないため、日時は文字
列型として定義
42
データ準備
入力データ– 商品マスター: AZK.ASAKUSA.SAMPLE.SEQFILES(ITEMINFO)
– 店舗マスター: AZK.ASAKUSA.SAMPLE.SEQFILES(STORINFO)
– 売り上げ情報: AZK.ASAKUSA.SAMPLE.SEQFILE4
922010001000Milk Chocolate M 110Snack 1600ChocolateSnack ...ツ2010/04/012010/04/012019/12/331 922010001001PREMIUM Chocolate 110Snack 1600ChocolateSnack ...¢2010/04/012010/04/012019/12/331 922010001002Almond Crunch mini 110Snack 1600ChocolateSnack ...ナ2010/04/012010/04/012019/12/331 922020002000CupNoodle Shoyu 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922020002001CupNoodle Salt 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922020002002CupNoodle Curry 130Food 1401CupNoodle ...イ2010/04/012010/04/012019/12/331 922030003000CupIce YubariMelon 110Snack 1300IceCream ...エ2010/04/012010/04/012019/12/331 922030003001Maccha Sundae 110Snack 1300IceCream ...¥2010/04/012010/04/012019/12/331 922030003002RockIce Ichigo 110Snack 1300IceCream ...2010/04/012010/04/012019/12/331
0000SuperMakuhari-HQ 0001SuperMakuhari-Shinagawa0002SuperMakuhari-Shibuya 0055SuperMakuhari-Heiwajima0004SuperMakuhari-Nishiarai
2011-04-01 10:30:0000014922010001000.......ツ...ツDUMMY2011-04-01 10:31:0000014922020002000.......イ...DDUMMY2011-04-01 10:32:0000014922030003000.......エ....DUMMY2011-04-01 10:30:0000014922010001000.......ツ...ツDUMMY2011-04-01 10:31:0000014922020002000.......イ...DDUMMY2011-04-01 10:32:0000014922030003000.......エ....DUMMY...
数値フィールドはバイナリで指定する必要あり
元はcsvファイル名を指定するフィールドなのでここではDUMMYとする
43
データ準備
MDSS経由でアクセスするためのVirtual Tableを作成
このVirutual Tableの名前がJDBC経由でアクセスされる
テーブル名となる
44
開発環境整備
環境– CentOS V7.2
– Jinrikisha V0.7.6 (& Shafu, DMDLエディター)
インストーラーの入手– 旧バージョンのJinrikishaは以下のサイトからダウンロード可能
Jinrikisha ダウンロードアーカイブhttp://docs.asakusafw.com/jinrikisha/ja/html/download-archive.html
45
開発環境整備
インストール– 以下の手順に従ってJinrikishaをインストール
Jinrikisha インストール手順http://docs.asakusafw.com/jinrikisha/ja/html/install.html
主な操作内容
専用ユーザーを作成し、sudo権限付与
JAVA_HOME環境変数設定
setup.sh実行 (指示に従いインストール処理を進める)
– 以下の手順に従いJinrikishaに含まれるeclipseにShafuをインストール Shafu - Asakusa Gradle Plug-in Helper for Eclipse
http://docs.asakusafw.com/jinrikisha/ja/html/shafu.html
Gradleのバージョン設定は使用するAsakusa Frameworkのバージョンに合わせる(次ページ参照)
– 以下の手順に従いJinrikishaに含まれるeclipseにDMDLエディターをインストール DMDL Editorプラグイン
http://docs.asakusafw.com/jinrikisha/ja/html/introduction/dmdl-editor.html
46
開発環境整備 Preferences - jinrikisha
– Gradleのバージョンと、使用するAsakusa Frameworkのバージョンとの整合性を合わせる
2.8を選択
47
プロジェクトの作成
File > New > Gradleプロジェクトをテンプレートから生成
テンプレート選択画面では、Asakusa Project Template -
0.7.6を選択
48
プロジェクトにAsakusa Frameworkの構成
プロジェクト右クリック > jinrikisha > Asakusa開発環境の構成 > Asakusa Frameworkのインストール
49
DMDL作成
src/main/dmdl/models.dmdlを作成
Spark on z/OSで稼働させるための修正ポイント
Direct I/Oはサポートされないため、全てWindGate経由でアクセスするよう定義する必要があります。入力用のデータモデルはJDBC(MDSS経由)、出力用のデータモデルはローカルファイルシステム(USS)として定義します。テーブル名、カラム名はVirtual Tableとして定義した名前に合わせます。型もMDSSでサポートされる型に合わせて定義します(DATE型、DATETIMEは使用不可)。
50
データモデルクラス作成
プロジェクト右クリック > jinrikisha > DMDLからデータモデルクラスを作成
build/generated-souces/modelgenに各種クラスが生成される。
51
演算子(Operator)の作成
src/main/java/com.example.operator/CategorySummaryOperator.javaを作成
Spark on z/OSで稼働させるための修正ポイント
日付、時刻の型が使えないため、日付、時刻は文字列型として読み込む必要があります。そのため、日付、時刻の型として情報を扱いたい場合は、型変換を行う演算子を組み込む必要があります。ここでは、簡素化のために、日付/時刻を扱うロジック自体を省くこととします(売り上げ日時が、マスター上の有効範囲かどうかのチェックは行わないようにする)。
52
フロー部品(FlowPart)の作成
src/main/java/com.example.flowpart/CategorySummaryFlowPart.javaを作成
Spark on z/OSで稼働させるための修正ポイント
特に無し
53
ジョブフローの作成 src/main/java/com.example.jobflow/に以下のファイルを作成
– ジョブフロー本体 CategorySummaryjob.java
– インポーター記述 ItemInfoFromCsv.java
SalesDetailFromCsv.java
StoreInfoFromCsv.java
– エクスポーター記述 CategorySummaryToCsv.java
ErrorRecordToCsv.java
Spark on z/OSで稼働させるための修正ポイント
DMDLでは、全てWindGate経由でのアクセスを行うよう定義を変更しています。そのため、インポーター/エクスポーター記述もそれに合わせて変更する必要があります。
54
バッチの作成
src/main/java/com.example.batch/SummarizeBatch.javaを作成
Spark on z/OSで稼働させるための修正ポイント
特に無し
55
build.gradleの編集
build.gradleをAsakusa Frameworkのバージョンに合わせて適宜修正
Spark on z/OSで稼働させるための修正ポイント
Spark用の実行モジュールを生成させるよう指定する必要があります。Spark on z/OSのバージョンと整合性を合わせるため、Asakusa Frameworkは古いバージョン(0.7.6)を使用しています。それに伴い、各種関連コンポーネント(gradle, asakusa on spark等)のバージョンを合わせる必要があります。
56
デプロイメント・アーカイブの生成
プロジェクト右クリック - jinrikisha - Asakusaデプロイメントアーカイブを生成
build以下にxxx.tar.gzファイルが生成される。このファイルをUSS上にデプロイする。
57
デプロイ
開発環境(CentOS)上で生成されたxxx.tar.gzをunzipしてtarファイルに変換しておく (デプロイ先のUSS
ではデフォルトでgzipがインストールされていないため。gzipのある環境では不要)
– 対象のファイル(xxx.tar.gz)が生成されたディレクトリで、以下のコマンドでunzipする gunzip xxx.tar.gz
バイナリモードで、unzipしたデプロイメント・アーカイブ・ファイル(xxx.tar)をUSS上に転送する。
Spark on z/OS実行可能なユーザーでUSSにログイン
特定のディレクトリにxxx.tarを展開
ここでは/u/asakusa/asakusa-develop/asakusa_MDSS03に展開する(このディレクトリをASAKUSA_HOMEとする)
----- 以降、USS上での操作 -----
SPARKID:/u/asakusa/asakusa-develop:>mkdir asakusa_MDSS03SPARKID:/u/asakusa/asakusa-develop:>cd asakusa_MDSS03SPARKID:/u/asakusa/asakusa-develop/asakusa_MDSS03:>tar -xvf ../asakusa-tutorial076-mdss03.tar
58
デプロイ
環境変数を作業シェルに適用
SPARKID:/u/asakusa/asakusa-develop:>cat env.shexport JAVA_HOME=/usr/lpp/java/J8.0_64#export HADOOP_CMD=export SPARK_HOME=/usr/lpp/IBM/Sparkexport SPARK_CMD=/usr/lpp/IBM/Spark/bin/spark-submitexport ASAKUSA_HOME=/u/asakusa/asakusa-develop/asakusa_MDSS03export ASAKUSA_DEVELOP_HOME=/u/asakusa/asakusa-develop
export _BPX_SPAWN_SCRIPT=YESexport _BPXK_AUTOCVT=ON
export PATH=$PATH:/bin:/usr/lpp/rocket/bash-4.2/bin:$JAVA_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/lpp/IBM/Spark/lib/*:/usr/lpp/IBM/Spark/lib
SPARKID:/u/asakusa/asakusa-develop:>. ./env.sh
59
デプロイ
.shファイル、.propertiesファイルをEBCDICに変換し、.shファイルに実行権限を与える
SPARKID:/u/asakusa/asakusa-develop:>cat conv.sh#!/bin/sh
cd ~for n in `find $ASAKUSA_HOME -name *.sh`; domv $n $n.orgiconv -f IBM-943 -t IBM-939 $n.org > $ndone
for n in `find $ASAKUSA_HOME -name *.properties`; domv $n $n.orgiconv -f IBM-943 -t IBM-939 $n.org > $ndone
for n in `find $ASAKUSA_HOME -name *.sh`; dochmod +x $ndone
SPARKID:/u/asakusa/asakusa-develop:>./conv.sh
60
デプロイ
$ASAKUSA_HOMEのwindgate/libに、Spark on z/OS提供のHadoop関連のjarのシンボリックリンクを作成
SPARKID:/u/asakusa/asakusa-develop:>cat link.sh#!/bin/sh
cd $ASAKUSA_HOME/windgate/libln -s $SPARK_HOME/lib/spark-assembly-1.5.2-hadoop2.6.0.jar hadoop.jar
SPARKID:/u/asakusa/asakusa-develop:>./link.sh
SPARKID:/u/asakusa/asakusa-develop:>ls -la $ASAKUSA_HOME/windgate/libtotal 2336drwxr-xr-x 2 SPARKID SPKGRP 8192 Aug 9 18:55 .drwxr-xr-x 8 SPARKID SPKGRP 8192 Aug 9 17:24 ..-rw-r--r-- 1 SPARKID SPKGRP 20763 Aug 9 17:24 asakusa-windgate-bootstrap-0.7.6-hadoop2.jar-rw-r--r-- 1 SPARKID SPKGRP 97998 Aug 9 17:24 asakusa-windgate-core-0.7.6-hadoop2.jarlrwxrwxrwx 1 SPARKID SPKGRP 59 Aug 9 18:55 hadoop.jar -> /usr/lpp/IBM/Spark/lib/spark-assembly-1.5.2-hadoop2.6.0.jar-rw-r--r-- 1 SPARKID SPKGRP 263829 Aug 9 17:24 jsch-0.1.51.jar-rw-r--r-- 1 SPARKID SPKGRP 4960 Aug 9 17:24 jul-to-slf4j-1.7.5.jar-rw-r--r-- 1 SPARKID SPKGRP 270750 Aug 9 17:24 logback-classic-1.1.2.jar-rw-r--r-- 1 SPARKID SPKGRP 427729 Aug 9 17:24 logback-core-1.1.2.jar-rw-r--r-- 1 SPARKID SPKGRP 26084 Aug 9 17:24 slf4j-api-1.7.5.jar
61
デプロイ
WindGateのプロファイルにMDSSアクセス用のJDBCの設定、および、ローカルファイルシステムアクセス用の設定を行う
$ASAKUSA_HOME/windgate/profile/asakusa.properties 抜粋
...
# Local File Systemresource.local=com.asakusafw.windgate.stream.file.FileResourceProviderresource.local.basePath=/u/asakusa/asakusa-develop/asakusa_MDSS03/example-dataset
# JDBCresource.jdbc=com.asakusafw.windgate.jdbc.JdbcResourceProviderresource.jdbc.driver=com.rs.jdbc.dv.DvDriverresource.jdbc.url=jdbc:rs:dv://mdsshostname:1200resource.jdbc.user=sparkidresource.jdbc.password=xxxxxxxxresource.jdbc.batchGetUnit=1000resource.jdbc.batchPutUnit=1000resource.jdbc.connect.retryCount=3resource.jdbc.connect.retryInterval=10resource.jdbc.statement.truncate=TRUNCATE TABLE {0}resource.jdbc.properties.loginTimeout=10resource.jdbc.properties.DatabaseType=DVSresource.jdbc.properties.NetworkTimeout=30
...
62
デプロイ
MDSSアクセス用JDBCドライバーの設定を行う
Spark on z/OSインストールディレクトリのlibに提供されている以下のjarを、$ASAKUSA_HOME/windgate/plugin/にコピー
dv-jdbc-3.1.22756.jarlog4j-api-2.4.1.jarlog4j-core-2.4.1.jar datanucleus-api-jdo-3.2.6.jardatanucleus-core-3.2.10.jar datanucleus-rdbms-3.2.9.jar
63
実行
bashに変更し、YAESSによりバッチアプリケーションを実行
結果の確認– $ASAKUSA_HOME/example-dataset/result/に以下のファイルが生成される
category-2011-04-01.csv 集計結果 error-2011-0401.csv エラーレコード情報
いずれもUTF-8で出力されているため、USS上でiconvでコード変換して参照するか、バイナリーモードでPC(Windows等)に転送して参照する必要がある。
– 出力結果例 category-2011-04-01.csv
error-2011-0401.csv
SPARKID:/u/asakusa/asakusa-develop:>bashbash-4.2$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh spark.example.summarizeSales -A date=2011-04-01
カテゴリコード,販売数量,売上合計1401,13333336,13066669281300,20000004,20000004001600,6666668,800000160
ファイル名,日時,店舗コード,商品コード,メッセージDUMMY,2011-04-01 10:33:00,9999,4922010001000,店舗不明DUMMY,2011-04-01 10:34:00,0001,9999999999999,商品不明
64
65
EOF