💭

Pentaho DataIntegrationで自分専用ETLサーバをつくる

2021/07/04に公開

構築するもの

PentahoDataIntegration(PDI)を用いて自分専用のETLサーバ

  • OSからETLまでOSSの利用でコストを極力抑える
  • ユーザーとのデータ受け渡し口としてhttpを利用
    PentahoDataIntegration(PDI)はバージョン6.1を利用します。http通信でデータをxmlで返却する際に7以降、最新の9でも日本語が文字化けしてしまい使えません。解決方法をご存じの方いらっしゃいましたら教えていただきたいです。

どうして自分専用ETLサーバがほしいのか?

仕事でETLは便利に使用するわけですが、システムの1部として組み込まれているETLは支障が出るとシステム全体に影響が出てしまうので困ります。仕事柄ユーザーからの依頼で必要なデータの整形取り出し等をするわけですが、BIツールなどのしっかりした開示ツールがなかったり、あっても目的のデータベースには接続されていなかったり・・・。かといってデータベースへの直接接続を開放してSQLを開示しておく、なんていうわけにもいきません。そんな時に重宝するのが自分専用ETLサーバなんです。
PDIはコミュニティ版ならOSSで料金を気にせず使用できます。ローカルのスタンドアローンで利用するだけでも十分便利なのですが、サーバー立てて常時アクセスできるようにしておくとできることが増えて楽しいです。

環境

  • CentOS7(仮想マシンで大丈夫)
  • Open-JDK 8
  • httpd(apache)
  • PentahoDataIntegration

CentOS7はminimalインストール

yum update
yum install java-1.8.0-openjdk
yum install httpd
systemctl start httpd
systemctl enable httpd
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload

で最新化後Open-JDKとapacheをインストール。
apacheはサービス起動と自動起動を設定しておきます。
ファイアウォールはhttpを開放しておきます。
また、SELinuxは無効化しておきます。(内部向け想定です)

setenforce 0
vi /etc/selinux/config

SELINUX=enforcing
  ↓
SELINUX=disabled

PDIインストール

PDIはこのページからpdi-ce-6.1.0.1-196.zipをダウンロードします。必要に応じてpdi-ce-6.1.0.1-196.zip.sumでダウンロードを検証してください。
pdi-ce-6.1.0.1-196.zipを解凍しできたdata-integrationディレクトリを/opt/配下に移動します。
準備ができたらPDIの起動用スクリプトを作成します。
PDIをサーバとして起動する場合carte.shを使用します。また、起動時の設定ファイルはcarte-config.xmlを指定しました。

carte-config.xmlの作成
/opt/data-integration/pwd/配下に見本になるファイルがありますので参照してください

cd /opt/data-integration
vi carte-config.xml

<slave_config>
    <slaveserver>
      <name>master1</name>
      <hostname>192.168.0.1</hostname>
      <port>9001</port>
      <username>cluster</username>
      <password>cluster</password>
      <master>Y</master>
    </slaveserver>
</slave_config>

ポート番号は他と被らない適切なものを設定
hostnameのIPアドレスは環境に応じて変更
後ほどhttpd経由でアクセスする際にはhostnameをlocalhostに変更する予定

PDIサーバ起動スクリプト

cd /opt/data-integration
vi pdi-server.sh

#!/bin/sh
/opt/data-integration/carte.sh /opt/data-integration/carte-config.xml

実行権限の付与も忘れずに

chmod +x pdi-server.sh

PDIのサービスを作成します

vi /etc/systemd/system/pdi-server.service

[Unit]
Description = Pentaho Data Integration Server
[Service]
ExecStart = /opt/data-integration/pdi-server.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target

作成できたらサービス起動と自動起動の設定

systemctl start pdi-server
systemctl enable pdi-server

起動できたら

http://192.168.0.1:9001

にアクセスしてみる(IPアドレスは自分の環境のものに)
firewallで遮断されていないか要注意

スレーブサーバメニュー
ステータスの表示

というページが表示されればOK

最後にhttpdに転送してポート番号無しで接続する設定
/opt/data-integration/carte-config.xmlの設定を変更

      <hostname>192.168.0.1</hostname>
      ↓
      <hostname>localhost</hostname>

に変更して

systemctl restart pdi-server

でPDIをlocalhostで待ち受けするように変更します。
続いてhttpdの設定

vi /etc/httpd/conf.d/pdiserver.conf

<VirtualHost *:80>
 ServerName 192.168.0.1
 DocumentRoot "/var/www/html"
 <Location />
  ProxyPass  http://localhost:9001/
  ProxyPassReverse  http://localhost:9001/

  SetEnvIf Request_URI "/kettle/executeTrans/?$" HAVE_execTrans
  RequestHeader append Authorization "Basic Y2x1c3RlcjpjbHVzdGVy" env=HAVE_execTrans
 </Location>
</VirtualHost>

httpd.confはvirtualhostの設定をconf.d配下のファイルを読み込むように変更しておいてください。

RequestHeader append Authorization "Basic Y2x1c3RlcjpjbHVzdGVy" 

はPentahoのデータ変換実行時のベーシック認証を回避するために入れたものです
Y2x1c3RlcjpjbHVzdGVy部分が
cluster:clusterをBase64エンコードしたものになります。

設定できたら

systemctl restart httpd

でhttpdを再起動し、

http://192.168.0.1

にアクセス。

スレーブサーバメニュー
ステータスの表示

が無事に表示されれば完了です。

2021/08/15 SELinux停止しないとmod_proxyのProxyPassが動作しなかったため修正

Discussion