概要: 多重化シナリオがあり、静的に構成された値ではなく、フィールドの変数値 (日付など) に基づいて動的に多重化する方法を知りたいです。
詳細: entityId で区切られた入力があります。使用しているエンティティがわかっているので、典型的な Flume マルチチャネル選択で構成できます。
agent.sources.jmsSource.channels = chan-10 chan-11 # ...
agent.sources.jmsSource.selector.type = multiplexing
agent.sources.jmsSource.selector.header = EntityId
agent.sources.jmsSource.selector.mapping.10 = chan-10
agent.sources.jmsSource.selector.mapping.11 = chan-11
# ...
各チャネルは、個別の HDFSEventSink である「hdfsSink-n」に移動します。
agent.sinks.hdfsSink-10.channel = chan-10
agent.sinks.hdfsSink-10.hdfs.path = hdfs://some/path/
agent.sinks.hdfsSink-10.hdfs.filePrefix = entity10
# ...
agent.sinks.hdfsSink-11.channel = chan-11
agent.sinks.hdfsSink-11.hdfs.path = hdfs://some/path/
agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11
# ...
これにより、エンティティごとにファイルが生成されますが、これで問題ありません。ここで、動的な 2 番目の変数、つまり日付を導入したいと思います。イベントの日付に応じて、エンティティごとに日付ごとにファイルを作成したいと考えています。日付は動的な値であるため、多数のシンクを事前に構成して、それぞれが別のファイルに送信されるようにすることはできません。また、シンクごとに 1 つの HDFS 出力のみを指定できます。
つまり、「Multiple Outputs HDFSEventSink」が必要だったようなものです (Hadoop の MultipleOutputs ライブラリと同様の方法で)。Flume にそのような機能はありますか?
そうでない場合、これを修正または回避するエレガントな方法はありますか? もう 1 つのオプションは、HDFSEventSink を変更することです。これは、イベントごとに「realName」(文字列) を別々に作成することで実装できるようです。