@
Kylin只能按照構建 Model 時使用的連線條件來使用,例如在前面建立 emp_model 時,對emp表和dept表選用的是 Inner Join 也即是內連線的方式,在使用 Kylin 查詢的時候,也只能用 join 內連線,如果在使用 Kylin 查詢時使用其他連線如左連線會報錯。
select dept.dname,sum(emp.sal) from emp left join dept on emp.deptno = dept.deptno group by dept.dname;
再查詢語句中還要求事實表在前,維度表在後,否則也會報錯,例如把dept部門維度表放在前面會報錯。
select dept.dname,sum(emp.sal) from dept join emp on emp.deptno = dept.deptno group by dept.dname;
Kylin只能按照構建Cube時選擇的維度欄位分組統計,如果選擇指定維度欄位如deptno分組統計可以查詢成功
select deptno,sum(sal) from emp group by deptno;
如果選擇不在前面選擇的mgr維度則查詢會報錯
select mgr,sum(sal) from emp group by mgr;
Kylin只能統計構建 Cube 時選擇的度量值欄位,由於count在前面的度量設定裡因此可以查詢成功
由於前面獎金comm欄位沒有放在度量裡,因此查詢報錯
select dept.dname,sum(emp.comm) from emp join dept on emp.deptno = dept.deptno group by dept.dname;
Sparder (SparderContext) 是由 Spark application 後端實現的新型分散式查詢引擎,它是作為一個 Long-running 的 Spark application 存在的。Sparder 會根據 kylin.query.spark-conf 開頭的設定項中設定的 Spark 引數來獲取 Yarn 資源,如果設定的資源引數過大,可能會影響構建任務甚至無法成功啟動 Sparder,如果 Sparder 沒有成功啟動,則所有查詢任務都會失敗,因此請在 Kylin 的 WebUI 中檢查 Sparder 狀態,不過預設情況下,用於查詢的 spark 引數會設定的比較小,在生產環境中,大家可以適當把這些引數調大一些,以提升查詢效能。
kylin.query.auto-sparder-context-enabled-enabled 引數用於控制是否在啟動 kylin 的同時啟動Sparder,預設值為 false,即預設情況下會在執行第一條 SQL 的時候才啟動 Sparder,因此 Kylin 的第一條 SQL 查詢速度一般比較慢,因為包含了 Sparder 任務的啟動時間。
檢視yarn可以看到有一個名稱為sparder_on_xxxx的yarn應用
根目錄:/kylin/kylin_metadata
子目錄:
Kylin 查詢引數全部以 kylin.query.spark-conf 開頭,預設情況下,用於查詢的 spark 引數會設定的比較小,在生產環境中,大家可以適當把這些引數調大一些,以提升查詢效能。
####spark 執行模式####
#kylin.query.spark-conf.spark.master=yarn
####spark driver 核心數####
#kylin.query.spark-conf.spark.driver.cores=1
####spark driver 執行記憶體####
#kylin.query.spark-conf.spark.driver.memory=4G
####spark driver 執行堆外記憶體####
#kylin.query.spark-conf.spark.driver.memoryOverhead=1G
####spark executor 核心數####
#kylin.query.spark-conf.spark.executor.cores=1
####spark executor 個數####
#kylin.query.spark-conf.spark.executor.instances=1
####spark executor 執行記憶體####
#kylin.query.spark-conf.spark.executor.memory=4G
####spark executor 執行堆外記憶體####
#kylin.query.spark-conf.spark.executor.memoryOverhead=1G
對於沒有cube能查到結果的,Kylin4.0版本支援這類查詢下壓到Spark SQL去查詢hive源資料
kylin.query.pushdown.runner-class-name=org.apache.kylin.query.pushdown.PushDownRunnerSparkImpl
select mgr,sum(sal) from emp group by mgr;
從spark WebUI也可以看到剛剛查詢下壓的Job和Stage的詳細資訊
衍生維度用於在有效維度內將維度表上的非主鍵維度排除掉,並使用維度表的主鍵(其實是事實表上相應的外來鍵)來替代它們。Kylin 會在底層記錄維度表主鍵與維度表其他維度之間的對映關係,以便在查詢時能夠動態地將維度表的主鍵「翻譯」成這些非主鍵維度,並進行實時聚合。
雖然衍生維度具有非常大的吸引力,但這也並不是說所有維度表上的維度都得變成衍生維度,如果從維度表主鍵到某個維度表維度所需要的聚合工作量非常大,則不建議使用衍生維度。
聚合組(Aggregation Group)是一種強大的剪枝工具。聚合組假設一個 Cube 的所有維度均可以根據業務需求劃分成若干組(當然也可以是一個組),由於同一個組內的維度更可能同時被同一個查詢用到,因此會表現出更加緊密的內在關聯。每個分組的維度集合均是Cube 所有維度的一個子集,不同的分組各自擁有一套維度集合,它們可能與其他分組有相同的維度,也可能沒有相同的維度。每個分組各自獨立地根據自身的規則貢獻出一批需要被物化的 Cuboid,所有分組貢獻的 Cuboid 的並集就成為了當前 Cube 中所有需要物化的 Cuboid的集合。不同的分組有可能會貢獻出相同的 Cuboid,構建引擎會察覺到這點,並且保證每一 個 Cuboid 無論在多少個分組中出現,它都只會被物化一次。
對於每個分組內部的維度,使用者可以使用如下三種可選的方式定義,它們之間的關係,具體如下。
上述的聚合組可以在新建cube中Cube Designer 的 Advanced Setting 中的 Aggregation Groups 區域設定。
Kylin 會把所有的維度按照順序組合成一個完整的 Rowkey,並且按照這個 Rowkey 升序排列 Cuboid 中所有的行。維度的位置(Rowkey)對查詢效能有影響,可以調整順序。將過濾維放在非過濾維之前,將高基數維放在低基數維之前。
設計良好的 Rowkey 將更有效地完成資料的查詢過濾和定位,減少 IO 次數,提高查詢速度,維度在 rowkey 中的次序,對查詢效能有顯著的影響。
Row key 的設計原則如下:
官方RestAPI使用 https://kylin.apache.org/docs/howto/howto_use_restapi.html
進入Access and Authentication API 存取和身份驗證API,標頭檔案中需要使用基本認證編碼的授權資料,例如可以使用下面的python指令碼生成
python -c "import base64; print base64.standard_b64encode('ADMIN:KYLIN')"
進入Query API後找到Curl Example的範例程式碼
複製上面指令碼得到的授權碼並修改成如下:
curl -X POST -H "Authorization: Basic QURNSU46S1lMSU4=" -H "Content-Type: application/json" -d '{ "sql":"select dname,sum(sal) from emp e join dept d on e.deptno = d.deptno group by dname;", "project":"firstproject" }' http://hadoop1:7070/kylin/api/query
可以看到返回成功結果資料
通過Cube API中找到Build Cube,檢視地址,路徑變數和請求體的引數說明
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-lukQbqYf-1676045281339)(image-20230209154440123.png)]
curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json' -d '{"startTime":'1423526400000', "endTime":'1423612800000', "buildType":"BUILD"}' http://hadoop1:7070/kylin/api/cubes/emp_cube/build
如果需要每日構建則可以通過Kylin 提供了 Restful API,將構建 cube 的命令寫到指令碼中,將指令碼交給DolphinScheduler、Azkaban之類的排程工具,以實現定時排程的功能。
新增kylin的依賴
<dependency>
<groupId>org.apache.kylin</groupId>
<artifactId>kylin-jdbc</artifactId>
<version>4.0.3</version>
</dependency>
建立KylinJdbcDemo.java測試類
import org.apache.kylin.jdbc.Driver;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class KylinJdbcDemo {
public static void main(String[] args) throws Exception{
Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();
Properties info = new Properties();
info.put("user", "ADMIN");
info.put("password", "KYLIN");
String sql = "select dname,sum(sal) from emp e join dept d on " +
"e.deptno = d.deptno group by dname";
Connection conn = driver.connect("jdbc:kylin://hadoop1:7070/firstproject", info);
PreparedStatement state = conn.prepareStatement(sql);
ResultSet resultSet = state.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getString( 1 ) + ":" + resultSet.getDouble( 2 ));
}
}
}
執行檢視結果是正確的