前言
本地生活服務近年來越來越讓我們的自身生活變得便捷。包括社群服務、生活配送、同城跑腿、餐飲、電影票務、休閑娛樂、智慧出現等。已經有大量的網際網路企業在其中發現商機,幫忙使用者改善原有的生活方式。而這所有的服務都是基于位置的服務(Location Based Services,LBS)。位置資訊是提供本地差異化服務的關鍵資訊。如何基于位置與時間資訊來幫助更好的關聯使用者與本地服務是提供架構設計的核心。

原有架構
原有架構的問題:
- 系統擴充性差:基于 Hadoop 體系,存儲計算一體化,無法根據計算與存儲動态調整比例。需要機器級别來進行擴容。同時還需要花大量精力維護整體服務。
- 資料分析效率過慢:位置資訊一般存儲在類似 HBase 這樣的架構中,但由于 HBase 本質來說是一個隻支援簡單查詢的行存。一次分析請求往往需要掃描全表才能出結構。千億規模下,需要小時級别才能出結果。
- 資料存儲成本過高:曆史資料的價值往往較低,單一的存儲方案無法為曆史資料的提供更好的成本節省方案。
本文将針對本地生活使用者圈選的場景下,介紹如何通過 Tablestore 進行資料分析。
Tablestore 是什麼
Tablestore 啟發自 Google 的 Bigtable 論文,從 2009 年開始,在阿裡雲的飛天團隊内,開始孵化。經過10年的錘煉,如今在集團、公有雲和專有雲上積累了各式各樣的客戶和場景。
Tablestore 是一款 Serverless 雲原生存儲引擎,Serverless 相比執行個體售賣類型的産品,在業務有波峰波谷時天生就有較大的優勢,基于 Bigtable 的主存儲采用行的方式進行存儲,可以支撐單表億級别的 QPS。下面列了一些 Tablestore 的核心特性:
Tablestore 除了有強大的主存儲滿足海量業務的實時讀寫外,基于主存儲的分布式日志提供了完整的資料派生能力(詳情
參考),海量實時寫入 Tablestore 的資料,可以實時訂閱進行消費。這樣就滿足了我們的實時計算需求。
Lambda 架構中除了實時資料寫入,實時計算之前,全量資料需要提供高性能掃描能力,Tablestore 采用行列混合,雙引擎的架構,在主存儲之外内部通過通道服務實時建構一個列存儲,支撐 PB 級别資料的高吞吐掃描。同時在海量的資料場景下,我們相信資料是需要分層存儲,是以在建構自身列存的同時,我們會幫助使用者建構推送雲上資料湖的鍊路,通過全托管的資料湖投遞,降低使用者的存儲成本。
基于 Tablestore 的 Lambda 架構
Tablestore 在專注于打造一款極緻性能和成本的存儲引擎同時,更加關注完整的計算生态,伴随産品核心功能疊代的過程中,我們和阿裡雲的幾大核心計算引擎做了完善的對接具體包括:
- MaxCompute 的對接,支援 MaxCompute 計算引擎通過外表的方式直讀寫 Tablestore
- EMR Spark 對接,支援流批源表讀,流批結果表寫,集團内第一款全 Connector 支援的 KV 存儲引擎
- Blink 對接,支援流批源表讀,流批結果表寫,維表讀,集團内第一款全 Connector 支援的 KV 存儲引擎
- DLA 對接,支援 SQL 直接讀寫 Tablestore 的資料
- FC 對接,支援流式增量觸發器
資料與圈選場景定義
前言中介紹了圈選場景的大緻概念,在本章中定義一個較為簡單的圈選場景,供本文的後續内容使用,具體如下:
- 資料:使用者的資料規模約1億條;資料格式有三列,其中包括id, location, locationTime,分别代表使用者ID,使用者發生行為時的地點(通過經緯度表示),以及使用者發生行為的時間。
-
圈選場景:
a. 通過時間範圍進行行為圈選使用者
b. 通過時間範圍+地理區域進行使用者數統計
熱資料分析
前提條件 - 開通 EMR 服務
- 已建立 E-MapReduce Hadoop 叢集。具體操作,請參見 建立叢集
。
建立叢集時,請確定打開挂載公網開關,将叢集挂載到公網,用于Shell遠端登入伺服器。
說明:本文使用Shell指令示範,如果需要使用 E-MapReduce 的圖形化頁面進行資料開發。具體操作,請參見
資料開發- 已上傳 emr-datasources_shaded_2.11-2.2.0-SNAPSHOT.jar 包到 EMR Header 伺服器。
通過時間圈選 - 主鍵查詢
步驟一 建立 Tablestore 表
Tablestore 的詳細開通步驟請參考
官方文檔 - Tablestore,本文中所建立出來的表名為 workshop_location, 其中 locationTime、id 作為資料表的主鍵,分别代表使用者ID,使用者發生行為的時間,location 為資料表的預定義列,代表使用者發生行為時的地點,資料示例如下圖所示。
步驟二 建立 Tablestore 在 EMR 的外表
- 登入 EMR Header 伺服器。
- 執行如下指令啟動 spark-sql 指令行,用于 Spark 外表建立和後續的 SQL 實戰操作。
其中 Spark 的資源參數為--num-executors 2 --executor-memory 4g --executor-cores 1,可以根據具體的叢集配置進行自定義調整。 表示上傳 jar 包的版本資訊,請根據實際填寫,例如 2.2.0-SNAPSHOT。
spark-sql --driver-class-path emr-datasources_shaded_2.11-<Version>.jar \
--jars emr-datasources_shaded_2.11-<Version>.jar \
--master yarn --num-executors 2 --executor-memory 2g --executor-cores 1
- 建立EMR外表workshop_location(對應表格存儲的workshop_location表)。
DROP TABLE IF EXISTS workshop_location;
CREATE TABLE workshop_station
USING tablestore
OPTIONS(
endpoint="http://instance_name.cn-hangzhou.vpc.tablestore.aliyuncs.com",
access.key.id="",
access.key.secret="",
instance.name="instance_name",
table.name="workshop_location",
catalog='{"columns": {"locationTime": {"type": "long"}, "id": {"type": "long"},"location": {"type": "string"}}}'
);
參數說明:
參數 | 說明 |
---|---|
endpoint | 表格存儲執行個體通路位址,EMR 叢集中使用 VPC 位址 |
access.key.id | 阿裡雲賬号的 AccessKey ID |
access.key.secret | 阿裡雲賬号的 AccessKey Secret |
instance.name | 執行個體名稱 |
table.name | 表格存儲的資料表名稱 |
catalog | 資料表的 Schema 定義。後續版本中會支援 DDL 上配置字段 Schema,到時本參數将不再必要 |
步驟三 資料分析
查詢1:統計總資料條數
select count(1) from workshop_location;
查詢結果:
查詢2:統計 11.11 日 0:00-0:05 的行為個數
select count(1) from workshop_location
where locationTime >= 1605024000000 and locationTime <= 1605024300000;
通過地理資訊圈選 - 非主鍵查詢 & 時空資料查詢
步驟一 建立 Tablestore 多元索引
Tablestore 多元索引的詳細使用方式請參考
官方文檔 - tablestore多元索引,本文中所建立出來的表名為 workshop_location_index, 其中 location 配置成地理位置。具體字段顯示如下:
注意:- 地理位置在tablestore中需配置成string類型,格式為 "latitude,longitude",如"31.12,121.30"代表上海。
登入 EMR header 機器和啟動 spark sql 的方式和前文相同,不再贅述。
建立使用多元索引的外表方式如下:
DROP TABLE IF EXISTS workshop_location_index;
create TABLE workshop_location_index
USING tablestore
OPTIONS(
endpoint="http://instance_name.cn-hangzhou.vpc.tablestore.aliyuncs.com",
access.key.id="",
access.key.secret="",
instance.name="instance_name",
table.name="workshop_location",
catalog='{"columns": {"locationTime": {"type": "long"}, "id": {"type": "long"},"location": {"type": "string"}}}',search.index.name="workshop_location_index"
);
多元索引相關參數說明:
search.index.name | 表格存儲資料表的多元索引名 |
查詢1:統計距離 (50,50) 1 米的行為個數
select count(1) from workshop_location_index
where location = '{\"centerPoint\":\"50,50\", \"distanceInMeter\":1.0}';
查詢2:列舉 11.11 日 0:00-0:05 距離 (50,50) 1 米的使用者清單
select id,location,locationTime from workshop_location_index
where location = '{\"centerPoint\":\"50,50\", \"distanceInMeter\":1.0}'
and (locationTime >= 1605024000000 and locationTime <= 1605024300000);
冷資料分析與歸檔
Tablestore 提供資料湖投遞的能力,将主表資料同步到 OSS,以 parquet 檔案的方式存儲。利用資料湖投遞可以實作如下場景需求:
- 冷熱資料分層資料湖投遞結合表格存儲的 資料生命周期 功能,可以快速實作 OSS 低成本存儲全量資料,表格存儲提供熱資料的低延遲查詢和分析的需求。
- 全量資料備份資料湖投遞可以自動将表格存儲的全表資料投遞到 OSS Bucket 中,作為備份歸檔資料。
- 大規模實時資料分析資料湖投遞可以實時(每2分鐘)投遞增量的表格存儲資料到 OSS,投遞的資料支援按系統時間分區、Parquet 列存格式存儲;再利用 OSS 的高讀帶寬和列存面向掃描場景優化實作高效實時資料分析。
- 加速 SQL 分析性能當表格存儲資料未建立多元索引且查詢條件中不包含主鍵列的過濾條件時,可以通過資料投遞自動同步資料到 OSS,再利用 DLA+OSS 資料掃描實作 SQL 分析加速。
資料投遞到 OSS
Tablestore 原生提供将主表資料投遞到 OSS 的能力,詳細文檔請參考
官方文檔 - 資料湖投遞本文中建立了任務 workshop_x,将資料投遞到 OSS 上。
OSS上檔案如下圖所示:
用 DLA 分析
開通 DLA 服務的方式詳見
官方文檔 - DLA具體步驟為:
- 配置中繼資料爬取。注意:配置完中繼資料爬取後,DLA 将自動建立外表,供後續分析使用。
Tablestore在本地生活使用者圈選場景下的分析實踐前言Tablestore 是什麼資料與圈選場景定義熱資料分析冷資料分析與歸檔後語歡迎加入 - 進行資料分析:
Tablestore在本地生活使用者圈選場景下的分析實踐前言Tablestore 是什麼資料與圈選場景定義熱資料分析冷資料分析與歸檔後語歡迎加入
用 EMR + JindoFS 分析
開通 EMR 與 JindoFS 服務的方式詳見
官方文檔 - EMR JindoFS具體分析步驟如下:
- 配置 SmartData 中 JindoFS 規則:namespace 和 OSS 挂載點,開啟緩存。在配置完後注意重新開機 Jindo Namespace Service 以生效配置。
Tablestore在本地生活使用者圈選場景下的分析實踐前言Tablestore 是什麼資料與圈選場景定義熱資料分析冷資料分析與歸檔後語歡迎加入 - 建立外表,并修複表結構。注意在每次資料存在改動後,請務必執行下 msck repair table 進行新資料感覺。
DROP TABLE IF EXISTS workshop_oss; CREATE EXTERNAL TABLE `workshop_oss`(`locationTime` bigint, `id` bigint, `location` string) PARTITIONED BY (`year` int, `month` int, `day` int) STORED AS PARQUET LOCATION 'jfs://test/'; msck repair table workshop_oss;
- 進行資料分析
select count(1) as count from workshop_oss;
由于 JindoFS 存在緩存加速,是以資料查詢越多,資料傳回越快,資料結果如下所示。
第一次查詢:
第二次查詢:
第三次查詢:
後語
本文将針對本地生活使用者圈選的場景下,介紹了如何通過 Tablestore 進行冷熱資料分析。
熱資料分析建議使用計算引擎(如本文介紹的 EMR Spark)+ Tablestore 主表或者多元索引。Tablestore 可以提供流批一體存儲能力,同時可以提供分析與查詢兩種能力。
冷資料分析建議使用資料湖投遞,通過 OSS 存儲冷資料,再基于計算引擎(如本文介紹的 EMR Spark 和 DLA)進行分析。
歡迎加入
表格存儲 Tablestore 推出了很多貼近使用者場景的文章與示例代碼,歡迎大家加入我們的釘釘公開交流群一起讨論,群号:23307953。(1 群已滿員,歡迎加入 2 群)