2015-09-22 16 views
24

sparkエンジンを使用してハイブとハイブテーブルに正常に接続するスパークアプリケーションがあります。Apache Sparkを使用して複数のHiveストアを照会する

これをビルドするには、アプリケーションのクラスパスにhive-site.xmlを追加しました。スパークはhive-site.xmlを読み取り、そのメタストアに接続します。この方法はsparkのメーリングリストで提案されました。

これまでのところとても良いです。今では2つのハイブストアに接続したいのですが、私のクラスパスに別のhive-site.xmlを追加すると助けになるとは思いません。私はいくつかの記事を参照し、メーリングリストを発声しましたが、これを行う人は見つかりませんでした。

私はこれをどのように達成することができますか?

ありがとうございました。呼ば

ドキュメント:

+2

回避策のちょっとしたアイデア:とにかくHiveデータがHDFSに常駐している場合は、ファイルまたはディレクトリにDataFrameを作成できますか?つまり、sc.wholeTextFiles( 'hdfs:// host/usr/hive/warehouse/mytable') 'はHiveテーブルの内容を表示します。確かに、メタデータの快適性は失われますが、うまくいく可能性があります。 – mehmetminanc

+0

私は自分自身に同じ質問をして、たくさん検索し、スパークのコードを読んでいます - これまでは、少なくとも同じSparkContextでは不可能であるとほとんど確信しています:( –

+0

@ karthik-manchala私はセットアップを試みましたSpark-Hiveを実行してHortonWorks Sandboxを走らせましたが、いくつかのエラーが出ていますが、これで私を助けてくれますか? –

答えて

4

これは、JDBCを使用してリモートデータベースからデータを接続して読み取るSpark SQL機能を使用することで可能と考えています。

徹底的にR & Dを実行した後、JDBCを使用して2つの異なるハイブ環境に接続し、ハイブテーブルをDataFramesとして後で処理するためにSparkにロードすることに成功しました。

環境詳細

のHadoop-2.6.0

アパッチ・ハイブ-2.0.0ビン

火花1.3.1-ビンhadoop2.6

コードサンプル HiveMultiEnvironment。scala

import org.apache.spark.SparkConf 
    import org.apache.spark.sql.SQLContext 
    import org.apache.spark.SparkContext 
    object HiveMultiEnvironment { 
     def main(args: Array[String]) { 
     var conf = new SparkConf().setAppName("JDBC").setMaster("local") 
     var sc = new SparkContext(conf) 
     var sqlContext = new SQLContext(sc) 

// load hive table (or) sub-query from Environment 1 

     val jdbcDF1 = sqlContext.load("jdbc", Map(
      "url" -> "jdbc:hive2://<host1>:10000/<db>", 
      "dbtable" -> "<db.tablename or subquery>", 
      "driver" -> "org.apache.hive.jdbc.HiveDriver", 
      "user" -> "<username>", 
      "password" -> "<password>")) 
     jdbcDF1.foreach { println } 

// load hive table (or) sub-query from Environment 2 

     val jdbcDF2 = sqlContext.load("jdbc", Map(
      "url" -> "jdbc:hive2://<host2>:10000/<db>", 
      "dbtable" -> "<db.tablename> or <subquery>", 
      "driver" -> "org.apache.hive.jdbc.HiveDriver", 
      "user" -> "<username>", 
      "password" -> "<password>")) 
     jdbcDF2.foreach { println } 
     } 
// todo: business logic 
    } 

他のパラメータは、load中にpartitionColumnの設定などのSqlContextを使用して設定することもできます。スパーク参照ドキュメントの 'JDBCに他のデータベース'セクション下に詳細: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html

のEclipseからビルド・パス:

私は

使用を試していない何

enter image description here

環境1のHiveContextと環境2のSqlContextの一覧

これが役に立つと願っています。

+0

これは前に試してみましたが、jdbcアプローチの問題です。作成されたデータフレームから特定の列を選択できませんでした。 –

0

これは、Sparkの現在のバージョンでは可能ではないようです。 Spark RepoのHiveContext codeを読むと、hive.metastore.urisは多くのMetastoresにとって設定可能なものですが、まったく異なるメタストアではなく、同じメタストア全体の冗長性にのみ使用されているようです。ここ

詳しい情報https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

しかし、あなたはおそらくどこかで一斉にそれに取り組むために、データを集計する必要があります。あるいは、各店舗に複数のSpark Contextを作成することもできます。

複数の異なるメタストアに対してhive.metastore.urisを設定できますが、おそらく動作しません。店舗ごとに複数のSparkコンテキストを作成する場合は、spark.driver.allowMultipleContextsを設定してください。ただし、これは一般的にお勧めできません。予期しない結果につながる可能性があります。

+0

詳細を追加しますか? Spark 2.0.0に更新されたのでしょうか? –

関連する問題