2017-09-05 8 views
0

Pysparkからリモートハイブサーバーに格納されているテーブルを読み書きする必要があります。このリモートハイブについて私が知っているのは、Dockerの下で動作するということだけです。 Iがtableのmetastoreのurlを持っPyspark:リモートハイブウェアハウスロケーション

::Hadoop HueからIがIがからsome dataをselectするtry iris tableため2 urlsをfoundき

http://xxx.yyy.net:8888/metastore/table/mytest/iris 

及びtableのlocationのurl:

hdfs://quickstart.cloudera:8020/user/hive/warehouse/mytest.db/iris 

なぜ最後のURLにquickstart.cloudera:8020が含まれているのかわかりません。これはHiveがDockerの下で動作するからでしょうか?ハイブテーブルPysparkのチュートリアルへのアクセスを議論

は書いている:

https://spark.apache.org/docs/latest/sql-programming-guide.html#hive-tables

をハイブで作業する場合、1は、永続的なハイブメタストアへの接続など、ハイブサポートでハイブのSERDESのサポートをSparkSessionをインスタンス化する必要があり、 Hiveユーザー定義関数既存のHive展開を持たないユーザーは、Hiveサポートを有効にできます。 hive-site.xmlで設定されていない場合、コンテキストは自動的に現在のディレクトリにmetastore_dbを作成し、spark.sql.warehouse.dirで設定されたディレクトリを作成します。デフォルトでは、Sparkアプリケーションが現在のディレクトリにあるディレクトリspark-が開始される。 hive-site.xmlのhive.metastore.warehouse.dirプロパティは、Spark 2.0.0以後廃止予定です。代わりに、spark.sql.warehouse.dirを使用して、ウェアハウス内のデータベースのデフォルトの場所を指定します。 Sparkアプリケーションを起動するユーザーに書き込み権限を与える必要があるかもしれません。私は得ることができた私の場合は

hive-site.xmlhive.metastore.warehouse.dirspark.sql.warehouse.dirもない性質を持っていません。

from os.path import expanduser, join, abspath 

from pyspark.sql import SparkSession 
from pyspark.sql import Row 

    // warehouseLocation points to the default location for managed databases and tables 
val warehouseLocation = new File("spark-warehouse").getAbsolutePath 

spark = SparkSession \ 
    .builder \ 
    .appName("Python Spark SQL Hive integration example") \ 
    .config("spark.sql.warehouse.dir", warehouse_location) \ 
    .enableHiveSupport() \ 
    .getOrCreate() 

そして、私の場合は

は、 warehouseLocationのためではなく、正しい値と、上記のコードに似て実行した後に、私は私が、その後することができると思う:

スパークチュートリアルでは、リモートハイブテーブルにアクセスするには、次のコードを使用することを示唆していますdo:

spark.sql("use mytest") 
spark.sql("SELECT * FROM iris").show() 

ここで、リモートHive倉庫の場所はどこにありますか?リモートHiveテーブルでPysparkを動作させるには?

更新

hive-site.xmlは、次のプロパティがあります。127.0.0.1はClouder]ドッキングウィンドウのアプリを実行しドッカーlocalhostですよう

... 
... 
... 
<property> 
    <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://127.0.0.1/metastore?createDatabaseIfNotExist=true</value> 
    <description>JDBC connect string for a JDBC metastore</description> 
    </property> 
... 
... 
... 
    <property> 
    <name>hive.metastore.uris</name> 
    <value>thrift://127.0.0.1:9083</value> 
    <description>IP address (or fully-qualified domain name) and port of the metastore host</description> 
    </property> 

だから、見えます。 Hive倉庫にまっすぐに行くのを助けません。

Cloudera HiveがDockerアプリとして動作する場合、Hiveウェアハウスにアクセスする方法。

答えて

1

ここhttps://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hive_metastore_configure.html「リモートモード」であなたは、このようなHiveServer2, HCatalog, Cloudera ImpalaなどHive metastoreは独自のJVMプロセスを実行し、他のプロセスがhive-site.xmlで財産hive.metastore.uriを使用してThrift APIを介して通信することがわかります:

<property> 
    <name>hive.metastore.uris</name> 
    <value>thrift://xxx.yyy.net:8888</value> 
</property> 
あまりに

(あなたがアドレスを指定する必要が道わからない)

そしておそらくこのプロパティ:

<property> 
    <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://xxx.yyy.net/hive</value> 
</property> 
+0

Pysparkのドキュメント(私の質問に引用を参照)は、 'ウェアハウス'の場所を指定する必要性について語っています。それはハイブ 'metastore'と同じですか?私の質問への更新をご覧ください。 – dokondr