這篇文章主要介紹“Tunnel的常見(jiàn)問(wèn)題有哪些”,在日常操作中,相信很多人在Tunnel的常見(jiàn)問(wèn)題有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Tunnel的常見(jiàn)問(wèn)題有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Tunnel是MaxCompute提供的離線(xiàn)批量數(shù)據(jù)通道服務(wù),主要提供大批量離線(xiàn)數(shù)據(jù)上傳和下載,
僅提供每次批量大于等于64MB數(shù)據(jù)的場(chǎng)景,小批量流式數(shù)據(jù)場(chǎng)景請(qǐng)使用DataHub實(shí)時(shí)數(shù)據(jù)通道以獲得更好的性能和體驗(yàn)。
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[]) { // 準(zhǔn)備工作,僅需做一次
Account account = new AliyunAccount(accessId, accessKey);
Odps odps = new Odps(account);
odps.setEndpoint(odpsUrl);
odps.setDefaultProject(project);
TableTunnel tunnel = new TableTunnel(odps); try { // 確定寫(xiě)入分區(qū)
PartitionSpec partitionSpec = new PartitionSpec(partition); // 在服務(wù)端創(chuàng)建一個(gè)在本表本分區(qū)上有效期24小時(shí)的session,24小時(shí)內(nèi)該session可以共計(jì)上傳20000個(gè)Block數(shù)據(jù)
// 創(chuàng)建Session的時(shí)耗為秒級(jí),會(huì)在服務(wù)端使用部分資源、創(chuàng)建臨時(shí)目錄等,操作較重,因此強(qiáng)烈建議同一個(gè)分區(qū)數(shù)據(jù)盡可能復(fù)用Session上傳。
UploadSession uploadSession = tunnel.createUploadSession(project,
table, partitionSpec);
System.out.println("Session Status is : "
+ uploadSession.getStatus().toString());
TableSchema schema = uploadSession.getSchema(); // 準(zhǔn)備數(shù)據(jù)后打開(kāi)Writer開(kāi)始寫(xiě)入數(shù)據(jù),準(zhǔn)備數(shù)據(jù)后寫(xiě)入一個(gè)Block,每個(gè)Block僅能成功上傳一次,不可重復(fù)上傳,CloseWriter成功代表該Block上傳完成,失敗可以重新上傳該Block,同一個(gè)Session下最多允許20000個(gè)BlockId,即0-19999,若超出請(qǐng)CommitSession并且再創(chuàng)建一個(gè)新Session使用,以此類(lèi)推。
// 單個(gè)Block內(nèi)寫(xiě)入數(shù)據(jù)過(guò)少會(huì)產(chǎn)生大量小文件 嚴(yán)重影響計(jì)算性能, 強(qiáng)烈建議每次寫(xiě)入64MB以上數(shù)據(jù)(100GB以?xún)?nèi)數(shù)據(jù)均可寫(xiě)入同一Block)
// 可通過(guò)數(shù)據(jù)的平均大小與記錄數(shù)量大致計(jì)算總量即 64MB < 平均記錄大小*記錄數(shù) < 100GB
// maxBlockID服務(wù)端限制為20000,用戶(hù)可以根據(jù)自己業(yè)務(wù)需求,每個(gè)Session使用一定數(shù)量的block例如100個(gè),但是建議每個(gè)Session內(nèi)使用block越多越好,因?yàn)閯?chuàng)建Session是一個(gè)很重的操作
// 如果創(chuàng)建一個(gè)Session后僅僅上傳少量數(shù)據(jù),不僅會(huì)造成小文件、空目錄等問(wèn)題,還會(huì)嚴(yán)重影響上傳整體性能(創(chuàng)建Session花費(fèi)秒級(jí),真正上傳可能僅僅用了十幾毫秒)
int maxBlockID = 20000; for (int blockId = 0; blockId < maxBlockID; blockId++) { // 準(zhǔn)備好至少64MB以上數(shù)據(jù),準(zhǔn)備完成后方可寫(xiě)入
// 例如:讀取若干文件或者從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)
try { // 在該Block上創(chuàng)建一個(gè)Writer,writer創(chuàng)建后任意一段時(shí)間內(nèi),若某連續(xù)2分鐘沒(méi)有寫(xiě)入4KB以上數(shù)據(jù),則會(huì)超時(shí)斷開(kāi)連接
// 因此建議在創(chuàng)建writer前在內(nèi)存中準(zhǔn)備可以直接進(jìn)行寫(xiě)入的數(shù)據(jù)
RecordWriter recordWriter = uploadSession.openRecordWriter(blockId); // 將讀取到的所有數(shù)據(jù)轉(zhuǎn)換為T(mén)unnel 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ù)端,每寫(xiě)入4KB數(shù)據(jù)會(huì)進(jìn)行一次網(wǎng)絡(luò)傳輸
// 若120s沒(méi)有網(wǎng)絡(luò)傳輸服務(wù)端將會(huì)關(guān)閉連接,屆時(shí)該Writer將不可用,需要重新寫(xiě)入
recordWriter.write(record);
} // close成功即代表該block上傳成功,但是在整個(gè)Session Commit前,這些數(shù)據(jù)是在odps 臨時(shí)目錄中不可見(jiàn)的
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ù)才會(huì)正式寫(xiě)入Odps分區(qū),Commit失敗建議重試10次
for (int retry = 0; retry < 10; ++retry) { try { // 秒級(jí)操作,正式提交數(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)造器舉例說(shuō)明:
PartitionSpec(String spec):通過(guò)字符串構(gòu)造此類(lèi)對(duì)象。
參數(shù):
spec: 分區(qū)定義字符串,比如: pt='1',ds='2'。
因此程序中應(yīng)該這樣配置:private static String partition = "pt='XXX',ds='XXX'";
Tunnel是MaxCompute的數(shù)據(jù)通道,用戶(hù)可以通過(guò)Tunnel向MaxCompute中上傳或者下載數(shù)據(jù)。目前Tunnel僅支持表(不包括視圖View)數(shù)據(jù)的上傳下載。
同一個(gè)UploadSession里的blockId不能重復(fù)。也就是說(shuō),對(duì)于同一個(gè)UploadSession,用一個(gè)blockId打開(kāi)RecordWriter,寫(xiě)入一批數(shù)據(jù)后,調(diào)用close,
然后再commit完成后,寫(xiě)入成功后不可以重新再用該blockId打開(kāi)另一個(gè)RecordWriter寫(xiě)入數(shù)據(jù)。 Block默認(rèn)最多20000個(gè),即0-19999。
一個(gè)block大小上限 100GB,強(qiáng)烈建議大于64M的數(shù)據(jù),每一個(gè)Block對(duì)應(yīng)一個(gè)文件,小于64MB的文件統(tǒng)稱(chēng)為小文件,小文件過(guò)多將會(huì)影響使用性能。
使用新版BufferedWriter可以更簡(jiǎn)單的進(jìn)行上傳功能避免小文件等問(wèn)題 Tunnel-SDK-BufferedWriter
每個(gè)Session在服務(wù)端的生命周期為24小時(shí),創(chuàng)建后24小時(shí)內(nèi)均可使用,也可以跨進(jìn)程/線(xiàn)程共享使用,但是必須保證同一個(gè)BlockId沒(méi)有重復(fù)使用,分布式上傳可以按照如下步驟:
創(chuàng)建Session->數(shù)據(jù)量估算->分配Block(例如線(xiàn)程1使用0-100,線(xiàn)程2使用100-200)->準(zhǔn)備數(shù)據(jù)->上傳數(shù)據(jù)->Commit所有寫(xiě)入成功的Block。
每個(gè)Session在創(chuàng)建時(shí)會(huì)生成兩個(gè)文件目錄,如果大量創(chuàng)建而不使用,會(huì)導(dǎo)致臨時(shí)目錄增多,大量堆積時(shí)可能造成系統(tǒng)負(fù)擔(dān),請(qǐng)一定避免此類(lèi)行為,盡量共享利用session。
上傳數(shù)據(jù)時(shí),Writer每寫(xiě)入8KB數(shù)據(jù)會(huì)觸發(fā)一次網(wǎng)絡(luò)動(dòng)作,如果120秒內(nèi)沒(méi)有網(wǎng)絡(luò)動(dòng)作,服務(wù)端將主動(dòng)關(guān)閉連接,屆時(shí)Writer將不可用,請(qǐng)重新打開(kāi)一個(gè)新的Writer寫(xiě)入。
建議使用 [Tunnel-SDK-BufferedWriter]接口上傳數(shù)據(jù),該接口對(duì)用戶(hù)屏蔽了blockId的細(xì)節(jié),并且內(nèi)部帶有數(shù)據(jù)緩存區(qū),會(huì)自動(dòng)進(jìn)行失敗重試。
下載數(shù)據(jù)時(shí),Reader也有類(lèi)似機(jī)制,若長(zhǎng)時(shí)間沒(méi)有網(wǎng)絡(luò)IO會(huì)被斷開(kāi)連接,建議Read過(guò)程連續(xù)進(jìn)行中間不穿插其他系統(tǒng)的接口。
MaxCompute Tunnel目前提供Java版的SDK。
支持。
MaxCompute Tunnel用于批量上傳,不適合流式上傳,流式上傳可以使用[DataHub高速流式數(shù)據(jù)通道],毫秒級(jí)延時(shí)寫(xiě)入。
是的,Tunnel不會(huì)自動(dòng)創(chuàng)建分區(qū)。
dship是一個(gè)工具,通過(guò)MaxCompute Tunnel來(lái)上傳下載。
追加的模式。
路由功能指的是Tunnel SDK通過(guò)設(shè)置MaxCompute獲取Tunnel Endpoint的功能。因此,SDK可以只設(shè)置MaxCompute的endpoint來(lái)正常工作。
沒(méi)有一個(gè)絕對(duì)最優(yōu)的答案,要綜合考慮網(wǎng)絡(luò)情況,實(shí)時(shí)性要求,數(shù)據(jù)如何使用以及集群小文件等因素。一般,如果數(shù)量較大是持續(xù)上傳的模式,可以在64M - 256M,
如果是每天傳一次的批量模式,可以設(shè)大一些到1G左右
一般是endpoint錯(cuò)誤,請(qǐng)檢查Endpoint配置,簡(jiǎn)單的判斷方法是通過(guò)telnet等方法檢測(cè)網(wǎng)絡(luò)連通性。
該project開(kāi)啟了數(shù)據(jù)保護(hù)功能,用戶(hù)操作這是從一個(gè)項(xiàng)目的數(shù)據(jù)導(dǎo)向另一個(gè)項(xiàng)目,這需要該project的owner操作。
Tunnel對(duì)請(qǐng)求的并發(fā)進(jìn)行了控制,默認(rèn)上傳和下載的并發(fā)Quota為2000,任何相關(guān)的請(qǐng)求發(fā)出到結(jié)束過(guò)程中均會(huì)占用一個(gè)Quota單位。若出現(xiàn)類(lèi)似錯(cuò)誤,有如下幾種建議的解決方案:
1 sleep一下再重試;
2 將project的tunnel并發(fā)quota調(diào)大,需要聯(lián)系管理員評(píng)估流量壓力;
3 報(bào)告project owner調(diào)查誰(shuí)占用了大量并發(fā)quota,控制一下。
到此,關(guān)于“Tunnel的常見(jiàn)問(wèn)題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
本文名稱(chēng):Tunnel的常見(jiàn)問(wèn)題有哪些-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article32/ddpcsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站排名、微信公眾號(hào)、面包屑導(dǎo)航、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容