ブログ
2018/08/20
入力ストリーミングコネクタのレビュー
この記事では、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 Beam | Apache Spark DStreams | ||
ファイルシステム | ローカル ( file:// URIを使用) | TextIO | textFileStream (SparkはほとんどのUnixシステムをHDFS互換として扱いますが、場所はすべてのノードからアクセスできる必要があります) |
HDFS ( hdfs:// URIを使用) | FileIO + HadoopFileSystemOptions | HdfsUtils | |
オブジェクトストレージ | Cloud Storage ( gs:// URIを使用) | FileIO + GcsOptions | hadoopConfiguration and textFileStream |
S3 (`s3://` URIを使用) | FileIO + S3Options | ||
メッセージキュー | Kafka | KafkaIO | spark-streaming-kafka |
Kinesis | KinesisIO | spark-streaming-kinesis | |
Cloud Pub/Sub | PubsubIO | Apache Bahir からのspark-streaming-pubsub | |
その他 | カスタムレシーバー | Read Transforms | receiverStream |
Python用コネクタ
Beamには公式のPython SDKがありますが、現在、Java SDKで利用可能なストリーミング機能のサブセットをサポートしています。2つのSDKの機能セット間のギャップを埋めるための活発な開発が進行中です。現在、Pythonでは、Direct RunnerとDataflow 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 Beam | Apache Spark DStreams | ||
ファイルシステム | ローカル | io.textio | textFileStream |
HDFS | io.hadoopfilesystem | Py4Jを使用したhadoopConfiguration( `sc._jsc` を介してアクセス)およびtextFileStream | |
オブジェクトストレージ | Google Cloud Storage | io.gcp.gcsio | textFileStream |
S3 | N/A | ||
メッセージキュー | Kafka | N/A | KafkaUtils |
Kinesis | N/A | KinesisUtils | |
Cloud Pub/Sub | io.gcp.pubsub | N/A | |
その他 | カスタムレシーバー | BoundedSource and RangeTracker | N/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パイプラインに接続する新しい興味深い方法を試すきっかけになれば幸いです。
詳細については、以下のリンクをご覧ください。