前回のブログでHDFSコンポーネントの使い方を紹介しました。そこにも書きましたが、HDFSコンポーネントは「WebHDFS REST API」を使っています。「REST API」ということであれば、RESTコンポーネントを使えば同じことができるのではないでしょうか?何か違いはあるでしょうか?今回はこれについて説明させていただきます。
RESTコンポーネントを使う
「WebHDFS REST API」を利用して、RESTコンポーネントでHDFSサーバーにファイルをアップロードする方法を紹介します。
次のようなフローを作成します。
まずはFileGetコンポーネントで追加したいファイルを読み込みます。次にRESTコンポーネントでAPIを利用します。プロパティの、「URL」、「パス」、「HTTPメソッド」と「リダイレクトを処理」を上記の画像を参考にして設定してください。そして、API名「op」とユーザー名「user.name」をURLパラメーターとして追加してください。
これで設定終了です。実行するとファイルが無事にアップロードされるはずです。
パフォーマンスの比較
先ほどのフローで大きいファイルをアップロードしてみましょう。テスト環境によりますが、筆者の環境では、400MB以上のファイルをアップロードすると、OutOfMemoryのエラーが発生してしまいました。
これに対して、前回紹介したHdfsPutコンポーネントのフローでは同じファイルを無事にアップロードできます。
次にフローの実行時間を比較してみます。
OutOfMemoryエラーにならない程度のファイルサイズのファイルをアップロード・ダウンロードして、2つのフローの実行時間を比較します。筆者の環境では上述のように400MBのファイルでRESTコンポーネントのフローがエラーになってしまいましたので、今回は200MBのファイルで実行時間を比較しました。
テスト結果(ミリ秒)は次のようになりました:
そして、ダウンロードの場合も、RESTコンポーネントとHdfsGetコンポーネントを比較しました:
アップロード、ダウンロードともにHDFSコンポーネントのフローの方が速いことが分かります。今回は200MBのファイルを使用しましたが、フローサービスに割り当てるメモリが潤沢にある場合には、この何倍ものサイズのファイルでテストすることができると思います。筆者の環境とは別の環境で1GBのファイルをアップロードしてみたところ、HDFSコンポーネントのフローは、RESTコンポーネントのフローの約1/2の時間で処理が終わりました。大きなファイルでテストすると、HDFSコンポーネントの方がパフォーマンスが良いことがよりはっきりと分かりますね。
HDFSを使用するのは、Hadoopで大量のデータを処理するためだと思いますので、フローでアップロードするファイルのファイルサイズは非常に大きくなると考えられます。上記のように、RESTコンポーネントでもフローを作成することはできますが、大きいサイズのファイルをアップロードすると、OutOfMemoryエラーになったり処理時間がかかることが分かります。それに対して、ExperimentalBuildのHDFSコンポーネントを使用すれば大きなファイルも問題なく処理できますしパフォーマンスも良いので非常にメリットがありますね。
それでは、また。