2017-03-29 16 views
1

私は州/地域についての静的メタデータを使用するsparkプロジェクトを持っています。現在のところ、データは次のようにハードコードされています。Apache Sparkで静的データを読み込む最良の方法

object RegionUtil { 
    val regionNames = Map("US-AL" -> "ALABAMA", 
        "US-AK" -> "ALASKA", 
        "US-AZ" -> "ARIZONA", 
        "US-AR" -> "ARKANSAS", 
        "US-CA" -> "CALIFORNIA", 
        "US-CO" -> "COLORADO", 
        // ... etc 
        "US-WY" -> "WYOMING") 
} 

次に、リージョンマッピングはRegionUtilのマップから単純に検索されます。これは単なる例であり、アプリケーションが依存している多くの同様の静的マッピングがあるためです。

しかし、このメタデータの一部は時折(めったに)更新されず、MySQLデータベースで既に管理されています。私がしたいことは、最初にスパークが起動したときにそのデータをロードしてから、その時点からそのデータのキャッシュされたコピーを(各スレーブノードが独自のコピーを維持しながら)理想的にはメタデータにアクセスする必要があるときにルックアップすることです。

どのように達成できるか知っていますか?

答えて

1

あなたは、この目的のためにbroadcastingに見てみたい:

放送変数は、プログラマではなく、タスクとそのコピーを出荷より各マシン上の読み取り専用変数キャッシュしておくことができます。たとえば、すべてのノードに大量の入力データセットのコピーを効率的に与えるために使用できます。 Sparkはまた、効率的なブロードキャストアルゴリズムを使用してブロードキャスト変数を配布して通信コストを削減しようとしています。

そして、彼らのコード例:

val broadcastVar = sc.broadcast(Array(1, 2, 3)) 
+0

有望です。 –

0

あなたが作成した場合/火花を使用せずに構造を更新(例えば、直接または任意のスリックまたはJDBCを使用して)あなたが火花特定のコードとデータを保持している値を書き込む前に、スパークコードで使用され、スパークがシリアル化してブロードキャストします。

スパークジョブの実行中にこれらを更新する必要がある場合は、ブロードキャストを使用する必要があります。

関連する問題