2017-09-18 17 views

答えて

0

あなたが1以上にspark.executor.coresを設定する場合は、[はい、そしてあなたのエグゼキュータは、複数の並列スレッドを持つことになります、はい、私はmutliple JDBCが接続され、その後の推測では、どのようにスパークエグゼキュータは、コードを実行しますか?

2

を開かれますか

オープンソースの美しさであるApache Sparkプロジェクトには、コードを見て自分で答えを見つけることができます。これが答えを見つけるのに最適で唯一の方法だとは限りませんが、コード自体と同じくらい明確ではないかもしれません(逆も可能です:))

Executor

複数のスレッドが実行されていますか?

はい。 this lineを参照してください。Executorは、新しいTaskRunnerを作成します。これはJavaのRunnable(別のスレッド)です。そのRunnableexecuted on the thread poolになる予定です。スパークは、スレッドプールに使用するJavaのExecutors.newCachedThreadPoolを引用

は、必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、彼らが用意されていたときに、以前に構築されたスレッドを再利用し、作成するために提供ThreadFactoryを使用しています必要に応じて新しいスレッド。

「はい」の場合は、RDBMSからデータを読み書きするために複数のJDBCが開きますか?

私はすでに答えを知っていると確信しています。はい、それは複数の接続を開き、なぜforeachPartition操作を使用して_ "このデータセットの各パーティションに関数fを適用する必要がありますか?" (RDDにも同じ)と何らかの種類の接続プールがあります。

0

ローカルでsparkを実行すると簡単にテストできます。

val conf = new SparkConf() 
      .setMaster("local[2]") 
      .setAppName("JDBCTest") 
val sc = new SparkContext(conf) 

上記のsnippet local [2]は、2つのスレッドを意味します。 RDDの処理中にJDBC接続を開くと、sparkは各タスクに対してこれを行います。

スパークは設計上、スパークで並列実行されるため、スパークはメモリ内タスクの実行においてより効率的です。最初は、RDDごとにJDBC接続を開く必要があるコードを書く必要はありません。処理のために、以下のスニペットを参照してください。

Dataset<Row> jdbcDF = spark.read().format("jdbc").option("url", mySQLConnectionURL) 
     .option("driver", MYSQL_DRIVER).option("dbtable", sql).option("user", userId) 
     .option("password", dbpassword).load(); 

乾杯!

関連する問題