私の質問はかなり単純ですが、どういうわけか、ドキュメントを読んでも明確な答えが見つかりません。
Spark2をCDH 5.1クラスターで実行しています。 Hiveとメタストアもあります。
私はSparkプログラムで次のようにセッションを作成します。
_SparkSession spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
_
次のHiveQLクエリがあるとします。
_spark.sql("SELECT someColumn FROM someTable")
_
私は次のことを知りたいです:
パフォーマンス評価を行っていますが、spark.sql([hiveQL query])
で実行されたクエリの時間パフォーマンスを要求する必要があるかどうかわかりませんSparkまたはHiveを参照してください。
Sparkは、Hiveとインメモリーの2つのカタログを認識しています。 enableHiveSupport()
を設定すると、_spark.sql.catalogImplementation
_はHive
に設定され、それ以外の場合は_in-memory
_に設定されます。したがって、Hiveサポートを有効にすると、spark.catalog.listTables().show()
はHiveメタストアのすべてのテーブルを表示します。
ただし、これはHiveがクエリに使用されることを意味するわけではありません* sparkがHive-metastoreと通信し、実行エンジンが常にスパークすることを意味します。
*実際にはpercentile
と_percentile_approx
_のようないくつかの関数があり、これらはネイティブHive UDAFです。
enableHiveSupport
を設定しても、そのクエリはHiveで計算されます。
それはHiveカタログに関するものだけです。 enableHiveSupport
を使用すると、次のことができます。
すべては実行自体ではなく、カタログに直接接続されています
歴史的にも、Hive QL解析はHiveを使用して行われていましたが、現在SparkはHiveを呼び出さずにそれを実行します
Spark.sql([hiveQL query])で実行されたクエリの時間パフォーマンスは、SparkまたはHiveを参照)と主張する必要があります。
上記のように、それはスパークのパフォーマンスです
MapReduce、TezおよびSparkの3つの実行エンジンがあります。
Hiveを使用してクエリを実行すると、上記のエンジンのいずれかを使用するように選択できます。通常、管理者はいずれかのエンジンをデフォルトエンジンとして設定する必要があります。
つまり.
set Hive.execution.engine=tez;
Sparkを使用してクエリを実行すると、sparkエンジンを使用してクエリが実行されます。
ただし、パフォーマンス分析を行っている場合、測定する必要があるのは時間だけではなく、メモリとCPUも測定する必要があります。
「内部的にこのクエリはHive MapReduceプリミティブに変換されます。または、HiveQLのサポートは構文レベルでのみ行われ、Spark SQLは内部で使用されます。 "
私はspark SQL on Hive metastoreを使用しています。クエリがMap/Reduceに変換されるかどうかを確認する方法は、次のことを確認することです:a。Hiveコンソールを開き、フィルターを使用して単純なSELECTクエリを実行します。次に、YARNリソースマネージャーに移動します。クエリの実行結果として、いくつかのMap/reduceジョブが実行されます。b。HiveContextを使用してspark SQLを実行し、同じSQLクエリを実行します。Spark SQLはMap/ReduceジョブをトリガーせずにHiveのメタストア情報を利用します。YARNのResource Managerに移動してそれを確認してください。spark-Shellセッションが実行されているだけで、追加のMap /はありません/クラスターで発生するジョブを減らします。