web-dev-qa-db-ja.com

sparkからリモートHiveサーバーに接続する方法

sparkローカルで実行していて、リモートHadoopクラスターにあるHiveテーブルにアクセスしたい。

SPARK_HOMEでビーラインを呼び出して、Hiveテーブルにアクセスできます。

[ml@master spark-2.0.0]$./bin/beeline 
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:Hive2://remote_Hive:10000
Connecting to jdbc:Hive2://remote_Hive:10000
Enter username for jdbc:Hive2://remote_Hive:10000: root
Enter password for jdbc:Hive2://remote_Hive:10000: ******
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/ml/spark/spark-2.0.0/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
16/10/12 19:06:39 INFO jdbc.Utils: Supplied authorities: remote_Hive:10000
16/10/12 19:06:39 INFO jdbc.Utils: Resolved authority: remote_Hive:10000
16/10/12 19:06:39 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:Hive2://remote_Hive:10000
Connected to: Apache Hive (version 1.2.1000.2.4.2.0-258)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:Hive2://remote_Hive:10000>

sparkからプログラムでリモートHiveテーブルにアクセスするにはどうすればよいですか?

14
April

JDBCは不要です

Sparkは、HiveServer2経由ではなく、Hiveメタストアに直接接続します。これを構成するには、

  1. classpathに_Hive-site.xml_を配置し、Hiveメタストアがホストされている場所に_Hive.metastore.uri_ sを指定します。 SparkSQLでプログラムでHiveメタストアに接続する方法 も参照してください。

  2. Hiveテーブルに対してSQLクエリを実行できるため、_org.Apache.spark.sql.Hive.HiveContext_をインポートします。

  3. val sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc)を定義

  4. sqlContext.sql("show tables")を検証して、動作するかどうかを確認します

HiveテーブルのSparkSQL

結論:jdbcの方法で行かなければならない場合

ご覧ください Apache spark Apache Hiveとリモートで接続します。

Beelineもjdbcを介して接続することに注意してください。あなたのログから、それは明らかです。

[ml @ master spark-2.0.0] $。/ bin/beeline Beelineバージョン1.2.1.spark2 by Apache Hive beeline>!connect jdbc:Hive2:// remote_Hive:10000

jdbc:Hive2:// remote_Hive:10000への接続

ぜひご覧ください 興味深い記事

  • 方法1:JDBCを使用してテーブルをSparkにプルする
  • 方法2:Spark JdbcRDDとHiveServer2 JDBCドライバーを使用する
  • 方法3:クライアント側でデータセットを取得し、RDDを手動で作成する

現在、HiveServer2ドライバーでは「スパークリング」メソッド1および2を使用できません。メソッド3のみに依存できます

以下は、コードスニペットの例ですが、それを実現できます

1つのHadoopクラスター(別名「リモート」)から別のHadoopクラスターへのデータのロード(my Spark lives aka "domestic") HiveServer2 JDBC接続を介して

_import Java.sql.Timestamp
import scala.collection.mutable.MutableList

case class StatsRec (
  first_name: String,
  last_name: String,
  action_dtm: Timestamp,
  size: Long,
  size_p: Long,
  size_d: Long
)

val conn: Connection = DriverManager.getConnection(url, user, password)
val res: ResultSet = conn.createStatement
                   .executeQuery("SELECT * FROM stats_201512301914")
val fetchedRes = MutableList[StatsRec]()
while(res.next()) {
  var rec = StatsRec(res.getString("first_name"), 
     res.getString("last_name"), 
     Timestamp.valueOf(res.getString("action_dtm")), 
     res.getLong("size"), 
     res.getLong("size_p"), 
     res.getLong("size_d"))
  fetchedRes += rec
}
conn.close()
val rddStatsDelta = sc.parallelize(fetchedRes)
rddStatsDelta.cache()




 // Basically we are done. To check loaded data:

println(rddStatsDelta.count)
rddStatsDelta.collect.take(10).foreach(println)
_
16
Ram Ghadiyaram

Hive-ste.xml設定をSPARK=に提供した後、およびHive Metastoreサービスを開始した後、

2つのことをする必要があります設定済み in SPARK= Hiveへの接続中のセッション:

  1. Spark SQLはthriftを使用してHive metastoreに接続するため、Spark=セッションを作成するときにthriftサーバーuriを提供する必要があります。
  2. Hive Metastore warehouseこれは、Spark SQLがテーブルを保持するディレクトリです。'Hive.metastore.warehouseに対応するプロパティ 'spark.sql.warehouse.dir'を使用します。 .dir '(これはSpark 2.0)で非推奨になったため)

何かのようなもの:

    SparkSession spark=SparkSession.builder().appName("Spark_SQL_5_Save To Hive").enableHiveSupport().getOrCreate();
    spark.sparkContext().conf().set("spark.sql.warehouse.dir", "/user/Hive/warehouse");
    spark.sparkContext().conf().set("Hive.metastore.uris", "thrift://localhost:9083");

これがお役に立てば幸いです!!

0
Amardeep Kohli