3

Greenplum DB に TB の構造化データがあります。データに対して基本的に MapReduce ジョブを実行する必要があります。

このデータが (ストリーミング方式で) メモリに収まるように、少なくとも MapReduce の機能を再実装していることに気付きました。

それから、より完全な解決策を求めて他の場所を探すことにしました。

私は Scala を使用しており、Spark のベンチマークは驚異的であるため、Pivo​​tal HD + Spark を検討しました。しかし、この背後にあるデータストアである HDFS は、Greenplum よりも効率が悪いと思います。(「私は信じる」に注意してください。私が間違っていることを知ってうれしいですが、いくつかの証拠を教えてください。)

そこで、Greenplum ストレージ レイヤーを維持するために、Pivo​​tal の HAWQ を調べました。これは基本的に、Greenplum 上の SQL を使用した Hadoop です。

このアプローチでは多くの機能が失われます。主にSparkの使用。

それとも、組み込みの Greenplum 機能を使用する方がよいのでしょうか?

そのため、どの方法が最善なのかわからないという岐路に立っています。リレーショナル DB モデルに適した TB 規模のデータを処理したいと考えており、Spark と MapReduce の利点を活用したいと考えています。

求めすぎですか?

4

2 に答える 2

6

回答を投稿する前に、私の理解に基づいて(質問を正しく理解していることを確認するために)次のように質問を言い換えたいと思います。

リレーショナル DB モデルに適した TB のデータがあり、ほとんどの場合 SQL を使用してデータをクエリしたい (それが Greenplum DB に入れる理由だと思います) が、Spark と MapReduce を使用してアクセスしたい場合もありますデータは柔軟性があるためです。

私の理解が正しければ、HAWQ を試してみることを強くお勧めします。HAWQ のいくつかの機能により、要件に完全に適合します (注:私は HAWQ の開発者なので、偏見があるかもしれません)。

まず、HAWQ は SQL on Hadoop データベースです。つまり、データストアとして HDFS を採用しています。HAWQ は、Greenplum DB ストレージ層に対応していません。

第二に、「HDFS は Greenplum よりも効率が悪い」ことに反対するのは難しいです。しかし、パフォーマンスの違いは、あなたが思っているほど重要ではありません。HDFS データにアクセスするためのいくつかの最適化を行いました。1 つの例として、1 つのデータ ブロックがローカルに保存されていることがわかった場合、通常の RPC 呼び出しではなく、ディスクから直接読み取ります。

3 番目に、MapReduce 用の HAWQ InputFormat という名前の HAWQ の機能があります (Greenplum DB にはありません)。この機能を使用すると、Spark および MapReduce コードを記述して、HAWQ データに簡単かつ効率的にアクセスできます。Hadoop が提供する DBInputFormat (すべてのデータが最初にマスターを通過するため、マスターがパフォーマンスのボトルネックになります) とは異なり、MapReduce の HAWQ InputFormat では、Spark および MapReduce のコードが HDFS に保存されている HAWQ データに直接アクセスできます。完全に分散されているため、非常に効率的です。

最後に、もちろん、Greenplum DB で行うのと同じように、SQL を使用して HAWQ でデータをクエリすることもできます。

于 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 に答える