19

[このセクション]で説明されているように、Spark SQL に一時テーブルを登録しました。

people.registerTempTable("people")
// I can run queries on it all right.
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")

ここで、JDBC を介してこのテーブルにリモートでアクセスしたいと考えています。[この別のセクション]で説明されているように、Thrift サーバーを起動します。

./sbin/start-thriftserver.sh --master spark://same-master-as-above:7077

しかし、テーブルは表示されません。

0: jdbc:hive2://localhost:10000> show tables;         
+---------+
| result  |
+---------+
+---------+
No rows selected (2.216 seconds)

SqlContextこれは、テーブルが「一時的」(つまり、オブジェクトの存続期間に関連付けられている) であるためだと思います。しかし、非一時テーブルを作成するにはどうすればよいでしょうか?

Thrift サーバーを介してHive テーブルを表示できますが、このような RDD を公開する方法がわかりません。できないことを示唆するコメントを見つけました。

それとも、独自のアプリケーションで Thrift Server を実行する必要がありますSqlContextか? その周りのほとんどすべてのクラスはprivateであり、このコードは Maven Central にはありません (私が見る限り)。私は使用することになっていますHiveThriftServer2.startWithContextか?文書化されて@DeveloperApiいませんが、機能する可能性があります。

4

4 に答える 4

17

ほとんどの場合、この問題は既に解決済みです。しかし、私は最近、同様のユース ケースを試し、その結果を共有したいと思いました。JDBC 経由で Spark データを公開するには、次の手順を実行する必要があります。

  • Spark に付属の thrift-server を起動します (私はバージョン 1.3.1 を使用しました)。Hive を使用した thrift-server も同様に機能する可能性がありますが、テストしていません。

    /opt/mapr/spark/spark-1.3.1/sbin/start-thriftserver.sh --master spark://spark-master:7077 --hiveconf hive.server2.thrift.bind.host spark-master --hiveconf hive.server2.trift.port 10001

「localhost」ではなく、サーバーの実際のIPアドレス/ dnsnameを「hive.server2.thrift.bind.host」に指定してください。そうしないと、別のホストからこのthriftサーバーに接続できません

  • beeline は、Hive と Spark に付属する単純な JDBC クライアントです。beeline を起動して、thrift サーバーに接続します

SPARK_HOME/bin/ビーライン

beeline> !connect jdbc:hive2://spark-master:10001

  • ここで任意の hiveql を使用して、必要なデータをテーブルにロードできますが、SQL は Spark クラスターで実行されます。

    org.apache.spark.sql.parquet オプション (パス 'maprfs:///path-to-your-parquet-files/') を使用して、一時テーブルのツイートを作成します。

  • テーブルをスパークメモリにキャッシュする

キャッシュ テーブルのツイート

  • これで、すべてのデータが Spark クラスターにキャッシュされ、リモート jdbc を介して低レイテンシーでクエリを実行できるようになりました

  • jdbc コーディングは、Hive jdbc コードを記述するのとまったく同じです。thrift サーバーは hiveql を理解し、それを変換して SQL の背後に火をつけるためです。ハイブ jdbc の例については、こちらをご覧ください。

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLs

ユーザー名については、thrift-server マシンで任意の Linux ユーザー名を指定し、パスワードを空白のままにすることができます (これは非セキュア モードです。必要に応じて、よりセキュアにすることができます)。

  • テーブルはハイブメタストアに登録されていないため、テーブル「つぶやき」は「テーブルの表示」などでは表示されませんが、jdbc を介してテーブルですべての SQL クエリを実行できます。

  • Spark を使用してデータをメモリにキャッシュし、リモートの jdbc/odbc でクエリを実行できます。これにより、低レイテンシーの応答が得られます。約 40 GB のデータ サイズに対して 2 秒未満の応答が得られました。ただし、キャッシングは、テラバイトなどの非常に大きなデータには機能しません。その場合、「cache table ...」コマンドを避け、リモート jdbc/odbc を引き続き使用できますが、応答は低レイテンシーの範囲にはなりません。

ではごきげんよう!

MK

于 2015-07-10T15:07:01.140 に答える
4

を変更spark-defaults.confして追加しspark.sql.hive.thriftServer.singleSession trueます。

これにより、Thrift サーバーは、テーブルを保存することなく、RDD に直接基づいて一時テーブルを参照できます。CACHE TABLE XXX AS <query>また、Spark SQL で実行して、ODBC/JDBC 経由で公開することもできます。

于 2016-08-25T16:09:16.433 に答える
3

一時テーブルの背後にある一般的な考え方は、少なくとも元の RDBMS の意図からは、スコープが非常に限定されており、通常はユーザー セッションであり、セッションが終了するとスコープ外になり、クリーンアップされるということです。

あるセッションで一時テーブルを作成すると、JDBC または ODBC を介して thriftserver に接続する別のセッションはそれを見ることができなくなります。これは仕様によるものです。セッションを超えて保持するテーブルが必要な場合、それは定義上一時的ではありません。

「spark.sql.hive.thriftServer.singleSession を有効にして SQL クライアントと共有する」ように提案されたソリューションは有効ですが、マルチセッション環境の目的を無効にします。単一のセッションを設定すると、Hive メタストアが再起動した場合にコンテキストから外れることを除いて、一時テーブルが永続テーブルとして動作するように効果的に強制されます。

SqlContext を使用して CREATE TABLE を実行するか、saveAsTable() を使用するのは簡単です

編集、spark 1.3のドキュメントではsaveAsTableが最初に言及されているようですが、以前のバージョンを使用している場合はinlineSQLメソッドを使用できます。

people.write.saveAsTable("people")

これにより、既定のデータベースに people テーブルが保持されます。最初にデータベースを作成して指定することをお勧めします。

people.write.saveAsTable("databaseName.people")

またはインライン SQL を使用

sqlContext.sql("CREATE TABLE IF NOT EXISTS people
as SELECT name FROM people WHERE age >= 13 AND age <= 19")

これらの方法は両方とも、Hive メタストアに永続テーブルを登録します。saveAsTable には、追加するか上書きするかに関するオプションもあります

于 2016-06-15T06:53:01.640 に答える