特定のログファイルを GZip 圧縮 RCFile に直接処理するための MapReduce 実装があり、(外部テーブル プロジェクションを介して) Hive に簡単にロードできます。
いずれにせよ、正常に正しく実行され、データをBytesRefArrayWritable
に出力するコードがありますRCFileOutputFormat
。
現在、これをマップのみのジョブとして実行しています。つまり、N 個の入力分割に対して、N 個の出力ファイルを取得します。たとえば、50 個の入力分割の場合、50 個の.rc
拡張子のファイルを取得します。ハイブはこれらのファイルを問題なく一緒に解釈できますが、私の質問は次のとおりです。
1 つのディレクトリに50 個 (いわば N 個)を配置するのが最適ですか? それとも、すべてのデータを含むRCFile
1 つのディレクトリを配置するのが最適ですか? RCFile
私はそれRCFile
が列形式であることを知っているので、IO は特定の列の値でのフィルタリングなどのクエリ用に最適化されています。
上記の 50 個の入力分割の例では、最初のケースでは、MapReduce は 50 個のファイルを開き、問題の列の場所をシークする必要があります。これらの 50 個のファイルが HDFS 全体に分散されることを考えると、この操作を並列化することもできます。2 番目のケース (すべてのデータが 1 つRCFile
) では、MapReduce が 1 つの RCFile で列の値を順次ストリーミングし、50 の異なる結果をつなぎ合わせる必要がなくなると思います...
これについて推論する良い方法はありますか?HDFS ブロックサイズと Hive テーブルの合計サイズの関数ですか?
何か明確にできることがあれば教えてください - 事前に感謝します