Scala Greenplum,Pivotal HD+;Spark或HAWQ用于结构化数据的TBs?

Scala Greenplum,Pivotal HD+;Spark或HAWQ用于结构化数据的TBs?,scala,hadoop,apache-spark,greenplum,hawq,Scala,Hadoop,Apache Spark,Greenplum,Hawq,我在Greenplum数据库中有TBs的结构化数据。我需要在我的数据上运行MapReduce作业 我发现自己至少重新实现了MapReduce的功能,以便这些数据能够放入内存(以流式方式) 然后我决定到别处寻找一个更完整的解决方案 我看了Pivotal HD+Spark,因为我使用的是Scala,Spark基准是一个令人惊叹的因素。但我相信这背后的数据存储HDFS的效率将低于Greenplum。(注意“我相信”。我很高兴知道我错了,但请提供一些证据。) 所以为了保持Greenplum存储层,我看了

我在Greenplum数据库中有TBs的结构化数据。我需要在我的数据上运行MapReduce作业

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

然后我决定到别处寻找一个更完整的解决方案

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

所以为了保持Greenplum存储层,我看了Pivotal的HAWQ,它基本上是Greenplum上带有SQL的Hadoop

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

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

所以我正处在不知道哪条路最好的十字路口。我想处理符合关系数据库模型的TBs数据,并且我希望Spark和MapReduce的好处


我要求的太多了吗?

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

您有TB的数据非常适合关系数据库模型,并且您希望在大多数情况下使用SQL查询数据(我认为这就是为什么您将其放入Greenplum DB中的原因),但有时您希望使用Spark和MapReduce访问数据,因为它们具有灵活性

如果我的理解是正确的,我强烈建议您尝试一下HAWQ。HAWQ的一些特性使它完全符合您的需求(注意:我可能有偏见,因为我是HAWQ的开发人员)

首先,HAWQ是Hadoop数据库上的SQL,这意味着它使用HDFS作为其数据存储。HAWQ与Greenplum DB存储层不兼容

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

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


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

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

使用分区列、下限、上限和numPartitions将greenplum表拆分为多个Spark Worker

例如,您可以使用此示例

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"))
}
import java.util.Random
导入org.apache.spark.sql.SQLContext
导入org.apache.spark.{SparkConf,SparkContext}
对象SparkGreenplumApp扩展应用程序{
val conf=new SparkConf().setAppName(“SparkGreenplumTest”)
val sparkContext=新的sparkContext(conf)
val sqlContext=新的sqlContext(sparkContext)
导入sqlContext.implicits_
val df=sqlContext.load(“jdbc”,Map(
“url”->“jdbc:postgresql://servername:5432/databasename?user=username&password=*******",
“dbtable”->(选择col、col2、col3,其中datecol>'2017-01-01'和datecol<'2017-02-02')作为事件,
“分区列”->“ID”,
“lowerBound”->“100”,
“上限”->“500”,
“数字部分”->“2”,
“驱动程序”->“org.postgresql.driver”))
}

谢谢您的意见。看来spark和hdfs是我的选择。@Lirong Jian只是好奇你现在的答案是否不同。我注意到HAWQ现在将柱状存储委托给apacheparquet。使用HAWQ还有意义吗?