シェアする

  • このエントリーをはてなブックマークに追加





【EMR】【pyspark】postgresqlのデータをDataframeに読み込む

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

以前、別のプロジェクトでscalaの方のsparkで

EMRを利用した分散処理基盤の実装というのは行っていました。

今回はpysparkを使用することになったのですが、

いろいろspark時代の知識は有効であったものの、

postgresqlのようなDBを使用するところで

ものすごくハマってしまいました・・・。

サンプルコード

今回は単純なjdbcによるクエリ発行で

Dataframeを作成しています。

queryという変数には実行したいSelect文が格納されている感じです。

エラー内容は・・・

今回うまくいかなかったのは、上記のサンプルを実行したときに

jdbcドライバがみつからないというエラーですね。

pysparkなのにjava?とは思いました笑

今回ハマったポイント

pysparkといっても、pythonがjavaと連携しているだけ(py4j)で、

根っこの部分はjavaで動いているようです。

そうすると、DB接続部分ではpostgresqlのDriver.jarを使用することに

なりますが、そのDriverのjarをexecutorに配布することができなかったのですね。

scalaのときにはsbtにてsparkアプリケーションに依存ライブラリを

同梱していたので、この問題は当時発生していなかったのです。

サイトで検索してみたら・・・

spark-submitのコマンドの引数として、

「–driver-class-path」と「–jars」を指定したらいいよというのは

とてもたくさんヒットしました。

が、今回はこの2つの引数を設定すると、

このエラーが発生しステップエラーとなってしまいました。

解決策

sparkのリファレンスを見てみると、

spark-submitを使う場合、--jars オプションを使って含まれる全てのjarと一緒にアプリケーションのjarが自動的にクラスタに転送されるでしょう。--jarsの後に渡されるURLはカンマで区切られてなければなりません。そのリストはドライバーとexecutorのクラスパス上に含まれます。

と書いてあったので、

–driver-class-pathの引数を外して、–jarsのみにしてみました。

また、ここで指定するjarはS3に格納されているものになります。

これでめでたく動作させることができました。

参考)sparkアプリケーション側のsparkセッション作成

上記の対応ができていれば、sparkアプリケーション側は以下のように

セッション作成するだけで問題ありません。

ですが、ローカルでアプリケーションだけ単体で動かす場合には、

以下のように記載することで動作させることができます。

jdbc_driver_pathにはローカルの絶対パスを指定すればよいです。

ご参考まで。

それでは!!

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。

今風にいうとフルスタックエンジニアということになるのかしら??

→ 詳細プロフィールというか、生い立ちはこちら

→スキルシートをご覧になる場合はこちら

→お仕事のご依頼やお見積りなどお問い合わせはこちらから!

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?