【问题标题】:Greenplum, Pivotal HD + Spark, or HAWQ for TBs of Structured Data?用于 TB 结构化数据的 Greenplum、Pivo​​tal HD + Spark 或 HAWQ?
【发布时间】:2015-12-08 11:34:21
【问题描述】:

我在 Greenplum 数据库中有 TB 的结构化数据。我需要对我的数据运行本质上是 MapReduce 作业。

我发现自己至少重新实现了 MapReduce 的功能,以便这些数据适合内存(以流式方式)。

然后我决定在别处寻找更完整的解决方案。

我查看了 Pivotal HD + Spark,因为我使用的是 Scala,Spark 基准测试令人惊叹。但我相信这背后的数据存储 HDFS 的效率将低于 Greenplum。 (注意“我相信”。我很高兴知道我错了,但请提供一些证据。)

因此,为了与 Greenplum 存储层保持一致,我查看了 Pivotal 的 HAWQ,它基本上是 Greenplum 上带有 SQL 的 Hadoop。

这种方法会丢失很多功能。主要是Spark的使用。

还是只使用内置的 Greenplum 功能更好?

所以我正处于不知道哪种方式最好的十字路口。我想处理非常适合关系数据库模型的 TB 数据,我想要 Spark 和 MapReduce 的好处。

我是不是要求太多了?

【问题讨论】:

    标签: scala hadoop apache-spark greenplum hawq


    【解决方案1】:

    在发布我的答案之前,我想根据我的理解重新表述问题(以确保我正确理解问题)如下:

    您拥有非常适合关系数据库模型的 TB 数据,并且您希望大多数时间使用 SQL 查询数据(我认为这就是您将其放入 Greenplum DB 的原因),但有时您想使用 Spark 和MapReduce 因其灵活性而访问数据。

    如果我的理解是正确的,我强烈建议你试试 HAWQ。 HAWQ 的某些功能使其完全符合您的要求(注意:我可能有偏见,因为我是 HAWQ 的开发人员)。

    首先,HAWQ 是一个 SQL on Hadoop 数据库,这意味着它使用 HDFS 作为其数据存储。 HAWQ 不使用 Greenplum DB 存储层。

    其次,很难反驳“HDFS 的效率将低于 Greenplum”。但性能差异并不像您想象的那么显着。我们对访问 HDFS 数据进行了一些优化。一个例子是,如果我们发现一个数据块存储在本地,我们直接从磁盘读取它,而不是通过正常的 RPC 调用。

    第三,HAWQ 有一个名为 HAWQ InputFormat for MapReduce 的特性(Greenplum DB 没有)。借助该功能,您可以编写 Spark 和 MapReduce 代码来轻松高效地访问 HAWQ 数据。与 Hadoop 提供的 DBInputFormat 不同(这会使 master 成为性能瓶颈,因为所有数据都首先通过 master),MapReduce 的 HAWQ InputFormat 让您的 Spark 和 MapReduce 代码直接访问存储在 HDFS 中的 HAWQ 数据。它是完全分布式的,因此非常高效。

    最后,当然,您仍然可以使用 SQL 通过 HAWQ 查询数据,就像使用 Greenplum DB 一样。

    【讨论】:

    • 感谢您的意见。看来 spark 和 hdfs 是我要走的路。
    • @Lirong Jian 只是好奇你现在的答案是否不同。我注意到 HAWQ 现在将列式存储委托给 Apache Parquet。使用 HAWQ 还有意义吗?
    【解决方案2】:

    您是否尝试过使用 Spark - JDBC 连接器来读取 Spark 数据?

    使用分区列、下限、上限和 numPartitions 将 greenplum 表拆分到多个 Spark 工作人员。

    例如,你可以使用这个例子

    import java.util.Random
    
    import org.apache.spark.sql.SQLContext
    
    import org.apache.spark.{SparkConf, SparkContext}
    
    
    
    object SparkGreenplumApp extends App {
    
      val conf = new SparkConf().setAppName("SparkGreenplumTest")
    
      val sparkContext = new SparkContext(conf)
    
       val sqlContext = new SQLContext(sparkContext)
    
      import sqlContext.implicits._
    
    
     val df = sqlContext.load("jdbc", Map(
        "url" -> "jdbc:postgresql://servername:5432/databasename?user=username&password=*******",
        "dbtable" -> "(select col, col2, col3 where datecol > '2017-01-01' and datecol < '2017-02-02' ) as events",
        "partitionColumn"-> "ID",
        "lowerBound"->"100",
        "upperBound"->"500",
        "numPartitions"->"2",
        "driver" -> "org.postgresql.Driver"))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2018-09-15
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多