Tunnel的常見問題有哪些-創(chuàng)新互聯(lián)

這篇文章主要介紹“Tunnel的常見問題有哪些”,在日常操作中,相信很多人在Tunnel的常見問題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Tunnel的常見問題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的閩清網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

基本介紹及應(yīng)用場景

Tunnel是MaxCompute提供的離線批量數(shù)據(jù)通道服務(wù),主要提供大批量離線數(shù)據(jù)上傳和下載,
僅提供每次批量大于等于64MB數(shù)據(jù)的場景,小批量流式數(shù)據(jù)場景請使用DataHub實時數(shù)據(jù)通道以獲得更好的性能和體驗。

SDK上傳最佳實踐

import java.io.IOException;import java.util.Date;import com.aliyun.odps.Column;import com.aliyun.odps.Odps;import com.aliyun.odps.PartitionSpec;import com.aliyun.odps.TableSchema;import com.aliyun.odps.account.Account;import com.aliyun.odps.account.AliyunAccount;import com.aliyun.odps.data.Record;import com.aliyun.odps.data.RecordWriter;import com.aliyun.odps.tunnel.TableTunnel;import com.aliyun.odps.tunnel.TunnelException;import com.aliyun.odps.tunnel.TableTunnel.UploadSession;
public class UploadSample {
 private static String accessId = "<your access id>";
 private static String accessKey = "<your access Key>";
 private static String odpsUrl = "http://service.odps.aliyun.com/api";
 private static String project = "<your project>";
 private static String table = "<your table name>";
 private static String partition = "<your partition spec>";
 public static void main(String args[]) {   // 準備工作,僅需做一次
   Account account = new AliyunAccount(accessId, accessKey);
   Odps odps = new Odps(account);
   odps.setEndpoint(odpsUrl);
   odps.setDefaultProject(project);
   TableTunnel tunnel = new TableTunnel(odps);   try {     // 確定寫入分區(qū)
     PartitionSpec partitionSpec = new PartitionSpec(partition);     // 在服務(wù)端創(chuàng)建一個在本表本分區(qū)上有效期24小時的session,24小時內(nèi)該session可以共計上傳20000個Block數(shù)據(jù)
     // 創(chuàng)建Session的時耗為秒級,會在服務(wù)端使用部分資源、創(chuàng)建臨時目錄等,操作較重,因此強烈建議同一個分區(qū)數(shù)據(jù)盡可能復用Session上傳。
     UploadSession uploadSession = tunnel.createUploadSession(project,
         table, partitionSpec);
     System.out.println("Session Status is : "
         + uploadSession.getStatus().toString());
     TableSchema schema = uploadSession.getSchema();     // 準備數(shù)據(jù)后打開Writer開始寫入數(shù)據(jù),準備數(shù)據(jù)后寫入一個Block,每個Block僅能成功上傳一次,不可重復上傳,CloseWriter成功代表該Block上傳完成,失敗可以重新上傳該Block,同一個Session下最多允許20000個BlockId,即0-19999,若超出請CommitSession并且再創(chuàng)建一個新Session使用,以此類推。
     // 單個Block內(nèi)寫入數(shù)據(jù)過少會產(chǎn)生大量小文件 嚴重影響計算性能, 強烈建議每次寫入64MB以上數(shù)據(jù)(100GB以內(nèi)數(shù)據(jù)均可寫入同一Block)
     // 可通過數(shù)據(jù)的平均大小與記錄數(shù)量大致計算總量即 64MB < 平均記錄大小*記錄數(shù) < 100GB
     // maxBlockID服務(wù)端限制為20000,用戶可以根據(jù)自己業(yè)務(wù)需求,每個Session使用一定數(shù)量的block例如100個,但是建議每個Session內(nèi)使用block越多越好,因為創(chuàng)建Session是一個很重的操作
     // 如果創(chuàng)建一個Session后僅僅上傳少量數(shù)據(jù),不僅會造成小文件、空目錄等問題,還會嚴重影響上傳整體性能(創(chuàng)建Session花費秒級,真正上傳可能僅僅用了十幾毫秒)
     int maxBlockID = 20000;     for (int blockId = 0; blockId < maxBlockID; blockId++) {       // 準備好至少64MB以上數(shù)據(jù),準備完成后方可寫入
       // 例如:讀取若干文件或者從數(shù)據(jù)庫中讀取數(shù)據(jù)
       try {         // 在該Block上創(chuàng)建一個Writer,writer創(chuàng)建后任意一段時間內(nèi),若某連續(xù)2分鐘沒有寫入4KB以上數(shù)據(jù),則會超時斷開連接
         // 因此建議在創(chuàng)建writer前在內(nèi)存中準備可以直接進行寫入的數(shù)據(jù)
         RecordWriter recordWriter = uploadSession.openRecordWriter(blockId);         // 將讀取到的所有數(shù)據(jù)轉(zhuǎn)換為Tunnel Record格式并切入
         int recordNumber = 1000000;         for (int index = 0; i < recordNumber; i++) {           // 將第index條原始數(shù)據(jù)轉(zhuǎn)化為odps record
           Record record = uploadSession.newRecord();           for (int i = 0; i < schema.getColumns().size(); i++) {
             Column column = schema.getColumn(i);             switch (column.getType()) {               case BIGINT:
                 record.setBigint(i, 1L);                 break;               case BOOLEAN:
                 record.setBoolean(i, true);                 break;               case DATETIME:
                 record.setDatetime(i, new Date());                 break;               case DOUBLE:
                 record.setDouble(i, 0.0);                 break;               case STRING:
                 record.setString(i, "sample");                 break;               default:                 throw new RuntimeException("Unknown column type: "
                     + column.getType());
             }
           }           // Write本條數(shù)據(jù)至服務(wù)端,每寫入4KB數(shù)據(jù)會進行一次網(wǎng)絡(luò)傳輸
           // 若120s沒有網(wǎng)絡(luò)傳輸服務(wù)端將會關(guān)閉連接,屆時該Writer將不可用,需要重新寫入
           recordWriter.write(record);
         }         // close成功即代表該block上傳成功,但是在整個Session Commit前,這些數(shù)據(jù)是在odps 臨時目錄中不可見的
         recordWriter.close();
       } catch (TunnelException e) {         // 建議重試一定次數(shù)
         e.printStackTrace();
         System.out.println("write failed:" + e.getMessage());
       } catch (IOException e) {         // 建議重試一定次數(shù)
         e.printStackTrace();
         System.out.println("write failed:" + e.getMessage());
       }
     }     // 提交所有Block,uploadSession.getBlockList()可以自行指定需要提交的Block,Commit成功后數(shù)據(jù)才會正式寫入Odps分區(qū),Commit失敗建議重試10次
     for (int retry = 0; retry < 10; ++retry) {       try {         // 秒級操作,正式提交數(shù)據(jù)
         uploadSession.commit(uploadSession.getBlockList());         break;
       } catch (TunnelException e) {
         System.out.println("uploadSession commit failed:" + e.getMessage());
       } catch (IOException e) {
         System.out.println("uploadSession commit failed:" + e.getMessage());
       }
     }
     System.out.println("upload success!");
   } catch (TunnelException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
}

構(gòu)造器舉例說明:

PartitionSpec(String spec):通過字符串構(gòu)造此類對象。

參數(shù):

spec: 分區(qū)定義字符串,比如: pt='1',ds='2'。
因此程序中應(yīng)該這樣配置:private static String partition = "pt='XXX',ds='XXX'";

常見問題

MaxCompute Tunnel是什么?

Tunnel是MaxCompute的數(shù)據(jù)通道,用戶可以通過Tunnel向MaxCompute中上傳或者下載數(shù)據(jù)。目前Tunnel僅支持表(不包括視圖View)數(shù)據(jù)的上傳下載。

BlockId是否可以重復?

同一個UploadSession里的blockId不能重復。也就是說,對于同一個UploadSession,用一個blockId打開RecordWriter,寫入一批數(shù)據(jù)后,調(diào)用close,
然后再commit完成后,寫入成功后不可以重新再用該blockId打開另一個RecordWriter寫入數(shù)據(jù)。 Block默認最多20000個,即0-19999。

Block大小是否存在限制?

一個block大小上限 100GB,強烈建議大于64M的數(shù)據(jù),每一個Block對應(yīng)一個文件,小于64MB的文件統(tǒng)稱為小文件,小文件過多將會影響使用性能。
使用新版BufferedWriter可以更簡單的進行上傳功能避免小文件等問題 Tunnel-SDK-BufferedWriter

Session是否可以共享使用,存在生命周期嗎?

每個Session在服務(wù)端的生命周期為24小時,創(chuàng)建后24小時內(nèi)均可使用,也可以跨進程/線程共享使用,但是必須保證同一個BlockId沒有重復使用,分布式上傳可以按照如下步驟:
創(chuàng)建Session->數(shù)據(jù)量估算->分配Block(例如線程1使用0-100,線程2使用100-200)->準備數(shù)據(jù)->上傳數(shù)據(jù)->Commit所有寫入成功的Block。

Session創(chuàng)建后不使用是否對系統(tǒng)有消耗?

每個Session在創(chuàng)建時會生成兩個文件目錄,如果大量創(chuàng)建而不使用,會導致臨時目錄增多,大量堆積時可能造成系統(tǒng)負擔,請一定避免此類行為,盡量共享利用session。

遇到Write/Read超時或IOException怎么處理?

上傳數(shù)據(jù)時,Writer每寫入8KB數(shù)據(jù)會觸發(fā)一次網(wǎng)絡(luò)動作,如果120秒內(nèi)沒有網(wǎng)絡(luò)動作,服務(wù)端將主動關(guān)閉連接,屆時Writer將不可用,請重新打開一個新的Writer寫入。

建議使用 [Tunnel-SDK-BufferedWriter]接口上傳數(shù)據(jù),該接口對用戶屏蔽了blockId的細節(jié),并且內(nèi)部帶有數(shù)據(jù)緩存區(qū),會自動進行失敗重試。

下載數(shù)據(jù)時,Reader也有類似機制,若長時間沒有網(wǎng)絡(luò)IO會被斷開連接,建議Read過程連續(xù)進行中間不穿插其他系統(tǒng)的接口。

MaxCompute Tunnel目前有哪些語言的SDK?

MaxCompute Tunnel目前提供Java版的SDK。

MaxCompute Tunnel 是否支持多個客戶端同時上傳同一張表?

支持。

MaxCompute Tunnel適合批量上傳還是流式上傳

MaxCompute Tunnel用于批量上傳,不適合流式上傳,流式上傳可以使用[DataHub高速流式數(shù)據(jù)通道],毫秒級延時寫入。

MaxCompute Tunnel上傳數(shù)據(jù)時一定要先存在分區(qū)嗎?

是的,Tunnel不會自動創(chuàng)建分區(qū)。

Dship 與 MaxCompute Tunnel的關(guān)系?

dship是一個工具,通過MaxCompute Tunnel來上傳下載。

Tunnel upload數(shù)據(jù)的行為是追加還是覆蓋?

追加的模式。

Tunnel路由功能是怎么回事?

路由功能指的是Tunnel SDK通過設(shè)置MaxCompute獲取Tunnel Endpoint的功能。因此,SDK可以只設(shè)置MaxCompute的endpoint來正常工作。

用MaxCompute Tunnel上傳數(shù)據(jù)時,一個block的數(shù)據(jù)量大小多大比較合適

沒有一個絕對最優(yōu)的答案,要綜合考慮網(wǎng)絡(luò)情況,實時性要求,數(shù)據(jù)如何使用以及集群小文件等因素。一般,如果數(shù)量較大是持續(xù)上傳的模式,可以在64M - 256M,
如果是每天傳一次的批量模式,可以設(shè)大一些到1G左右

使用MaxCompute Tunnel 下載, 總是提示timeout

一般是endpoint錯誤,請檢查Endpoint配置,簡單的判斷方法是通過telnet等方法檢測網(wǎng)絡(luò)連通性。

通過MaxCompute Tunnel下載,拋出You have NO privilege ‘odps:Select‘ on {acs:odps:*:projects/XXX/tables/XXX}. project ‘XXX‘ is protected的異常

該project開啟了數(shù)據(jù)保護功能,用戶操作這是從一個項目的數(shù)據(jù)導向另一個項目,這需要該project的owner操作。

Tunnel上傳拋出異常ErrorCode=FlowExceeded, ErrorMessage=Your flow quota is exceeded.**

Tunnel對請求的并發(fā)進行了控制,默認上傳和下載的并發(fā)Quota為2000,任何相關(guān)的請求發(fā)出到結(jié)束過程中均會占用一個Quota單位。若出現(xiàn)類似錯誤,有如下幾種建議的解決方案:
1 sleep一下再重試;
2 將project的tunnel并發(fā)quota調(diào)大,需要聯(lián)系管理員評估流量壓力;
3 報告project owner調(diào)查誰占用了大量并發(fā)quota,控制一下。

到此,關(guān)于“Tunnel的常見問題有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文名稱:Tunnel的常見問題有哪些-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://muchs.cn/article32/ddpcsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)網(wǎng)站維護、網(wǎng)站排名、微信公眾號、面包屑導航定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作