RDBMSからHDFSにデータを転送する必要がある場合に取り組んでいます。 sqoopを使用してこのケースのベンチマークを行い、6〜7分で約20GBのデータを転送できることが分かりました。RDBMSからhdfsにデータを転送する際のApache Spark-SQLとSqoopのベンチマーク
Spark SQLで同じことをしようとすると、パフォーマンスは非常に低くなります(レコードの1GbがNetezzaからhdfsに転送するのに4分かかる)。チューニングを行い、パフォーマンスを向上させようとしていますが、1平方インチ(約3Gbのデータで約1分)のレベルにチューニングする可能性は低いです。
sparkは主に処理エンジンですが、私の主な質問は、sparkとsqoopの両方が内部的にJDBCドライバを使用していることです。なぜ性能に大きな差があるのでしょうか? 。私はここに私のコードを掲載しています。
object helloWorld {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Netezza_Connection").setMaster("local")
val sc= new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.read.format("jdbc").option("url","jdbc:netezza://hostname:port/dbname").option("dbtable","POC_TEST").option("user","user").option("password","password").option("driver","org.netezza.Driver").option("numPartitions","14").option("lowerBound","0").option("upperBound","13").option("partitionColumn", "id").option("fetchSize","100000").load().registerTempTable("POC")
val df2 =sqlContext.sql("select * from POC")
val partitioner= new org.apache.spark.HashPartitioner(14)
val rdd=df2.rdd.map(x=>(String.valueOf(x.get(1)),x)).partitionBy(partitioner).values
rdd.saveAsTextFile("hdfs://Hostname/test")
}
}
私は他の多くの記事をチェックしているが、sqoopの内部作業とチューニングのための明確な答えを得ることができませんでしたも、私はこの問題を理解する上で.KindlyヘルプをベンチマークスパークSQL対sqoopました。
私を助けた: - あなたのコメントをありがとう、私はここに私の会社の糸のURLを投稿することができませんでしたbecoz ..私は私のコードでは、「ローカル」としてマスターを与えています。..実際に私は糸のクラスターでこれを実行していました。また、14の並列性は、hdfsにデータを書き込んでいる間ではなく、読み込み中ではなく、達成されています。読み込み中に、全体の処理が非常に遅くなっているSQLデータベースから読み取るスレッドは1つだけです。この場合、私はマルコポーロの答えが正しいと思います。これは私の見解です。私が何か不足している場合に備えて私を修正してください。ありがとう。 –
ジョブに割り当てられているエグゼクティブはいくつですか?あなたは火花のUIを使用して確認できますか? – bigdatamann