使用MaxCompute訪問TableStore(OTS) 簡明手冊

摘要: 大數據計算服務 MaxCompute 可以提供強大的分析能力,而分佈式 NoSQL 數據庫表格存儲在行級別上的實時更新和可覆蓋性寫入等特性,相對於 MaxCompute 內置表 append-only 批量操做,提供了一個很好的補充。html

關係數據庫已經存在半個世紀,有很是普遍的使用場景,可是在快速迭代的互聯網領域其擴展性和 schema 靈活性被詬病頗多,所以相似 TableStore/BigTable/HBase 等強調擴展性和靈活性的NoSQL數據庫逐步流行起來,這些 NoSQL 數據庫只提供 API 接口,不提供 SQL 訪問,這就致使不少熟悉 SQL 可是不喜歡寫代碼的用戶無法很舒服的使用此類NoSQL數據庫。基於此,表格存儲開發團隊聯合 MaxCompute(下文中 ODPS 與 MaxCompute 同義)團隊打通了 ODPS-SQL 訪問表格存儲的路徑,這樣一個只懂 SQL 的用戶也能夠愉快的訪問表格存儲裏面的大量數據了。git

本篇文章就以一個小白用戶的身份體驗如何使用 MaxCompute-SQL 查詢表格存儲裏面的數據,以及如何開發自定義邏輯(User Defined Function, UDF)來處理用戶特定的數據格式。sql

什麼是表格存儲 TableStore?數據庫

分佈式NoSQL數據存儲服務,無縫支持單表PB級數據及百萬級訪問併發,彈性資源,按量計費,對數據高頻的增、刪、改支持的很好,保證單行數據讀寫的強一致性。json

什麼是大數據計算服務 MaxCompute?api

一種快速、徹底託管的TB/PB級數據倉庫解決方案,提供多種經典的分佈式計算模型,可以更快速的解決用戶海量數據計算問題。瀏覽器

下面首先咱們將介紹環境準備,這是全部後面的操做的基礎。而後會介紹使用 OdpsCmd 訪問表格存儲。在第三節咱們介紹使用 OdpsStudio 訪問表格存儲。最後介紹如何寫 UDF、部署 UDF 以及在查詢中使用 UDF。網絡

環境準備併發

首先,準備好一個 MaxCompute 的工程,工程建立指導文檔,準備好AccessId和AccessKey備用,爲了區別其餘產品的AccessId和AccessKey,後面咱們稱之爲ODPS-AccessId,ODPS-AccessKey。並在RAM中受權 MaxCompute 訪問 TableStore 的權限,受權方式請參考MaxCompute訪問TableStore數據——受權app

小提示:因爲 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 的某一張表。

關聯的數據表信息以下:

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

常見錯誤處理:

  1. FAILED: ODPS-0010000:System internal error - fuxi job failed, WorkerPackageNotExist:須要設置set odps.task.major.version=unstructured_data
  2. FAILED: ODPS-0010000:System internal error - std::exception:Message: a timeout was reached:通常狀況下是OTS的endpoint填寫錯誤,致使ODPS無法訪問,能夠諮詢ots_support旺旺帳號
  3. logview invalid end_point:在執行過程當中,會返回一個logview URL地址,若是使用瀏覽器訪問該地址返回錯誤,多是配置不對,請檢查 MaxCompute 配置,並諮詢 odps_support 旺旺帳號
相關文章
相關標籤/搜索