我在Greenplum DB中有数DB的结构化数据。我需要在我的数据上运行本质上是MapReduce作业的东西。
我发现自己至少重新实现了MapReduce的功能,以便这些数据可以放入内存中(以流式方式)。
然后我决定到其他地方寻找更完整的解决方案。
我考虑了Pivotal HD + Spark,因为我正在使用Scala,而Spark基准测试是一个令人惊叹的因素。但我认为这背后的数据存储区HDFS的效率将低于Greenplum。(请注意“我相信”。我很高兴知道我错了,但请提供一些证据。)
因此,为了与Greenplum存储层保持一致,我研究了Pivotal的HAWQ,它基本上是Greenplum上的Hadoop和SQL。
使用这种方法会丢失很多功能。主要是Spark的使用。
还是只使用内置的Greenplum功能更好?
因此,我正处在不知道哪种方式是最好的十字路口。我想要处理适合关系数据库模型的DB级数据,我想要Spark和MapReduce的好处。
我的要求是不是太高了?
发布于 2015-09-18 15:12:24
在发布我的答案之前,我想根据我的理解重新表述问题(以确保我正确理解了问题),如下所示:
您有大量适合关系数据库模型的数据,并且希望在大多数情况下使用SQL语句查询数据(我认为这就是将其放到Greenplum DB中的原因),但有时您希望使用Spark和MapReduce来访问数据,因为它们具有灵活性。
如果我的理解是正确的,我强烈建议您尝试使用HAWQ。HAWQ的一些特性使其完全符合您的需求(注意:我可能有偏见,因为我是HAWQ的开发人员)。
首先,HAWQ是Hadoop数据库上的SQL,这意味着它使用HDFS作为其数据存储。HAWQ不支持Greenplum DB存储层。
其次,"HDFS的效率将低于Greenplum“的说法是无可争辩的。但性能差异并不像您想象的那样显著。我们对访问HDFS数据进行了一些优化。一个例子是,如果我们发现一个数据块存储在本地,我们直接从磁盘读取它,而不是通过正常的RPC调用。
第三,HAWQ有一个用于MapReduce的名为HAWQ InputFormat的特性( Greenplum DB没有)。使用该特性,您可以编写Spark和MapReduce代码来轻松高效地访问HAWQ数据。不同于Hadoop提供的DBInputFormat (主机会成为性能瓶颈,因为所有数据都会先经过主机),MapReduce的HAWQ InputFormat可以让你的Spark和MapReduce代码直接访问存储在HDFS中的HAWQ数据。它是完全分布式的,因此非常高效。
最后,当然,您仍然可以使用SQL通过HAWQ查询数据,就像使用Greenplum DB一样。
发布于 2017-07-01 02:37:42
您是否尝试过使用Spark - JDBC连接器读取Spark数据?
使用分区列、下界、上界和numPartitions在多个Spark worker之间拆分greenplum表。
例如,您可以使用以下示例
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"))
}https://stackoverflow.com/questions/32531383
复制相似问题