MaxCompute Tunnel上傳典型問題場景

摘要: 關於MaxCompute Tunnel上傳的全部問題,您想知道的都在這裏,持續更新哦!若是您有任何疑惑和需求,歡迎留言!html

數據問題
Q:使用Tunnel Java SDK上傳數據,上傳數據能夠自動分配到各個分區嗎?
A:目前Tunnel是沒法自動上傳數據並自動分配到各個分區的:每一次上傳只支持數據上傳到一張表或表的一個分區,有分區的表必定要指定上傳的分區,多級分區必定要指定到末級分區。關於JAVA SDK可參考:Java SDK。java

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語句的。shell

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上傳下載數據。json

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解析。session

例以下列數據中包含回車,使用「,」做爲列分隔符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_id
d 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: 201808201531180d47df0b0b18fa45
Start upload:d:12JD.CSV
Using rn to split records
Upload in strict schema mode: true
Total bytes:111028 Split input to 1 blocks
2018-08-20 15:31:18 upload block: '1'
2018-08-20 15:31:18 upload block complete, blockid=1
upload complete, average speed is 108.4 KB/s
OK
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:odpsbinodpscmd.bat -e"tunnel upload d:data1.txt sale_detail/sale_data=201312 -fd="$" -mbr=5 --scan=true; "

D:odpsbinodpscmd.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命令行上傳數據,若是數據使用空格做爲列分隔符,或須要對數據作正則表達式過濾時該如何處理?
A:Tunnel Upload命令行不支持正則表達式。若是數據使用空格做爲列分隔符,或須要對數據作正則表達式過濾時可藉助MaxCompute的UDF自定義函數功能。

首先,將數據做爲單列數據上傳。本例中原始數據以下,列分割符爲空格,行分隔符爲回車,而且須要取的部分數據在引號內,部分數據例如"-"須要被過濾。這種複雜的需求可經過正則表達式實現。

10.21.17.2 [24/Jul/2018:00:00:00 +0800] - "GET https://help.aliyun.com/docum...l" 200 0 81615 81615 "-" "iphone" - HIT - - 0_0_0 001 - - - -
10.17.5.23 [24/Jul/2018:00:00:00 +0800] - "GET https://help.aliyun.com/docum...l" 206 0 49369 49369 "-" "huawei" - HIT - - 0_0_0 002 - - - -
10.24.7.16 [24/Jul/2018:00:00:00 +0800] - "GET https://help.aliyun.com/docum...l" 206 0 83821 83821 "-" "vivo" - HIT - - 0_0_0 003 - - - -
爲使數據單列上傳,首先在MaxCompute項目空間內建立一個單列的表格用於接收數據:
odps@ bigdata_DOC>create table userlog1(data string);

使用一個不存在的列分隔符 "u0000"上傳數據,從而達到不分割列的效果:
odps@ bigdata_DOC>tunnel upload C:userlog.txt userlog1 -s false -fd "u0000" -rd "n";

完成原始數據上傳後,使用MaxCompute IntelliJ IDEA編寫一個Python UDF(您也可使用JAVA UDF,注意使用Python UDF需提交工單申請權限),詳情可參見Python開發使用須知。

使用代碼以下:

from odps.udf import annotate
from odps.udf import BaseUDTF
import re #此處引入正則函數
regex = '([(d.)]+) [(.?)] - "(.?)" (d+) (d+) (d+) (d+) "-" "(.?)" - (.?) - - (.?) (.?) - - - -' #使用的正則表達式

line -> ip,date,request,code,c1,c2,c3,ua,q1,q2,q3

@annotate('string -> string,string,string,string,string,string,string,string,string,string,string') #請注意string數量和真實數據保持一致,本例中有11列。
class ParseAccessLog(BaseUDTF):

def process(self, line):
    try:
        t = re.match(regex, line).groups()
        self.forward(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9], t[10])
    except:
        pass

完成函數的編寫後,選擇上傳代碼。

圖片描述

上傳時請注意選擇當前使用的項目。

圖片描述

完成上傳後,註冊函數並填寫函數名稱,本例中函數名稱爲ParseAccessLog。

圖片描述

函數上傳完成後,就可使用編寫的UDF函數處理上傳到表格userlog1的原始數據了,注意不要寫錯列的名稱,本例中爲data。您可使用正常的SQL語法,新建一個表格userlog2用於存放處理後的數據。

odps@ bigdata_DOC>create table userlog2 as select ParseAccessLog(data) as (ip,date,request,code,c1,c2,c3,ua,q1,q2,q3) from userlog1;

完成處理後,能夠觀察到目標表已建立,數據成功分列。

ip date request code c1 c2 c3 ua q1 q2 q3
10.21.17.2 24/Jul/2018:00:00:00 +0800 GET https://help.aliyun.com/docum... 200 0 81615 81615 iphone HIT 0_0_0 001
10.17.5.23 24/Jul/2018:00:00:00 +0800 GET https://help.aliyun.com/docum... 206 0 4936 4936 huawei HIT 0_0_0 002
10.24.7.16 24/Jul/2018:00:00:00 +0800 GET https://help.aliyun.com/docum... 206 0 83821 83821 vivo HIT 0_0_0 003

Q:MaxCompute使用Tunnel Upload命令上傳數據,如何實現批量上傳一個目錄下的多個文件到同一張表,而且每一個文件放在不一樣的分區內?
A:能夠巧妙的利用Shell腳本實現上述功能,本章節中以在Windows環境下配合odpscmd客戶端使用Shell腳本舉例,Linux環境下原理相同。
Shell腳本內容以下。

!/bin/sh

C:/odpscmd_public/bin/odpscmd.bat -e "create table user(data string) partitioned by (dt int);" //首先建立一個分區表user,分區關鍵字爲dt,本例中odpscmd客戶端的安裝路徑爲C:/odpscmd_public/bin/odpscmd.bat,您能夠根據您的實際環境調整路徑。
dir=$(ls C:/userlog) //定義變量dir,爲存放文件的文件夾下全部文件的名稱
pt=0 //變量pt用於做爲分區值,初始爲0,每上傳好一個文件+1,從而實現每一個文件都存放在不一樣的分區
for i in $dir //定義循環,遍歷文件夾C:/userlog下的全部文件
do
let pt=pt+1 //每次循環結束,變量pt+1
echo $i //顯示文件名稱
echo $pt //顯示分區名稱

C:/odpscmd_public/bin/odpscmd.bat  -e "alter table user add partition (dt=$pt);tunnel upload C:/userlog/$i user/dt=$pt -s false -fd "%" -rd "@";" //利用odpscmd首先添加分區,而後向分區中上傳文件

done
實際運行shell腳本效果以下,本例中以兩個文件userlog1及userlog2舉例。

圖片描述

完成上傳後,您能夠在odpscmd客戶端查看錶數據。

圖片描述

網絡問題
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壓縮後的帶寬進行計費。

相關文章
相關標籤/搜索