天天看點

Spark Catalyst 緩存機制

1、背景

Spark SQL 用thriftserver去接,使用的時候,經常會出現找不到hdfs上xxx檔案,需要手動refresh table相關的表的情況。

今天偶然看到Spark Catalyst中的相關代碼,突然眼前一亮,摸索着看下去,終于得到了真香。

2、代碼中的實作步驟

位于org.apache.spark.sql.catalyst.catalog包下的SessionCatalog.scala :
           
Spark Catalyst 緩存機制

這邊定義的tableRelationCache就是Spark在執行SQL時,緩存的LogicalPlan,其中key為某個HiveTableRelation中讀取出來的databaseName.tableName,value就是LogicalPlan。

而cacheSize配置了該緩存Map的容量,可通過參數spark.sql.filesourceTableRelationCacheSize調節,(預設緩存1000個)。

Spark Catalyst 緩存機制

cacheTable為緩存LogicalPlan的入口:

Spark Catalyst 緩存機制

在org.apache.spark.sql.hive包下的HiveMetastoreCatalog.scala:

Spark Catalyst 緩存機制
convertToLogicalRelation将HiveTableRelation提取出QualifiedTableName并生成LogicalRelation
           
Spark Catalyst 緩存機制

3、問題的解決

發現Parquet格式的表會在加載時通過Spark自帶的SerDe,通過參數spark.sql.hive.convertMetastoreParquet控制,預設為true,設定為false時,Spark SQL會使用Hive SerDe來處理Parquet表,而不是使用the built in support。

至此,将spark.sql.hive.convertMetastoreParquet=false,問題解決。

而spark.sql.filesourceTableRelationCacheSize則是控制了緩存LogicalPlan的個數,預設為1000。

結尾附帶一篇掃盲:解釋了Why a `LogicalPlan` represents a hive table?

https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-LogicalPlan-HiveTableRelation.html

繼續閱讀