hadoop - Apache Spark-SQL 与 Sqoop 基准测试,同时将数据从 RDBMS 传输到 hdfs

标签 hadoop apache-spark-sql sqoop bigdata

我正在处理一个用例,我必须将数据从 RDBMS 传输到 HDFS。我们已经使用 sqoop 完成了这个案例的基准测试,发现我们能够在 6-7 分钟内传输大约 20GB 的数据。

当我尝试使用 Spark SQL 时,性能非常低(1 Gb 的记录需要 4 分钟才能从 netezza 传输到 hdfs)。我正在尝试进行一些调整并提高其性能,但不太可能将其调整到 sqoop 的水平(1 分钟内大约 3 Gb 的数据)。

我同意 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 内部工作和调整的明确答案,也没有得到 sqoop vs spark sql 基准测试。请帮助理解这个问题。

最佳答案

您在工作中使用了错误的工具。

Sqoop 将启动一系列进程(在数据节点上),每个进程都将连接到您的数据库(请参阅 num-mapper),并且每个进程都将提取数据集的一部分。我认为您无法使用 Spark 实现某种读取并行性。

用Sqoop获取数据集,然后用Spark处理。

关于hadoop - Apache Spark-SQL 与 Sqoop 基准测试,同时将数据从 RDBMS 传输到 hdfs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37133322/

相关文章:

postgresql - 为什么连续读取的计数结果不同?

hadoop - 无法关闭文件,因为最后一个 block 没有足够数量的副本

hadoop - 查看hadoop中文件的 block 数

java - 找到不支持的主体 key 类型(8)

java - 检测到逻辑计划之间 INNER 连接的隐式笛卡尔积

python - 加入来自同一来源的两个 DataFrame

hadoop - Lzo 文件不会在配置单元作业中拆分

hadoop - Kite SDK 数据集与 Hive Table 的区别

hadoop - 将Sqoop连接到mysql

mysql - 使用 Oozie 永远运行的 Sqoop 作业