web-dev-qa-db-ja.com

カスタムストリーミングデータソースを作成するにはどうすればよいですか?

Spark WebSocketからデータを読み取るストリーミング用のカスタムリーダーがあります。Spark構造化ストリーミングを試してみます。

Spark構造化ストリーミングでストリーミングデータソースを作成するにはどうすればよいですか?

8
szu

ストリーミングデータソースは org.Apache.spark.sql.execution.streaming.Source を実装します。

org.Apache.spark.sql.execution.streaming.Sourceのscaladocは、始めるのに十分な情報を提供するはずです(型に従ってコンパイル可能なScala型を開発するだけです)。

Sourceを取得したら、それを登録して、formatDataStreamReaderで使用できるようにする必要があります。ストリーミングソースを利用可能にしてformatに使用できるようにする秘訣は、ストリーミングソース用にDataSourceRegisterを作成して登録することです。例は META-INF/services/org.Apache.spark.sql.sources.DataSourceRegister :にあります。

org.Apache.spark.sql.execution.datasources.csv.CSVFileFormat
org.Apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider
org.Apache.spark.sql.execution.datasources.json.JsonFileFormat
org.Apache.spark.sql.execution.datasources.parquet.ParquetFileFormat
org.Apache.spark.sql.execution.datasources.text.TextFileFormat
org.Apache.spark.sql.execution.streaming.ConsoleSinkProvider
org.Apache.spark.sql.execution.streaming.TextSocketSourceProvider
org.Apache.spark.sql.execution.streaming.RateSourceProvider

これは、formatの短い名前を実装にリンクするファイルです。

私のSparkワークショップ中に人々が行うことを通常お勧めするのは、両側から開発を開始することです。

  1. ストリーミングクエリを(formatを使用して)記述します。例:.

    val input = spark
      .readStream
      .format("yourCustomSource") // <-- your custom source here
      .load
    
  2. ストリーミングSourceと対応するDataSourceRegisterを実装します(同じクラスの場合もあります)

  3. (オプション)com.mycompany.spark.MyDataSourceRegisterなどの完全修飾クラス名をMETA-INF/services/org.Apache.spark.sql.sources.DataSourceRegisterに書き込んで、DataSourceRegisterを登録します。

    $ cat META-INF/services/org.Apache.spark.sql.sources.DataSourceRegister
    com.mycompany.spark.MyDataSourceRegister
    

カスタムDataSourceRegisterSource実装を登録する最後のステップはオプションであり、エンドユーザーが使用するデータソースエイリアスを登録するだけです DataFrameReader.format 方法。

format(source:String):DataFrameReader入力データソース形式を指定します。

org.Apache.spark.sql.execution.streaming.RateSourceProvider のコードを確認して、良いスタートを切りましょう。

7
Jacek Laskowski

SparkはV2APIに移行しているため、 DataSourceV2MicroBatchReadSupport 、および DataSourceRegister を実装する必要があります。

これには、OffsetMicroBatchReaderDataReader<Row>、およびDataReaderFactory<Row>の独自の実装の作成が含まれます。

オンライン(Scala)でのカスタム構造化ストリーミングの例がいくつかあります 私の執筆に役立ちました。

カスタムソースを実装したら、ソースの登録でJacekLaskowskiの回答に従うことができます。

また、ソケットから受信するメッセージのエンコーディングによっては、デフォルトのソケットソースを使用し、カスタムマップ関数を使用して、使用するBeanに情報を解析できる場合があります。 Sparkは、デフォルトのソケットストリーミングソースを本番環境で使用すべきではないと言っていることに注意してください!

お役に立てれば!

12
alz2

また、 Here は、Offset, MicroBatchReader, DataReader<Row>およびDataReaderFactory<Row>を実装するカスタムWebSocketストリームリーダー/ライターのサンプル実装です。

0
dumitru