MaxCompute Tunnel上傳典型問題場景2018-08-29

數據問題

Q:使用Tunnel Java SDK上傳數據,上傳數據可以自動分配到各個分區嗎?

A:目前Tunnel是無法自動上傳數據并自動分配到各個分區的:每一次上傳只支持數據上傳到一張表或表的一個分區,有分區的表一定要指定上傳的分區,多級分區一定要指定到末級分區。關于JAVA SDK可參考:Java SDK

Q:使用Tunnel Java SDK上傳數據,如果是分區表,SDK能夠動態根據數據創建不同的分區嗎?

A:分區需要首先創建好,在使用SDK上傳數據時指定。您也可以先把數據上傳到MaxCompute上的表中,再用SQL語句動態分區。

Q:使用Tunnel命令行tunnel upload D:\test test/pt="time" 在 DataIDE上進行分區上傳為什么報錯:FAILED: error occurred while running tunnel command?

A:DataIDE是不支持MaxCompute Tunnel命令行工具的upload語句的。

Q:利用Tunnel命令行工具上傳數據時,共分為50個block,開始一切正常,但是在第22個block時,出現Upload fail,retry 5次后,直接跳過開始上傳第23個block,為什么會發生這種情況?

A:Block 的概念:一個 block 對應一個HTTP request,多個 block 的上傳可以并發而且是原子的,一次同步請求要么成功要么失敗,不會污染其他的 block。

重傳retry有次數的限制的,當重傳的次數超過了這個限制,就會繼續上傳下一個block。上傳完成后,可以通過select count(*)語句,檢查是否有數據丟失。

Q:本地服務器每天采集的網站日志有10GB,需要上傳至MaxCompute,在使用Tunnel Upload命令上傳達到的速度約300KB/S 如何提升上傳速度?

A:Tunnel Upload命令上傳是不設速度限制的。上傳速度的瓶頸在網絡帶寬以及服務器性能。為了提升性能,可以考慮分區分表,在多臺ECS上傳下載數據。

Q:如何在Shell腳本中將一個TXT文件中的數據上傳到MaxCompute的表中, 即把這兩條命令組合成一條?命令如下:

/odpscmd/bin/odpscmd

tunnel upload "$FILE" project.table

A:可參考客戶端設置命令行客戶端的啟動參數,在Shell中啟動命令是:

/odpscmd/bin/odpscmd -e “tunnel upload "$FILE" project.table”

Q:MaxCompute使用TunnelUpload命令上傳數據,如果數據里面有回車或空格為什么上傳失敗?

A:如果數據里有回車空格,可以給數據設置不同與回車或空格的分隔符后,用-rd和-fd指定對應的分隔符實現數據的上傳。如果無法更換數據中的分隔符,可以將數據作為單獨一行上傳,然后使用UDF解析。

例如下列數據中包含回車,使用“,”作為列分隔符rd,使用“@”作為行分隔符fd,可以正常上傳:

數據內容

shopx,x_id,100@

shopy,y_id,200@

shopz,z_i

d,300@

上傳命令

odps@ MaxCompute_DOC>tunnel u d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false -fd "," -rd "@";

上傳結果

+-----------+-------------+-------------+-----------+--------+| shop_name | customer_id | total_price | sale_date | region |+-----------+-------------+-------------+-----------+--------+| shopx? ? | x_id? ? ? ? | 100.0? ? ? | 201312? ? | hangzhou || shopy? | y_id? ? ? ? | 200.0? ? ? | 201312? ? | hangzhou || shopz? | z_idd? ? ? | 300.0? ? ? | 201312? ? | hangzhou |+-----------+-------------+-------------+-----------+--------+

Q:MaxCompute使用TunnelUpload命令上傳數據,使用的","進行列分割, 現在description字段里, 數據有逗號, 或者"|"符號, 這種情況怎么分割?

A:如果數據描述字段內本身有逗號,可以考慮轉換數據的分隔符為其他符號,再通過-fd指定為其他分隔符進行上傳,舉例如下:

用戶有一個崗位需求的EXCEL數據在Windows環境下需要通過Tunnel Upload命令上傳,表格內本身包含“,”。首先可通過Windows環境設置EXCEL轉換為CSV文件的默認分隔符:Win7系統在控制面板時鐘、語言和區域選擇更改日期、時間或數字格式,點擊其他設置。本例中考慮到原始數據中沒有“”字符,設置分隔符為“

”,如下圖所示:

完成設置后,使用EXCEL將數據另存為CSV文件,并且利用Notepad++等文本編輯工具轉碼為UTF-8編碼(Tunnel默認使用的編碼格式),檢查是否文件分隔符已變成“$”:

標題$所在地$薪資$公司$公司介紹鏈接$公司類型$公司規模$所屬行業$工作經驗$學歷$所招人數$發布時間$標簽$職位信息$上班地址$公司信息$頁面網址$采集時間

使用TunnelUpload命令上傳數據并指定分隔符(需預先在MaxCompute上創建好表格),即可成功上傳:

odps@ MaxCompute_DOC>tunnel u d:\12JD.CSV JD2 -s false -fd "$";Upload session: 201808201531180d47df0b0b18fa45Startupload:d:\12JD.CSVUsing\r\ntosplitrecordsUploadinstrictschemamode:trueTotalbytes:111028Splitinputto1blocks2018-08-2015:31:18uploadblock:'1'2018-08-2015:31:18uploadblockcomplete, blockid=1uploadcomplete, average speedis108.4KB/sOK

Q:MaxCompute使用Tunnel Upload命令上傳數據。Tunnel Upload命令默認使用逗號分割的,但數據CSV文件也是用逗號分割的:文件里面有一列數據里面本身就含有用引號引起來的逗號。這種情況如何處理?

A:CSV文件使用其他分隔符,可以通過 -fd參數指定。

通常來說,如果數據例有很多符號,可能與分隔符發生沖突,可以自定義數據中分隔符來避免沖突,比如#@

@ 或者)*#@

@$。

Q:MaxCompute使用Tunnel Upload命令上傳數據時失敗,內存溢出報錯java.lang.OutOfMemoryError:Java heap space是什么原因?

A:從報錯上看是數據上傳的時候的內存溢出了。目前TunnelUpload命令是支持海量數據的上傳的,如果出現內存溢出,可能是因為數據的行分隔符和列分隔符設置錯誤,導致整個文本會被認為是同一條數據,緩存到內存里再做split,導致內存溢出報錯。

這種情況下可以先拿少量的數據測試,把-td及-fd調試過了后再上傳拿全量的數據。

Q:MaxCompute使用Tunnel Upload命令上傳數據,需要上傳很多個數據文件到一個表中,是否有方法寫一個腳本就可以把文件夾下的所有數據文件循環上傳上去?

A:TunnelUpload命令上傳支持文件或目錄(指一級目錄)的上傳。

例如下述命令,上傳數據為文件夾d:data,上傳命令為:

odps@ MaxCompute_DOC>tunnel u d:\data sale_detail/sale_date=201312,region=hangzhou -s false;

詳情請參見Tunnel命令操作

Q:導入文件夾會報錯:字段不匹配colum mismatch,但是這個文件夾下的文件單獨導入時又是可以導入的,是因為文件太大嗎?

A:這種情況下,可以在upload命令后加上-dbr=false -s true對數據格式進行驗證。出現column mismatch通常是由于列數對不上導致的:可能性較大的原因包括列分隔符設置的不對或文件的最后有空行,導致空行進行分隔符分割的時候分不出那么多列。

Q:MaxCompute使用Tunnel Upload命令上傳兩個文件,上傳完第一個文件命令結束之后,第二個文件不會上傳是什么原因?沒有報錯信息,就是第一個文件上傳之后第二個文件上傳命令不執行了。上傳命令如下:

D:\odps\bin\odpscmd.bat -e"tunnel upload d:\data1.txt sale_detail/sale_data=201312 -fd="$" -mbr=5 --scan=true; "

D:\odps\bin\odpscmd.bat -e"tunnel upload d:\data2.txt sale_detail/sale_data=201312 -fd="$" -mbr=5 --scan=true; "

A:當使用老版本MaxCompute命令行客戶端,上傳參數有--scan的時候,續跑模式的參數傳遞有問題,將--scan=true去掉重試即可。

Q:MaxCompute使用Tunnel Upload命令把一個目錄下的所有文件上傳到一個表里,并且想要自動建立分區,具體的命令是tunnel upload? /data/2018/20180813/*.json app_log /dt=20180813 -fd '@@' -acp true;,執行報錯:

Unrecognized option: -acp

FAILED: error occurred while running tunnel command

A:出現這種報錯通常是因為是用了不支持的命令或字符。MaxCompute使用Tunnel Upload命令上傳不支持通配符及正則表達式。

Q:MaxCompute使用Tunnel Upload命令上傳文件數據報錯,是否有像MySQL的-f的強制跳過錯誤數據繼續進行上傳的命令?

A:出現這種錯誤是因為數據格式問題,例如數據類型不對,可參考Tunnel命令操作,使用-dbr true參數忽略臟數據(多列,少列,列數據類型不匹配等情況)。-dbr參數默認用false,表示不忽視臟數據,當值為true時,將不符合表定義的數據全部忽略。

Q:MaxCompute使用Tunnel Upload命令上傳文件數據報錯如下是為什么?

java.io.IOException: RequestId=XXXXXXXXXXXXXXXXXXXXXXXXX, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.? ? ? ? at com.aliyun.odps.tunnel.io.TunnelRecordWriter.close(TunnelRecordWriter.java:93)? ? ? ? at com.xgoods.utils.aliyun.maxcompute.OdpsTunnel.upload(OdpsTunnel.java:92)? ? ? ? at com.xgoods.utils.aliyun.maxcompute.OdpsTunnel.upload(OdpsTunnel.java:45)? ? ? ? at com.xeshop.task.SaleStatFeedTask.doWork(SaleStatFeedTask.java:119)? ? ? ? at com.xgoods.main.AbstractTool.excute(AbstractTool.java:90)? ? ? ? at com.xeshop.task.SaleStatFeedTask.main(SaleStatFeedTask.java:305)

A:這個錯誤的提示是當前已經是在上傳或下載中,所以無法再操作。

Q:MaxCompute使用Tunnel SDK上傳文件數據報錯重復提交是為什么?

RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. java.io.IOException: RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.at com.aliyun.odps.tunnel.io.TunnelRecordWriter.close(TunnelRecordWriter.java:93)

A:由上述報錯可見,這個問題是在準備close這個writer時出現的,可能有以下幾種情況:

對一個已經關閉的writer做了關閉操作。

這個writer對應的session已經關閉。

該session已經被提交過。

可以針對上述可能出現的原因進行排查,比如打印當前writer和session的狀態。

Q:MaxCompute使用Tunnel SDK上傳數據時,編寫完UDF打成Jar包后上傳,對Jar包大小有要求嗎?

A:Jar包不能超過10M, 如果Jar超過10M,建議轉用MaxCompute Tunnel Upload命令行上傳數據。

Q:MaxCompute使用Tunnel Upload命令行上傳數據,對數據大小有限制嗎?

A:Tunnel Upload命令行通常不會限制需上傳的數據大小。

Q:MaxCompute使用Tunnel Upload命令行上傳CSV文件,如何跳過第一行表頭上傳其他數據?

A:建議使用-h true參數,跳過table header.

Q:使用Tunnel批量數據通道SDK來導入MaxCompute數據庫是否有分區限制?

A:使用Tunnel批量數據通道SDK來導入MaxCompute數據庫。目前支持的是6萬個分區。

分區數量過多,會給統計和分析帶來極大的不便。MaxCompute會限制單個作業中最多不能超過一定數量的instance。作業的instance和用戶輸入的數據量和分區數量是密切相關的,所以建議首先評估下業務,選擇合適的分區策略,避免分區過多帶來的影響。

關于分區表的更多信息請參考分區

此外,MaxCompute也支持通過Python SDK來進行Tunnel批量上傳,請參考Python SDK中的數據上傳/下載配置

Q:要一次性上傳8000W的數據,最后在odps tunnel recordWriter.close()時報錯,報錯內容如下:

ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.

A:這個報錯說明session的狀態錯誤,建議重新創建個session重新上傳一下數據。從報錯上看,很可能是前面的操作里已經close了這個session,或者已經commit了。對于不同的分區,需要每個分區都是單獨的一個session。

為了防止多次commit導致的這種報錯,可以先檢查數據上傳是否已經傳成功,如果失敗的話重新上傳一次。可參考多線程上傳示例

Q:如何使用TunnelBufferedWriter規避使用Tunnel SDK進行批量數據上傳出錯的問題?

A:MaxCompute Java SDK在0.21.3-public版本之后新增了BufferredWriter的SDK,簡化了數據上傳,并且提供了容錯功能。

BufferedWriter對用戶隱藏了block的概念:從用戶角度看,就是在session上打開一個writer然后進行寫記錄即可。具體實現時,BufferedWriter先將記錄緩存在客戶端的緩沖區中,并在緩沖區填滿之后打開一個http連接進行上傳。

BufferedWriter會盡最大可能容錯,保證數據上傳上去。使用方法請參考BufferedWriter使用指南

Q:MaxCompute使用TunnelUpload命令行上傳CSV文件,為什么導入成功后原文本中有很大一部分內容莫名消失,被“ - ”取代?

A:這種情況很可能是因為數據編碼格式不對導致上傳到表的數據不對,或者是分隔符使用錯誤。建議規范原始數據后上傳.

Q:MaxCompute使用Tunnel Upload命令行上傳是否支持引用一個表的配置?

A:可以shell腳本方式執行Tunnel Upload命令行上傳實現。可通過/odpscmd/bin/odpscmd -e執行腳本,并在腳本內粘貼表格配置。

Q:MaxCompute使用Tunnel SDK上傳數據時,經常會發現Select查詢慢,SQL語句的執行性能不好的情況。

遇到類似情況,可能原因是MaxCompute小文件過多,從而影響性能導致的。如何處理小文件過多的問題?

A:

小文件產生的原因:

MaxCompute使用的分布式文件系統是按塊Block存放,通常文件大小比塊大小小的文件(默認塊大小為64M),叫做小文件。

目前MaxCompute有以下場景可以產生小文件:

Reduce計算過程會產生大量小文件;

Tunnel數據采集過程中會生成小文件;

Job執行過程中生成的各種臨時文件、回收站保留的過期的文件等,主要分類為:

TABLE_BACKUP:回收站中超過保留天數的表

FUXI_JOB_TMP:作業運行臨時目錄

TMP_TABLE:作業運行中產生的臨時表

INSTANCE:作業運行時保留在meta表中的日志

LIFECYCLE:超過生命周期的的數據表或分區

INSTANCEPROFILE:作業提交及執行完成后的profile信息

VOLUME_TMP:沒有meta信息,但在pangu上有路徑的數據

TEMPRESOURCE:用戶自定義函數使用的一次性臨時資源文件

FAILOVER:系統發生failover時保留的臨時文件

小文件過多會帶來以下影響:

影響Map Instance性能:默認情況下一個小文件對應一個instance,造成浪費資源,影響整體的執行性能。

過多的小文件給分布式文件系統帶來壓力,且影響空間的有效利用,嚴重時會直接導致文件系統不可用。

查看表中的小文件數量命令:

desc extended + 表名

小文件處理方式

不同原因產生的小文件,需要有不同的處理方法:

(1)Reduce過程中產生的小文件

使用insert overwrite源表(或分區),或者寫入到新表刪除源表。

(2)Tunnel數據采集過程中產生的小文件

調用Tunnel SDK時,當buffer達到64MB時提交一次;

使用console時避免頻繁上傳小文件,建議積累較大時一次性上傳;

如果導入的是分區表,建議給分區設置生命周期,過期不用的數據自動清理;

Insert overwrite源表(或分區):

ALTER合并模式,通過命令行進行合并:set odps.merge.cross.paths=true;set odps.merge.max.partition.count=100; --默認優化10個分區,此時設置為優化100個分區。ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;

臨時表

在用臨時表建議創建時都加上生命周期,到期后垃圾回收自動回收。

網絡問題

Q:MaxCompute使用Tunnel Upload命令上傳數據時為什么報錯java.io.IOException: Error writing request body to server?

A:這是一個上傳數據到服務器的時的異常,通常是因為上傳過程中的網絡鏈接斷開/超時導致的:

可能是用戶的數據源并非是來自本地文件,而是需要從諸如數據庫等一類的地方獲取,導致數據在寫入的過程中還需要等待數據獲取導致的超時。目前UploadSession在上傳數據的過程中,如果600秒沒有數據上傳,則被認為超時。

用戶通過公網的Endpoint來做數據上傳,由于公網網絡質量不穩定導致超時。

解決方法:

在上傳的過程中,先把獲取數據,再調用Tunnel SDK上傳數據。

一個block可以上傳64M-1G的數據,最好不要超過1萬條數據以免帶來重試的時間導致的超時。一個Session可以掛最多2萬個block。

如果用戶的數據是在ECS上,可以參考訪問域名和數據中心配置合適的Endpoint,可以提速并節省費用。

Q:MaxCompute使用Tunnel Upload命令行上傳數據,設置了經典網絡的Endpoint,但為什么會連接到外網的Tunnel Endpoint?

A:配置文件odps_config.ini里除了endpoint之外還需要配置tunnel_endpoint。請參考訪問域名和數據中心進行配置。目前只有上海region不需要設置tunnel endpoint

Q:MaxCompute使用Tunnel Upload命令行上傳數據是否支持限速?上傳速率太快的話可能會占用服務器過多的I/O性能。

A:目前MaxCompute使用Tunne lUpload命令行不支持限速,需要通過SDK單獨處理。

計費問題

Q:MaxCompute使用Tunnel Upload命令行上傳數據計費的帶寬,是按照數據壓縮前還是壓縮后的大小計費?

A:按照Tunnel壓縮后的帶寬進行計費。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容