摘要: 大數據計算服務 MaxCompute 能夠提供強大的分析能力,而分布式 NoSQL 數據庫表格存儲在行級別上的實時更新和可覆蓋性寫入等特性,相對於 MaxCompute 內置表 append-only 批量操作,提供了一個很好的補充。
關系數據庫已經存在半個世紀,有非常廣泛的使用場景,但是在快速迭代的互聯網領域其擴展性和 schema 靈活性被詬病頗多,因此類似 TableStore/BigTable/HBase 等強調擴展性和靈活性的NoSQL數據庫逐步流行起來,這些 NoSQL 數據庫只提供 API 接口,不提供 SQL 訪問,這就導致很多熟悉 SQL 但是不喜歡寫代碼的用戶沒法很舒服的使用此類NoSQL數據庫。基於此,表格存儲開發團隊聯合 MaxCompute(下文中 ODPS 與 MaxCompute 同義)團隊打通了 ODPS-SQL 訪問表格存儲的路徑,這樣一個只懂 SQL 的用戶也可以愉快的訪問表格存儲里面的大量數據了。
本篇文章就以一個小白用戶的身份體驗如何使用 MaxCompute-SQL 查詢表格存儲里面的數據,以及如何開發自定義邏輯(User Defined Function, UDF)來處理用戶特定的數據格式。
什么是表格存儲 TableStore?
分布式NoSQL數據存儲服務,無縫支持單表PB級數據及百萬級訪問並發,彈性資源,按量計費,對數據高頻的增、刪、改支持的很好,保證單行數據讀寫的強一致性。
什么是大數據計算服務 MaxCompute?
一種快速、完全托管的TB/PB級數據倉庫解決方案,提供多種經典的分布式計算模型,能夠更快速的解決用戶海量數據計算問題。
下面首先我們將介紹環境准備,這是所有后面的操作的基礎。然后會介紹使用 OdpsCmd 訪問表格存儲。在第三節我們介紹使用 OdpsStudio 訪問表格存儲。最后介紹如何寫 UDF、部署 UDF 以及在查詢中使用 UDF。
環境准備
首先,准備好一個 MaxCompute 的工程,工程創建指導文檔,准備好AccessId和AccessKey備用,為了區別其他產品的AccessId和AccessKey,后面我們稱之為ODPS-AccessId,ODPS-AccessKey。並在RAM中授權 MaxCompute 訪問 TableStore 的權限,授權方式請參考MaxCompute訪問TableStore數據——授權
小提示:由於 MaxCompute 在 2.0 版本的計算框架才能支持直接訪問 TableStore 數據,該版本還在灰度上線中,目前還需要 申請MaxCompute 2.0試用,具體開通使用方法請參見 如何申請試用MaxCompute 2.0。
然后,准備好一個表格存儲的實例以及一張數據表,表格存儲實例管理,准備好實例名、EndPoint,為了區別其他產品的AccessId和AccessKey,后面我們稱之為TableStore-InstanceName,TableStore-EndPoint。
網絡連通性
MaxCompute 與 TableStore 是兩個獨立的大數據計算以及大數據存儲服務,所以兩者之間的網絡必須保證連通性。 對於 MaxCompute 公共雲服務訪問 TableStore 存儲,推薦使用 TableStore 私網 地址,例如http://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com。
如果網絡不通,可以使用公網地址,TableStore原生支持 VPC 網絡控制,也需要將網絡類型設置為 "允許任意網絡訪問"。
使用客戶端 ODPS-CMD
1.下載並安裝大數據計算服務客戶端
2.下載解壓,將conf/odps_config.ini 的內容修改為:
project_name=上面申請的ODPS工程名
access_id=ODPS-AccessId
access_key= ODPS-AccessKey
end_point=http://service-corp.odps.aliyun-inc.com/api
https_check=true
# confirm threshold for query input size(unit: GB)
data_size_confirm=100.0
# this url is for odpscmd update
update_url=http://repo.aliyun.com/odpscmd
3.行bin/odpscmd,輸入show tables,正常執行則表示上面配置正確。
4.在bin/odpscmd 下輸入環境變量,顯式開啟 ODPS 2.0 的非結構化功能( 僅在 ODPS 2.0 計算框架完全上線為必須),單獨執行 xx.sql 文件時也需要將下屬設置寫在 SQL 文件的開頭處。
set odps.task.major.version=2dot0_demo_flighting;
set odps.sql.planner.mode=lot;
set odps.sql.ddl.odps2=true;
set odps.sql.preparse.odps2=lot;
set odps.sql.type.system.odps2=true; --是支持表格存儲的binary類型
5.創建一張 MaxCompute 的數據表關聯到 TableStore 的某一張表。
關聯的數據表信息如下:
- 實例名稱:vehicle-test
- 數據表名稱:vehicle_track
- 主鍵信息:vid(int); gt (int)
- 訪問域名:https://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com
DROP TABLE IF EXISTS ots_vehicle_track;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_vehicle_track
(
vid bigint,
gt bigint,
longitude double,
latitude double,
distance double ,
speed double,
oil_consumption double
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)
WITH SERDEPROPERTIES ( -- (2)
'tablestore.columns.mapping'=':vid, :gt, longitude, latitude, distance, speed, oil_consumption', -- (3)
'tablestore.table.name'='vehicle_track' -- (4)
)
LOCATION 'tablestore://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)
- com.aliyun.odps.TableStoreStorageHandler 是 MaxCompute 內置的處理 TableStore 數據的 StorageHandler, 定義了 MaxCompute 和 TableStore 的交互,相關邏輯由 MaxCompute 實現。
- SERDEPROPERITES 可以理解成提供參數選項的接口,在使用 TableStoreStorageHandler 時,有兩個必須指定的選項,分別是下面介紹的 tablestore.columns.mapping 和 tablestore.table.name。 更多的可選選項將在后面其他例子中提及。
- tablestore.columns.mapping 選項:必需選項,用來描述對需要 MaxCompute 將訪問的 TableStore 表的列,包括主鍵和屬性列。 這其中以 : 打頭的用來表示 TableStore 主鍵,例如這個例子中的 :vid:gt。 其他的均為屬性列。 TableStore支持最少1個,最多4個主鍵,主鍵類型為 bigint 或 string,其中第一個主鍵為分區鍵。 在指定映射的時候,用戶必須提供指定 TableStore 表的 所有主鍵,對於屬性列則沒有必要全部提供,可以只提供需要通過 MaxCompute 來訪問的屬性列。
- tablestore.table.name:需要訪問的 TableStore 表名。 如果指定的 TableStore 表名錯誤(不存在),則會報錯,MaxCompute 不會主動去創建 TableStore 表。
- LOCATION 用來指定訪問的 TableStore 的實例信息,包括 instance 名字,endpoint 等。
- 數據格式對應,MaxCompute 與 TableStore 的數據格式對應如下:
TableStore數據類型 |
MaxCompute數據類型 |
string |
string |
binary |
blob |
int |
bigint |
double |
double |
6.執行ODPS-SQL
// 統計編號 4 以下的車輛在時間戳 1469171387 以前的平均速度和平均油耗
select vid,count(*),avg(speed),avg(oil_consumption) from ots_vehicle_track where vid <4 and gt<1469171387 group by vid;
使用 UDF(User Defined Function)處理數據
有時候用戶在表格存儲里面的數據有獨特的結構,希望自己開發邏輯來處理每一行數據,比如解析特定的json字符串,這一塊的開發也已經很方便了。
1.按照MaxCompute Studio文檔的說明在IntelliJ里面安裝MaxCompute-Java/MaxCompute-Studio插件,一旦插件安裝完畢,就可以直接開發。
比如下面就是一個簡單的 UDF 定義,只是簡單的將兩個字符串連接。 MaxCompute 支持更復雜的UDF,包括自定義窗口執行邏輯等,詳細請參考MaxCompute Studio-開發 UDF。
2.打包之后可以上傳到 MaxCompute,其中打包這里有需要注意的地方,File->Project Structure->Artifacts, 填寫好 Name 和 Output Directory 后,要點擊 + 選擇輸出模塊,打包后通過 ODPS Project Explorer 來上傳資源、創建函數,然后就可以在SQL中調用。
3.打開bin/odpscmd,輸入
// 我們選出來1行數據,並將name/name傳入UDF,返回兩個string的累加
select cloud_metric_extract_md5(name, name) as udf_test from test_table limit 1;
寫在最后
目前ODPS-SQL訪問 TaleStore 還在對執行邏輯進行深度的優化,如果有需求請聯系ots_support,我們將針對業務場景來進行優化。
FAQ
常見錯誤處理:
- FAILED: ODPS-0010000:System internal error - fuxi job failed, WorkerPackageNotExist:需要設置set odps.task.major.version=unstructured_data
- FAILED: ODPS-0010000:System internal error - std::exception:Message: a timeout was reached:一般情況下是OTS的endpoint填寫錯誤,導致ODPS沒法訪問,可以咨詢ots_support旺旺賬號
- logview invalid end_point:在執行過程中,會返回一個logview URL地址,如果使用瀏覽器訪問該地址返回錯誤,可能是配置不對,請檢查 MaxCompute 配置,並咨詢 odps_support 旺旺賬號