Apache Flume は、分散型で信頼性が高く、可用性の高いシステムです。Apache Flume を使用して、大量のログデータを収集、集約、移動し、一元的に保存できます。Flume は JindoSDK を使用して OSS-HDFS にデータを書き込み、`flush()` を呼び出すことでトランザクション書き込みを保証します。このプロセスにより、フラッシュされたデータがすぐに表示され、データが失われないことが保証されます。
前提条件
デプロイメント環境用に ECS インスタンスが作成されていること。詳細については、「インスタンスの作成」をご参照ください。
Hadoop 環境が作成されていること。詳細については、「Hadoop ランタイム環境の作成」をご参照ください。
Apache Flume がデプロイされていること。詳細については、Apache Flume をご参照ください。
OSS-HDFS が有効になっており、それにアクセスする権限があること。詳細については、「OSS-HDFS の有効化」をご参照ください。
手順
ECS インスタンスに接続します。詳細については、「インスタンスへの接続」をご参照ください。
JindoSDK を構成します。
JindoSDK JAR パッケージの最新バージョンをダウンロードします。ダウンロードリンクについては、「GitHub」をご参照ください。
ダウンロードしたインストールパッケージを解凍します。
次のサンプルコードは、
jindosdk-x.x.x-linux.tar.gzパッケージを解凍する方法を示しています。異なるバージョンの JindoSDK を使用する場合は、パッケージ名を実際のパッケージ名に置き換えてください。tar -zxvf jindosdk-x.x.x-linux.tar.gz -C/usr/libJINDOSDK_HOMEを構成します。export JINDOSDK_HOME=/usr/lib/jindosdk-x.x.x-linux export PATH=$JINDOSDK_HOME/bin:$PATHHADOOP_CLASSPATHを構成します。export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${FLUME_HOME}/lib/*重要各ノードで、インストールディレクトリを Flume ルートディレクトリの `lib` フォルダにデプロイし、環境変数を設定します。
FLUME_CLASSPATHを構成します。cp ${FLUME_HOME}/conf/flume-env.sh.template ${FLUME_HOME}/conf/flume-env.sh echo "FLUME_CLASSPATH=/usr/lib/jindosdk-x.x.x-linux/lib/*" >> ${FLUME_HOME}/conf/flume-env.sh
シンクを構成します。
次のサンプルコードは、シンクを構成する方法の例を示しています。
# OSS シンクを構成します。your_bucket を、OSS-HDFS が有効になっているバケットに設定します。 xxx.sinks.oss_sink.hdfs.path = oss://${your_bucket}/flume_dir/%Y-%m-%d/%H # Flume トランザクションで書き込むことができるイベントの最大数。毎回 32 MB を超えるデータをフラッシュすることを推奨します。これにより、全体的なパフォーマンスへの影響を防ぎ、多くのステージングファイルが生成されるのを防ぎます。 # batchSize パラメーターはイベントの数、つまりログエントリの数を指定します。このパラメーターを構成する前に、イベントの平均サイズを評価する必要があります。たとえば、平均サイズが 200 バイトの場合、毎回フラッシュされるデータのサイズが 32 MB であれば、batchSize パラメーターの値は約 160,000 (32 MB / 200 バイト) になります。 xxx.sinks.oss_sink.hdfs.batchSize = 100000 ... # Hadoop 分散ファイルシステム (HDFS) ファイルを時間でパーティション分割するかどうかを指定します。タイムスタンプは整数に切り捨てられます。デフォルト値: true。 xxx.sinks.oss_sink.hdfs.round = true # xxx.sinks.oss_sink.hdfs.round パラメーターを true に設定する場合、xxx.sinks.oss_sink.hdfs.roundUnit パラメーターを構成する必要があります。たとえば、xxx.sinks.oss_sink.hdfs.roundUnit パラメーターを minute に、xxx.sinks.oss_sink.hdfs.roundValue パラメーターを 60 に設定すると、データは 60 分以内にファイルに書き込まれます。これは、60 分ごとにファイルを生成することと同じです。 xxx.sinks.oss_sink.hdfs.roundValue = 15 # 時間パーティションで使用される時間単位。デフォルト値: minute。有効な値: second、minute、hour。 xxx.sinks.oss_sink.hdfs.roundUnit = minute # HDFS フォルダ内に Apache Flume によって生成される新しいファイルの固定プレフィックス。 xxx.sinks.oss_sink.hdfs.filePrefix = your_topic # 新しいファイルの作成をトリガーするファイルサイズ。ファイルサイズに達するたびに、システムは新しいファイルを作成します。単位: バイト。値 0 は、ファイルサイズに基づいてファイルが分割されないことを指定します。 xxx.sinks.oss_sink.rollSize = 3600 # 各シンクインスタンスで HDFS IO 操作を実行するために有効にするスレッド (open や write など) の数。 xxx.sinks.oss_sink.threadsPoolSize = 30 ...シンク構成パラメーターの詳細については、「Apache Flume」をご参照ください。
よくある質問
「org.apache.flume.conf.ConfigurationException: Component has no type. Cannot configure.user_sink」というエラーメッセージが返された場合の対処方法
この問題を解決するには、Hadoop の core-site.xml 構成ファイルに次の構成を追加します。
<!-- JindoOSS の実装クラスを構成します。 -->
fs.AbstractFileSystem.oss.impl com.aliyun.jindodata.oss.OSS
fs.oss.impl com.aliyun.jindodata.oss.OssFileSystem
<!-- AccessKey ペアとエンドポイントを構成します。 -->
fs.oss.credentials.provider com.aliyun.jindodata.auth.SimpleAliyunCredentialsProvider
fs.oss.accessKeyId LTAI********
fs.oss.accessKeySecret KZo1********
fs.oss.endpoint {regionId}.oss-dls.aliyuncs.com