3

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

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

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

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

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

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

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

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

我要求太多了吗?

4

2 回答 2

6

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

您拥有非常适合关系数据库模型的 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 一样。

于 2015-09-18T07:12:24.070 回答
0

您是否尝试过使用 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"))
}
于 2017-06-30T18:37:42.220 回答