2

スパークのバージョン: 1.4.0 カサンドラのバージョン: 2.1.8

Spark と Cassandra の両方をブリッジするために、datastax Spark Cassandra コネクタを使用しています。6 つの異なるワーカーで実行されている Spark で 6 つのノードを使用しています。これを支援する 2 つの Cassandra ノードがあります。

列ファミリー (CassandraUtil.javaFunctions(sc).cassandraTable("keyspace","columnfamily").count()) 内の行数のカウントを実行するサンプル アプリケーションを試しました。

ここで、この 1 つのジョブをマスターにディスパッチすると、Spark クラスターの 2 つのワーカー ノードでジョブが実行されました (イベント タイムラインから取得)。

質問

  1. 私は単一の仕事を派遣しました。なぜ二人の作業員で行われたのですか?一人の労働者が主人のように振る舞うようなものですか?
  2. 1 人のワーカーで逆シリアル化時間が非常に長いことがわかりました。他のワーカーはかなり速く仕事を完了しました (1 人は 40 秒、2 人は 1 秒かかりました)。これに光を当てることができますか?
  3. どちらのワーカーも Cassandra との接続を確立したようで、結果を返しています。したがって、私の見解では、どちらも同じ仕事をしています。これに光を当てることができますか?
  4. Cassandra を使用したこの分散領域のどこに RDD の実装が適合するのか、私はまだ疑問に思っています。誰かがこれに光を当てることができますか? 複数のワーカーは、Cassandra のどのパーティションで作業する必要があるかをどのように知るのでしょうか? たとえば、6 つのワーカー間で 10,000 のパーティションを分割できる場合はどうすればよいでしょうか? フェッチはすべて1人のワーカーで行い、処理は6人で行うようなものですか?その場合でも、実行ロジックはすべてのワーカー (Cassandra からのフェッチとプロセス) で同じままです。Spark はこれをどのように行いますか?
  5. Cassandra で Spark を使用する本当の利点を知りたいです。それはメモリ管理レベルですか、それとも他の利点がありますか?

編集

ここに画像の説明を入力

走行中の写真を追加しました。10個の異なるパーティションがあります。これは単純なカウント操作です。

私の質問はまだパズルのままです。

添付ファイルをご覧いただければ、お分かりいただけると思います。これは、私のスパークマスターに送信された単一のジョブ用でした。2 つの異なるエグゼキュータでどのように動作するのか不思議です。両方のエグゼキュータが同じバイト数を返しています。つまり、どちらも cassandra から 10 個のパーティションすべてを取得したことがわかります。これが起こる方法である場合、spark は cassandra よりも何を提供してくれますか? または、10 個のパーティションが 2 つの異なるワーカーによってフェッチされるように、別の方法でフェッチする必要がありますか?

4

1 に答える 1

6

Spark と C* について読むのに数時間費やすことをお勧めします。この投稿の最後に、私が選んだいくつかの推奨資料があります。

今のところ、あなたの質問を引き受けさせてください。

私は単一の仕事を派遣しました。なぜ二人の作業員で行われたのですか?一人の労働者が主人のように振る舞うようなものですか?

おそらく、リソースの可用性またはジョブ内のパーティションの量 (おそらく後者) と関係があります。

Russ が言うように、「ジョブの並列処理を増やしてください。ジョブのパーティション数を増やしてみてください。作業を小さなデータ セットに分割することで、特定の時間にメモリに常駐する必要のある情報が少なくなります。Spark Cassandra コネクタの場合これは、分割サイズ変数を減らすことを意味します。」

これを 1.2 で調整するには:

spark.cassandra.input.split.size spark.cassandra.output.batch.size.rows spark.cassandra.output.batch.size.bytes

新しいバージョンでは、spark.cassandra.output.throughput_mb_per_sec もあります。

1 人のワーカーで逆シリアル化時間が非常に長いことがわかりました。他のワーカーはかなり速くジョブを完了しました (1 人は 40 秒、2 人は 1 秒かかりました)。これに光を当てることができますか?

実際に機能を Web UIに追加した Kayから:

「タスクをデシリアライズする時間は、短いジョブのタスク時間に比べて長くなる可能性があり、それがいつ高いかを理解することは、開発者がクロージャのサイズを小さくする必要があることに気付くのに役立ちます (たとえば、タスクの説明に含めるデータを減らすことによって)。」

どちらのワーカーも Cassandra との接続を確立したようで、結果を返しています。したがって、私の見解では、どちらも同じ仕事をしています。これに光を当てることができますか?

Spark は並行して動作します。これは分散コンピューティング パラダイムであるため、並行して動作するエグゼキューターを開始することで、複数のノードと複数のコアを利用できます。どちらのエグゼキュータも C* からデータをプルしますが、パーティショニングに基づいて異なるデータをプルします。

詳細については、いくつかの紹介ビデオを参照してください。

Cassandra を使用したこの分散領域のどこに RDD の実装が適合するのか、私はまだ疑問に思っています。誰かがこれに光を当てることができますか? 複数のワーカーは、Cassandra のどのパーティションで作業する必要があるかをどのように知るのでしょうか? たとえば、6 つのワーカー間で 10,000 のパーティションを分割できる場合はどうすればよいでしょうか? フェッチはすべて1人のワーカーで行い、処理は6人で行うようなものですか?その場合でも、実行ロジックはすべてのワーカー (Cassandra からのフェッチとプロセス) で同じままです。Spark はこれをどのように行いますか?

それぞれが、パーティショニングに基づいて独自のデータをフェッチして処理します。

ジョブがどのように分割されるかに関する情報を取得するには、次を使用します。

rdd.partitions

DSEの場合のように、Spark と Cassandra を同じ場所に配置している場合、データの局所性を利用できます (c* から spark ワーカーにデータをストリーミングする必要はありません)。

Cassandra で Spark を使用する本当の利点を知りたいです。それはメモリ管理レベルですか、それとも他の利点がありますか?

ここにリストするには多すぎると思われます。推奨される読書/視聴を参照してください。ビッグ ヒッターは、バッチおよびストリーミング分析用の SQL スタイルのクエリ (結合、集計、groupby など) + MLLIB を使用した高度な統計モデリング、graphx を使用した分析グラフなどです。

ここに、あなたをスピードアップするための良い資料があります:

これは、Spark と C* で何が可能になるかについての Russ によるハイレベルなプレゼンテーションです: http://www.slideshare.net/planetcassandra/escape-from-hadoop

DSE と Spark の統合方法に関する DataBricks の Sameer による OReily ウェビナー: http://www.oreilly.com/pub/e/3234

コネクタがデータを読み取る方法: https://academy.datastax.com/demos/how-spark-cassandra-connector-reads-data

Spark のトラブルシューティングに関する重要な投稿は、実際に機能させようとしているときに役立ちます。これらは、opps/perf に関する質問のほとんどに答えます: http://www.datastax.com/dev/blog/common-spark-troubleshooting

https://databricks.com/blog/2015/06/16/zen-and-the-art-of-spark-maintenance-with-cassandra.html

Sandy からの 2 つの同様の貴重な投稿 (c* 固有ではない): http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-1/ http ://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/

于 2015-07-22T05:25:27.947 に答える