本文以GitHub公開事件數據為例,為您介紹使用Hologres加速查詢MaxCompute,并對接BI分析工具(本文以DataV為例),實現實時分析離線數據的通用架構與核心步驟。
示例架構
搭建離線數倉時,Hologres可直接讀取離線數倉MaxCompute中的數據,并對接BI分析工具將數據實時展示在大屏中,示例架構如圖所示。
其中:
待處理數據:
本實踐使用GitHub公開事件作為示例數據,更多關于數據集的介紹請參見業務與數據認知。
離線數倉:
MaxCompute是大數據計算服務,可以對海量離線數據進行處理并歸檔,構建離線數據倉庫。本實踐中使用MaxCompute已通過公共數據集存儲的GitHub事件數據。
實時數倉:
Hologres是兼容PostgreSQL協議的交互式分析引擎,與MaxCompute底層無縫打通,可以加速查詢MaxCompute數據,并為下游提供數據服務。
實時大屏:
本實踐以DataV為例,為您展示搭建實時大屏后查看并分析數據的效果。
實踐步驟
準備工作
本實踐使用已存儲在MaxCompute的Github公共事件作為示例數據,因此您無需操作離線數倉的數據集成步驟,可使用Hologres直接讀取MaxCompute中的示例數據。因此本實踐的操作可直接從讀取MaxCompute數據開始。您僅需在實踐前準備Hologres和大屏搭建產品環境。
準備Hologres環境
您需開通Hologres,創建并連接Hologres數據庫,后續在Hologres數據庫中執行命令讀取數據。
您也可以申請Hologres的免費資源包,免費試用體驗本教程的核心步驟。Hologres提供的免費資源包介紹及申請引導請參見新用戶免費試用。
(可選)準備大屏搭建產品:本文以DataV為例
本文以DataV為例,為您示例搭建大屏后的效果。
讀取離線數倉數據(外部表)
您可以使用外部表直接讀取MaxCompute的數據。核心步驟如下。
創建外部表。
-- 新建schema用于創建外部表 CREATE SCHEMA IF NOT EXISTS hologres_foreign_dataset_github_event; DROP FOREIGN TABLE IF EXISTS hologres_foreign_dataset_github_event.dwd_github_events_odps; IMPORT FOREIGN SCHEMA "bigdata_public_dataset#github_events" LIMIT TO ( dwd_github_events_odps ) FROM SERVER odps_server INTO hologres_foreign_dataset_github_event OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
通過外部表讀取MaxCompute數據。
以下以查詢昨日起最活躍項目數據為例,為您示例查詢代碼。
說明通過外部表查詢MaxCompute分區表數據有最大掃描分區數限制,最多為512個分區,因此您需要在過濾條件中增加分區鍵限制,減少分區掃描量。
SELECT repo_name, COUNT(*) AS events FROM hologres_foreign_dataset_github_event.dwd_github_events_odps WHERE ds >= (CURRENT_DATE - interval '1 day')::text GROUP BY repo_name ORDER BY events DESC LIMIT 5;
查詢數據(內部表)
您可以新建一個內部表,將待分析數據導入至Hologres,核心步驟如下。
創建內部表。
-- 新建schema用于創建內表并導入數據 CREATE SCHEMA IF NOT EXISTS hologres_dataset_github_event; DROP TABLE IF EXISTS hologres_github_event; DROP TABLE IF EXISTS hologres_dataset_github_event.hologres_github_event; BEGIN; CREATE TABLE hologres_dataset_github_event.hologres_github_event ( id bigint, actor_id bigint, actor_login text, repo_id bigint, repo_name text, org_id bigint, org_login text, type text, created_at timestamp with time zone NOT NULL, action text, iss_or_pr_id bigint, number bigint, comment_id bigint, commit_id text, member_id bigint, rev_or_push_or_rel_id bigint, ref text, ref_type text, state text, author_association text, language text, merged boolean, merged_at timestamp with time zone, additions bigint, deletions bigint, changed_files bigint, push_size bigint, push_distinct_size bigint, hr text, month text, year text, ds text ); CALL set_table_property('hologres_dataset_github_event.hologres_github_event', 'distribution_key', 'id'); CALL set_table_property('hologres_dataset_github_event.hologres_github_event', 'event_time_column', 'created_at'); CALL set_table_property('hologres_dataset_github_event.hologres_github_event', 'clustering_key', 'created_at'); COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.id IS '事件ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.actor_id IS '事件發起人ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.actor_login IS '事件發起人登錄名'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.repo_id IS 'repoID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.repo_name IS 'repo名稱'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.org_id IS 'repo所屬組織ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.org_login IS 'repo所屬組織名稱'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.type IS '事件類型'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.created_at IS '事件發生時間'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.action IS '事件行為'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.iss_or_pr_id IS 'issue/pull_request ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.number IS 'issue/pull_request 序號'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.comment_id IS 'comment(評論)ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.commit_id IS '提交記錄ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.member_id IS '成員ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.rev_or_push_or_rel_id IS 'review/push/release ID'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.ref IS '創建/刪除的資源名稱'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.ref_type IS '創建/刪除的資源類型'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.state IS 'issue/pull_request/pull_request_review的狀態'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.author_association IS 'actor與repo之間的關系'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.language IS '編程語言'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.merged IS '是否接受合并'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.merged_at IS '代碼合并時間'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.additions IS '代碼增加行數'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.deletions IS '代碼減少行數'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.changed_files IS 'pull request 改變文件數量'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.push_size IS '提交數量'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.push_distinct_size IS '不同的提交數量'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.hr IS '事件發生所在小時,如00點23分,hr=00'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.month IS '事件發生所在月,如2015年10月,month=2015-10'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.year IS '事件發生所在年,如2015年,year=2015'; COMMENT ON COLUMN hologres_dataset_github_event.hologres_github_event.ds IS '事件發生所在日,ds=yyyy-mm-dd'; COMMIT;
導入數據至內部表。
說明Hologres從V2.1.17版本起支持Serverless Computing能力,針對MaxCompute大數據量離線導入、大型ETL作業等場景,使用Serverless Computing執行該類任務可以避免為實例預留計算資源,顯著提升實例穩定性、減少OOM概率,且僅需為任務單獨付費。Serverless Computing詳情請參見Serverless Computing概述。
-- (可選)推薦使用Serverless Computing執行大數據離線導入和ETL作業 SET hg_computing_resource = 'serverless'; INSERT INTO hologres_dataset_github_event.hologres_github_event SELECT * FROM hologres_foreign_dataset_github_event.dwd_github_events_odps WHERE ds >= (CURRENT_DATE - interval '1 day')::text; -- 重置配置,保證非必要的SQL不會使用serverless資源。 RESET hg_computing_resource; -- 更新表的統計信息 ANALYZE hologres_dataset_github_event.hologres_github_event;
查詢內部表數據。
SELECT repo_name, COUNT(*) AS events FROM hologres_dataset_github_event.hologres_github_event WHERE ds >= (CURRENT_DATE - interval '1 day')::text GROUP BY repo_name ORDER BY events DESC LIMIT 5;
(可選)通過DataV搭建實時大屏
您可以通過DataV的數據大屏模板,基于Hologres數據源來快速搭建GitHub事件數據實時大屏。
創建Hologres數據源。
將數據所在的Hologres實例和數據庫創建為DataV的數據源,詳情請參見DataV。
創建可視化應用。
登錄DataV控制臺。
在工作臺頁面,單擊創建PC端看板。
選擇使用Hologres實時分析GitHub事件數據模板。
修改模板中相關組件的數據源。
以左上角的今日公開事件總數為例:
單擊今日公開事件總數對應的數字框,點擊右側數據源,選擇數據源類型為實時數倉Hologres。
選擇已有數據源為您已創建的數據源。
如果您在Hologres中的表名和Schema與本實踐相同,則不需修改SQL。
修改完成后,數據響應結果刷新,大屏中成功展示實時數據。
按照示例更新大屏中的數據源和表名,需更新組件及更新后效果如下圖所示。
單擊右上角發布,完成大屏搭建。
您也可以單擊預覽,預覽實時更新的數據大屏。