天天看點

MaxCompute資料的上傳下載下傳1、MaxCompute資料的上傳和下載下傳2、常用參數和Tunnel指令3、Tunnel SDK相關知識

Tunnel

Tunnel通常用來将本地的資料上傳到maxcompute或将maxcompute資料下載下傳到本地

1、MaxCompute資料的上傳和下載下傳

MaxCompute系統上傳/下載下傳資料包括兩種方式

DataHub實時資料通道 Tunnel批量資料通道

OGG插件 大資料開發套件

Flume插件 DTS

LogStash插件 Sqoop

Fluentd插件 Kettle插件

MaxCompute用戶端           

Tunnel檢視幫助資訊

不帶參數的tunnel或tunnel help檢視幫助資訊

也可tunnel help upload

Available subcommands:

upload

支援檔案或目錄(隻一級目錄)的上傳;

每一次上傳隻支援資料上傳到一個表或表的一個分區;

有分區的表一定要指定上傳的分區,示例如下:

tunnel upload d:testp1.txt yunxiang_01.t_test_p/gender='male'

tunnel upload d:test yunxiang_01.t_test_p/gender='male' --scan=only

注釋:yunxiang_01為項目; t_test_p為表;gender='male'為分區類;--scan=only表示隻掃碼資料不導入資料。

download

隻支援下載下傳到單個檔案

每一次下載下傳隻支援一個表或者一個分區

有分區的表一定要指定下載下傳的分區

例子:

tunnel download yunxiang_01.t_test_p/gender='male' d:testp_download.txt

resume

因為網絡原因或者tunnel服務的原因造成的錯誤,使用該子指令續傳;目前僅支援上傳資料續傳;

用法:tunnel resume [session_id]

show

顯示曆史任務

用法:tunnel show history [options]

purge

清除曆史任務

用法:tunnel purge [n]

help

2、常用參數和Tunnel指令

-c: 資料檔案字元編碼,預設為UTF-8,也可以自行指定,如下:

tunnel upload log.txt test_table -c "gbk"

-ni: NULL資料标志符,預設為""(空字元串),也可指定如下:

tunnel upload log.txt test_table -ni "NULL"

-fd: 本地資料檔案的列分割符,預設為逗号;

-rd: 本地資料檔案的行分割符,預設為rn.

1、支援多個字元的列分隔符和行分隔符

2、支援控制字元等不可見字元做分隔符

3、列分隔符不能包含行分割符

4、轉義字元分隔符,在指令行模式下隻支援r,n和t

分隔符示例:

tunnel upload d:p.txt t_test_p/gender='male' -fd "||" -rd "rn"

tunnel download t_test_p/gender='male' d:p_download.txt -fd "||||" -rd "&&"

錯誤語句如下:

tunnel upload d:p.txt t_test_p/gender='male' -fd "b" -rd "t"

-dfp: DateTime類型資料格式,預設為yyyy-MM-dd HH:mm:ss如下

tunnel upload log.txt test_table -dfp "yyyy-MM-dd HH:mm:ss"

常見日期格式:

"yyyyMMddHHmmss": 資料格式"20140209101000"

"yyyy-MM-dd HH:mm:ss"(預設):資料格式"2014-02-09 10:10:00"

"yyyy年MM月dd日":資料格式"2014年09月01日"

-sd:設定session目錄,通過session id可以對上傳、下載下傳資料進行監控、續傳(resume指令)等操作。執行過程由于資料問題,提示失敗會給出session id及錯誤資訊。

tunnel u d:data.txt sale_detail/sale_date=201312,region=hangzhou -s false

根據session id進行斷點續傳:

tunnel resume 201506101639224880870a002ec60c --force;

-te: 指定tunnel的Endpoint;

-threads:指定threads的數量,預設為1;

-tz:指定時區。預設為本地時區:Asia/Shanghai,說明Datetime類型預設支援時區為GMT+8

-acp: 如果目标表分區不存在,自動建立目标分區,預設關閉;

-bs: 每次上傳至Tunnel的資料塊大小,預設值: 100MiB(MiB=1024*1024B)

-cp: 指定是否在本地壓縮後再上傳,減少網絡流量,預設開啟;

-dbr: 是否忽略髒資料(多列,少列,列資料類型不比對等情況):

當值為true時,将全部不符合表定義的資料忽略
當值為false時,若遇到髒資料,則給出錯誤提示資訊,即目标表内的原始資料不會被污染           

-s: 是否掃描本地資料檔案,預設為false,具體如下:

值為true時,先掃描資料,若資料格式正确,再導入資料。
值為false時,不掃描資料,直接進行資料導入。
值為only時,僅進行掃描本地資料,掃描結束後不繼續導入資料           

其他下載下傳參數:

-ci: 指定列索引(從0)下載下傳,使用逗号分隔;

-cn: 指定要下載下傳的列名稱,使用逗号分隔每個名稱;

-cp: 指定是否壓縮,減少網絡流量,預設開啟;

-e:當下載下傳double值時,如果需要,使用指數函數表示,否則最多保留20位;

-h: 資料檔案是否包含表頭,如果為true,則dship會跳過表頭從第二行開始下載下傳資料。注意,-h=true和threads>1即多線程不能一起使用

-limit: 指定要下載下傳的檔案數量

tunnel的一些特點:

tunnel指令是對tunnel子產品的SDK封裝,具有tunnel的一些特點:

支援對表的讀寫,不支援視圖;
寫表是追加(Append)模式
采用并發以提高整體吞吐量
避免頻繁送出           

3、Tunnel SDK相關知識

Tunnel SDK中的幾個概念:

基本含義:

session 完成對一張表或partition上傳下載下傳的的過程,稱為一個session
request 在一個session内,請求一次tunnel RESTful API的過程
writer 當request為上傳資料時,需要打開一個writer,将資料序列化的寫入odps背景           

cfile檔案:

Block 當并發上傳資料時,blockID就是不同的writer的辨別,其對應背景的一個cfile。           

互相關系:

session由一到多個request完成
同一個upload session中,使用者可以同時打開多個cfile檔案中的writer,多線程或多程序的并發上傳資料
由于每一個block對應背景一個cfile檔案,是以同一個session,兩次打開同一個block就會導緻覆寫行為,即隻保留最後一次close writer對應的資料。           

主要接口:

tabletunnel:通路tunnel服務的入口類,用來對maxcompute和tunnel進行通路
uploadsession:上傳會話,包括會話的各種屬性、動作以及通過會話進行寫操作的方法
downloadsession:下載下傳會話,包括會話的各種屬性、動作以及通過會話進行讀操作的方法           

TableTunnel接口定義:

生命周期:從TableTunnel執行個體被建立開始,一直到程式結束。
提供方法:建立Upload對象和Download對象的方法
createDownloadSession:建立下載下傳會話對象
createUploadSession:建立上傳會話對象
getDownloadSession:擷取下載下傳對話對象句柄
getUploadSession:擷取上傳會話對象句柄
注:無論表有無分區,均有兩個方法對應
setEndpoint:設定服務接入點           

UploadSession接口定義:

commit:上傳會話完成、送出
getBlocklist:得到成功上傳的Block的清單
getID:得到上傳會話的ID
getSchema:得到上傳表的schema
getStatus:得到上傳狀态
newRecord:建立Record類型的記錄
openRecordWriter:打開記錄寫入器           

Java+eclipse環境配置

Step01:官網導航中找到并下載下傳odps-sdk-core
Step02:下載下傳eclipse并安裝、配置
Step03:在eclipse中建立Java Project
Step04:将1中下載下傳的壓縮包中的jar包添加到項目的路徑中。           

簡單上傳執行個體:

處理流程:
建立阿裡雲賬号->建立表通道->建立上傳會話->讀取檔案->寫入記錄->上傳會話送出
需要處理:
1、提供輸入參數,通過run configuration的arguments,添加到program arguments裡。
-f <source_file> -c <config_file> -t <odps table> -p <partition_spec> -fd <field_delimiter>

2、建表,增加分區
在maxcompute中建表,建立相應分區
3、上傳完成後,檢查表中的結果。           

簡單下載下傳執行個體

處理流程:
建立阿裡雲賬号->建立表通道->建立下載下傳會話->讀取記錄->寫入檔案
需要處理:
1、提供輸入參數,通過run configuration中的arguments,添加到program arguments裡:
-f <target_file> -c <config_file> -t <odps_table> -p <partition_spec> -fd <field_delimiter>
2、下載下傳完成後,找到對應檔案,檢查檔案内容是否正确           

多線程上傳執行個體

處理流程:
提供配置資訊-建立阿裡雲賬号-建立表通道-建立上傳會話-建立線程池-将待插入記錄分給不同線程寫入-關閉線程池-将每個線程寫入的塊送出
需要我們做的:
1、将配置參數寫入java腳步(參照odps的配置檔案)
2、建表,增加分區
3、上傳完成後檢查表中的結果           

多線程下載下傳執行個體

處理流程:
提供配置資訊-建立阿裡雲賬号-建立表通道-建立下載下傳會話-建立線程池-配置設定待下載下傳記錄給不同的線程-執行下載下傳任務-關閉線程池
需要我們做的:
1、将配置參數寫入java腳本(參照odps的配置檔案)
2、建表,增加分區
3、下載下傳完成後,輸入到螢幕的結果           

常見問題:

1、一個session的逾時時間:24小時
2、writer close時,将相對應的cfile檔案從tmp目錄挪移到data目錄
3、session commit時,tunnel server将相應session data目錄下的所有cfile檔案挪移到相應表所在目錄,即資料進表中,可以通過SQL進行讀取
4、同一個session中,有一個block id對應的block上傳失敗,需要重傳shi,使用相同的blockid
5、對于tunnel server,一個session對應一個目錄。是以不同的session會産生不同的目錄。這就是不同的session上傳資料互不影響的原因
6、對同一個表上傳資料,隻有一台機器時,基本使用多線程并發就可以了,當需要更多帶寬來支援上傳資料時,使用不同機器不同程序上傳(需要做資料切分)
7、在帶寬最大能達到100M/s時,16-64個線程并發,太多的并發将消耗更多的CPU切換。           
MaxCompute資料的上傳下載下傳1、MaxCompute資料的上傳和下載下傳2、常用參數和Tunnel指令3、Tunnel SDK相關知識