2016-10-22 7 views
1

私たちは受け取ったものと同じ速さで書かれなければならない非常に大量のデータを消費しており、HDFSを使用しています。データはほとんど構造化されておらず、基本的なクエリはまれにしか実行されません。データは一部のフィールドでフラットで、各行は別のデータを表します。HDFS上の構造化されていないデータ行のデータ格納形式

key1=str key2=30.3 key3=longtexthere 

別のデータ行:

key1=3 key5=abc 

SequenceFileは最も自然なものを見えたが、私は、単一のSequenceFileで複数の行を格納する方法を見つけることができませんでした。

現在、私たちの一時的な解決策では、複数のテキストファイルに書き込む複数のライターがあります。したがって、照会が必要な場合は、照会を並行して行います。しかし、現在のテキストファイルには1000個の行が含まれており、各行のSequenceFileを1つ作成することは実現可能ではないと考えています。クエリを実行するときにメタデータを格納したり、

HBaseやCassandraという柱状データベースを使用することで問題は解決できると思いますが、HDFSをほとんど使用する必要があります。私はSequenceFilesで何かを見逃しているのですか、実際には列データベースを使用する必要がありますか?

+0

固定数のキー/列はありますか? – oae

+0

@oaeいいえ、それらは修正されていませんが、拡張されることはめったにありません。古い列には新しい列が追加されることがあります。 – Mustafa

答えて

1

シーケンスファイルの形式は次のとおりです。 <key, value> <key, value> <key, value> ... ここで、キーはWritableComparableで、値は書き込み可能です。あなたが同じことを行うことができます - - 多くの人々が何をしているか今 は次のとおりです。

  • のみ他Writables(のセットをラップするカスタム書き込み可能を実装するキーまたは値「列」
  • を使用レコード、行などと呼んでください)

これで、あなたが望むすべてのものをモデル化することができます。その書き込み可能なレコードには、 'IntWritable、Text、IntWritable、IntWritable'(あなたのフィールドに応じて)が含まれているような、固定スキーマを持つことができます。または、異なるタイプをサポートしたくない場合は、既存のArrayWritableを「レコード」として使用できます。 各ファイルのスキーマを知っている(例:シーケンスファイルのメタデータに入れておくと、異なる/進化したスキーマを持つファイルを読み込むことができます)。

その手作りはたくさんありますが、柔軟な構造を使用していませんでしたが、http://pangool.net/userguide/schemas.htmlを見て、シーケンスファイルの上に柔軟なレコード/タプルスキーマを既にモデル化していると思います。 しかし、私はParquetまたはORC filesのような円柱ファイルフォーマットも見てみることをお勧めします。それらはそれぞれのトレードオフがありますが、圧縮率が高くなり、 ective reads(列投影、フィルタープッシュダウン)。また、スキーマ/タプル構造を作成する必要もありません。

関連する問題