入力ストリーミングコネクタのレビュー

この記事では、Apache Beamにおける入力ストリーミングコネクタのサポートの現状について説明します。さらに、Apache Sparkにおける対応するサポートの現状についても説明します。

バッチ処理では、データベースシステムを含むあらゆるソースからデータを読み込むことができます。これらのデータベースシステムに特化したSDKがない場合でも、多くの場合、JDBCドライバを使用することができます。ストリーミングでは、一般的に利用可能なソースの種類が少ないため、適切なデータパイプラインを実装することは間違いなくより困難です。そのため、この記事では特にストリーミングユースケースに焦点を当てています。

Java用コネクタ

Beamには公式のJava SDKがあり、ランナーと呼ばれる複数の実行エンジンがあります。ほとんどの場合、Spark Runnerを使用することで、JavaまたはScalaで記述された既存のBeamパイプラインをSpark環境に比較的簡単に移行できます。

SparkはScalaで記述されており、Java APIを備えています。SparkのソースコードはJavaバイトコードにコンパイルされ、バイナリはJava仮想マシンによって実行されます。ScalaコードはJavaと相互運用可能であるため、Javaライブラリとネイティブに互換性があります(逆も同様です)。

Sparkは、ストリーミングに2つのアプローチを提供しています。離散化ストリーミング(またはDStreams)と構造化ストリーミングです。DStreamsは、Resilient Distributed Datasets(またはRDD)の連続シーケンスを表す基本的な抽象化です。構造化ストリーミングは、より最近導入されたもので(アルファリリースはSpark 2.1.0に付属)、ライブデータがテーブル構造に継続的に追加されるモデルに基づいています。

Spark Structured Streamingは、ストリーミング入力として、ファイルソース(ローカルファイルシステムとCloud StorageやS3などのHDFS互換システム)とKafkaをサポートしています。Sparkは、KafkaやFlumeなどのサードパーティサービス向けのDStreams用の組み込みコネクタを維持しており、他のコネクタは、以下の表に示すように、外部依存関係をリンクすることで利用できます。

以下は、JavaでBeamおよびSpark DStreamsで使用可能な主なストリーミング入力コネクタです。

Apache BeamApache Spark DStreams
ファイルシステムローカル
file:// URIを使用)
TextIOtextFileStream
(SparkはほとんどのUnixシステムをHDFS互換として扱いますが、場所はすべてのノードからアクセスできる必要があります)
HDFS
hdfs:// URIを使用)
FileIO + HadoopFileSystemOptionsHdfsUtils
オブジェクトストレージCloud Storage
gs:// URIを使用)
FileIO + GcsOptionshadoopConfiguration and textFileStream
S3
(`s3://` URIを使用)
FileIO + S3Options
メッセージキューKafkaKafkaIOspark-streaming-kafka
KinesisKinesisIOspark-streaming-kinesis
Cloud Pub/SubPubsubIOApache Bahir からのspark-streaming-pubsub
その他カスタムレシーバーRead TransformsreceiverStream

Python用コネクタ

Beamには公式のPython SDKがありますが、現在、Java SDKで利用可能なストリーミング機能のサブセットをサポートしています。2つのSDKの機能セット間のギャップを埋めるための活発な開発が進行中です。現在、Pythonでは、Direct RunnerDataflow Runnerがサポートされており、バージョン2.5.0いくつかのストリーミングオプションがベータ版で導入されました。

Sparkには、PySparkと呼ばれるPython SDKもあります。前述のように、ScalaコードはJVMによって実行されるバイトコードにコンパイルされます。PySparkは、PythonプログラムがJVMと対話し、Javaライブラリにアクセスし、Javaオブジェクトと対話し、Javaからコールバックを登録できるようにするライブラリであるPy4Jを使用します。これにより、PySparkはRDDなどのネイティブSparkオブジェクトにアクセスできます。Spark Structured Streamingは、ストリーミング入力として、ファイルソース(ローカルファイルシステムとCloud StorageやS3などのHDFS互換システム)とKafkaをサポートしています。

以下は、PythonでBeamおよびSpark DStreamsで使用可能な主なストリーミング入力コネクタです。

Apache BeamApache Spark DStreams
ファイルシステムローカルio.textiotextFileStream
HDFSio.hadoopfilesystemPy4Jを使用したhadoopConfiguration( `sc._jsc` を介してアクセス)およびtextFileStream
オブジェクトストレージGoogle Cloud Storageio.gcp.gcsiotextFileStream
S3N/A
メッセージキューKafkaN/AKafkaUtils
KinesisN/AKinesisUtils
Cloud Pub/Subio.gcp.pubsubN/A
その他カスタムレシーバーBoundedSource and RangeTrackerN/A

他の言語用コネクタ

Scala

ScalaコードはJavaと相互運用可能であるため、Javaライブラリとネイティブに互換性があります(逆も同様です)。そのため、上記のJavaコネクタをScalaプログラムで使用できます。Apache Beamには、Spotifyによってオープンソース化されたScala APIもあります。

Go

Apache BeamのGo SDKは活発に開発中です。現在は実験段階であり、本番環境での使用は推奨されていません。Sparkには公式のGo SDKがありません。

R

Apache Beamには公式のR SDKがありません。Spark Structured StreamingはR SDKでサポートされていますが、ストリーミング入力としてはファイルソースのみがサポートされています。

次のステップ

この記事が、ストリーミングソースをBeamパイプラインに接続する新しい興味深い方法を試すきっかけになれば幸いです。

詳細については、以下のリンクをご覧ください。

  • Apache Beamのすべての組み込みおよび開発中のI/O変換の完全なリストをご覧ください。
  • Apache Beamモバイルゲームパイプラインのについて学習します。