本文為您介紹使用Tunnel命令過程中的常見問題。
Tunnel Upload是否支援萬用字元或Regex?
使用Tunnel Upload命令上傳資料時,不支援萬用字元或Regex。
Tunnel Upload對檔案大小是否有限制?記錄大小是否有限制?是否要使用壓縮?
使用Tunnel Upload命令上傳檔案時,對檔案大小沒有限制,但一次上傳時間長度不能超過2小時。您可以根據實際上傳速度和時間估算能夠上傳的資料量。
記錄大小不能超過200 MB。
Tunnel Upload預設會使用壓縮,如果頻寬允許的情況下,可以通過-cp
參數關閉壓縮。
同一個表或分區是否可以並行上傳資料?
可以並行上傳。
是否支援多個用戶端同時上傳資料至同一張表?
支援。
使用Tunnel Upload命令上傳資料時一定要先存在分區嗎?
您也可以使用Tunnel Upload命令的-acp
參數,自動建立目標資料分割,預設值為False。詳情請參見Tunnel命令。
使用Tunnel Upload命令上傳資料時,是按照資料壓縮前還是壓縮後的大小計費?
按照壓縮後的大小進行計費。
使用Tunnel Upload命令上傳資料時,是否支援限速?
不支援限速。
使用Tunnel Upload命令上傳資料時,速度太慢,如何解決?
如果上傳資料太慢,可以考慮使用-threads
參數將資料切片上傳,例如將檔案切分為10片上傳。命令樣本如下。
tunnel upload C:\userlog.txt userlog1 -threads 10 -s false -fd "\u0000" -rd "\n";
使用Tunnel Upload命令上傳資料時,設定了雲產品互連網絡的Endpoint,但為什麼會串連到公網的Tunnel Endpoint?
MaxCompute用戶端的設定檔odps_config.ini中除了Endpoint之外還需要配置Tunnel Endpoint。請根據Endpoint進行配置。目前只有華東2(上海)地區不需要設定Tunnel Endpoint。
在DataStudio上執行Tunnel Upload命令上傳分區資料時報錯,如何解決?
問題現象
在DataStudio上執行Tunnel Upload命令上傳分區資料時,返回報錯如下。
FAILED: error occurred while running tunnel command.
產生原因
DataStudio不支援Tunnel Upload命令。
解決措施
根據DataWorks提供的可視化匯入資料功能進行操作,請參見上傳資料。
使用Tunnel Upload命令上傳資料時,如果資料中有斷行符號或空格,為什麼上傳會失敗?
如果資料中有斷行符號或空格,可以給資料設定不同於斷行符號或空格的分隔字元後,用-rd
和-fd
指定對應的分隔字元實現資料的上傳。如果無法更換資料中的分隔字元,可以將資料作為單獨一行上傳,然後使用UDF解析。
如下樣本資料中包含斷行符號,使用“,”
作為資料行分隔符號-rd
,使用“@”
作為行分隔字元-fd
,可以正常上傳。
shopx,x_id,100@
shopy,y_id,200@
shopz,z_id,300@
上傳命令樣本如下。
tunnel upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false -rd "," -fd "@";
上傳結果如下。
+-----------+-------------+-------------+-----------+--------+
| 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 | 300.0 | 201312 | hangzhou |
+-----------+-------------+-------------+-----------+--------+
使用Tunnel Upload命令上傳資料時,提示記憶體溢出,如何解決?
Tunnel Upload命令支援上傳海量資料,如果出現記憶體溢出,可能是因為資料的行分隔字元和資料行分隔符號設定錯誤,導致整個文本被認為是同一條資料,全部緩衝至記憶體中,導致記憶體溢出報錯。
這種情況下可以先用少量的資料進行測試,當-td
及-fd
調試成功後再上傳全量資料。
使用Tunnel Upload命令上傳資料時,需要上傳很多資料檔案到一個表中,是否有方法寫一個指令碼就可以把檔案夾下的所有資料檔案上傳上去?
Tunnel Upload命令支援檔案或目錄(指一級目錄)的上傳,詳情請參見Tunnel使用說明。
例如執行如下命令上傳檔案夾d:\data下的所有資料。
tunnel upload d:\data sale_detail/sale_date=201312,region=hangzhou -s false;
使用Tunnel Upload命令上傳資料時,如何?批量上傳一個目錄下的多個檔案到同一張表,並且每個檔案放在不同的分區內?
您可以利用Shell指令碼實現,以在Windows環境下配合MaxCompute用戶端使用Shell指令碼為例,Linux環境下原理相同,Shell指令碼內容如下。
#!/bin/sh
C:/odpscmd_public/bin/odpscmd.bat -e "create table user(data string) partitioned by (dt int);" //首先建立一個分區表user,分區關鍵字為dt,本例中MaxCompute用戶端的安裝路徑為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舉例。
完成上傳後,您可以在MaxCompute用戶端查看錶資料。
使用Tunnel Upload命令上傳資料報錯,是否有類似MySQL的-f參數,可以強制跳過錯誤資料繼續進行上傳?
您可以在Tunnel Upload命令中使用-dbr true
參數忽略髒資料(多列、少列及列資料類型不匹配等情況)。-dbr
參數預設值為False,表示不忽視髒資料;當值為True時,會將不符合表定義的資料全部忽略。詳情請參見Upload。
使用Tunnel Upload命令上傳資料時,報錯You cannot complete the specified operation under the current upload or download status,如何解決?
問題現象
使用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)java.io.IOException: RequestId=XXXXXXXXXXXXXXXXXXXXXXXXX, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.
產生原因
當前檔案已經在上傳中,無法重複操作。
解決措施
無需重複執行上傳操作,等待已有上傳任務執行完畢。
使用Tunnel Upload命令上傳資料時,報錯Error writing request body to server,如何解決?
問題現象
使用Tunnel Upload命令上傳資料時,返回如下報錯。
java.io.IOException: Error writing request body to server
產生原因
這是上傳資料到伺服器時產生的異常,通常是因為上傳過程中的網路連接斷開或逾時導致的:
當您的資料來源並非是本地檔案,需要從資料庫等地方擷取時,資料在寫入的過程中還需要等待資料擷取從而導致逾時。在上傳資料的過程中,如果600秒沒有資料上傳,則被認為逾時。
使用者通過公網的Endpoint上傳資料,由於公網網路品質不穩定導致逾時。
解決措施
在上傳的過程中,先擷取資料,再調用Tunnel SDK上傳資料。
一個Block可以上傳64 MB~100 GB的資料,最好不要超過1萬條資料以免因重試導致逾時。一個Session可以擁有最多2萬個Block。如果您的資料在ECS上,Endpoint資訊請參見Endpoint。
使用Tunnel Upload命令上傳資料時,報錯The specified partition does not exist,如何解決?
問題現象
在執行Tunnel上傳資料操作時,返回報錯如下。
ErrorCode=NoSuchPartition, ErrorMessage=The specified partition does not exist
產生原因
資料要插入的目標資料分割不存在。
解決措施:
您可以先通過
show partitions table_name;
命令來判斷分區是否存在,並通過alter table table_name add [if not exists] partition partition_spec
來建立對應的分區。
使用Tunnel Upload命令上傳資料時,報錯Column Mismatch,如何解決?
通常是因為資料來源檔案的行分隔字元有問題,將多條記錄當成了一條記錄。您需要查看是否存在此問題,並重新設定-rd
參數。
多線程上傳資料時,報錯ODPS-0110061,如何解決?
問題現象
在多線程上傳資料情境,返回報錯如下。
FAILED: ODPS-0110061: Failed to run ddltask - Modify DDL meta encounter exception : ODPS-0010000:System internal error - OTS transaction exception - Start of transaction failed. Reached maximum retry times because of OTSStorageTxnLockKeyFail(Inner exception: Transaction timeout because cannot acquire exclusive lock.)
產生原因
上傳資料時高並發寫入同一個表,頻繁的並行作業導致報錯。
解決措施
適當減少並發數,在請求之間加入延遲時間,並且在出錯的時候重試。
使用Tunnel Upload命令列上傳CSV檔案時,如何跳過第一行表頭上傳其他資料?
在Tunnel Upload命令中添加-h true
參數即可跳過第一行表頭。
使用Tunnel Upload命令列上傳CSV檔案時,為什麼匯入成功後原文本中有很大一部分內容莫名消失?
這種情況是因為資料編碼格式錯誤或分隔字元使用錯誤導致上傳到表的資料錯誤。建議規範未經處理資料後再執行上傳操作。
如何在Shell指令碼中將一個TXT檔案中的資料上傳到MaxCompute的表中?
在系統的命令列執行視窗,您可以通過指定參數快速執行上傳操作,上傳資料至MaxCompute表的命令如下。
...\odpscmd\bin>odpscmd -e "tunnel upload "$FILE" project.table"
更多命令列啟動資訊,請參見使用本地用戶端(odpscmd)串連。
匯入檔案夾中的檔案資料時,提示欄位不匹配,但是檔案夾下的檔案可以單獨匯入,如何解決?
在Tunnel Upload命令後加上-dbr=false -s true
屬性對資料格式進行驗證。
出現column mismatch
通常是由於列數不匹配導致的。例如資料行分隔符號設定的不正確或檔案最後有空行,導致空行通過分隔字元進行分割時列數不匹配。
使用Tunnel Upload命令上傳兩個檔案時,第一個檔案上傳結束之後,第二個檔案沒有上傳且沒有報錯資訊,是什麼原因?
當MaxCompute用戶端上傳參數有--scan
時,續跑模式的參數傳遞存在問題,將--scan=true
去掉重試即可。
使用Tunnel Upload命令上傳資料時,共分為50個Block,開始一切正常,但是在第22個Block時,出現Upload Fail,重試直接跳過開始上傳第23個Block,如何解決?
一個Block對應一個HTTP Request,多個Block的上傳可以並發且是原子的,一次同步請求要麼成功要麼失敗,不會影響其他的Block。
重傳Retry有次數的限制,當重傳的次數超過了這個限制,就會繼續上傳下一個Block。上傳完成後,可以通過select count(*) from table;
語句,檢查是否有資料丟失。
本機伺服器每天採集的網站日誌有10 GB,需要上傳至MaxCompute,在使用Tunnel Upload命令上傳時速度約為300 KB/s,如何提升上傳速度?
Tunnel Upload命令上傳是不設速度限制的。上傳速度的瓶頸在於網路頻寬、用戶端效能以及伺服器效能。為了提升效能,可以考慮在上傳時分區分表,或通過多台ECS上傳資料。
上傳資料時,每個Session的生命週期是一天,因源表資料太大,導致Session逾時任務失敗,如何解決?
建議將源表拆分為2個任務執行。
上傳Session太多導致上傳速度慢,如何解決?
應合理設定Block大小。Block ID最大為20000,Session的時間根據具體業務需求設定,Session提交以後資料才可見。建議您建立Session的頻率不要太高,最多5分鐘一個Session,Session裡的Block值應該設定得較大一些,建議每個Block超過64 MB。
匯入資料的最後一列為什麼會多出\r符號?
Windows的分行符號是\r\n
,macOS和Linux的分行符號是\n
,Tunnel命令使用系統分行符號作為預設資料行分隔符號,所以從macOS或Linux上傳Windows編輯儲存的檔案後,會把\r
作為資料內容匯入表。
使用Tunnel Upload命令上傳資料時,預設用逗號進行列分割,但是資料中有逗號,這種情況如何分割?
如果資料描述欄位內本身有逗號,可以考慮轉換資料的分隔字元為其他符號,再通過-fd
指定為其他分隔字元進行上傳。
使用Tunnel Upload命令上傳資料時,如果資料使用空格作為資料行分隔符號,或需要對資料做Regex過濾時,如何解決?
Tunnel Upload命令不支援Regex。如果資料使用空格作為資料行分隔符號,或需要對資料做Regex過濾時可藉助MaxCompute的UDF功能。
假設未經處理資料如下,列分割符為空白格,行分隔字元為斷行符號,並且需要取的部分資料在引號內,部分資料例如”-“需要被過濾。這種複雜的需求可通過Regex實現。
10.21.17.2 [24/Jul/2018:00:00:00 +0800] - "GET https://example.com/73477.html" 200 0 81615 81615 "-" "iphone" - HIT - - 0_0_0 001 - - - -
10.17.5.23 [24/Jul/2018:00:00:00 +0800] - "GET https://example.com/73478.html" 206 0 49369 49369 "-" "huawei" - HIT - - 0_0_0 002 - - - -
10.24.7.16 [24/Jul/2018:00:00:00 +0800] - "GET https://example.com/73479.html" 206 0 83821 83821 "-" "vivo" - HIT - - 0_0_0 003 - - - -
實現方式如下:
將資料以單列形式上傳,首先在MaxCompute專案內建立一個單列的表格用於接收資料。命令樣本如下。
create table userlog1(data string);
使用一個不存在的資料行分隔符號
\u0000
上傳資料,從而達到不分割列的效果。命令樣本如下。tunnel upload C:\userlog.txt userlog1 -s false -fd "\u0000" -rd "\n";
完成未經處理資料上傳後,使用MaxCompute Studio編寫一個Python UDF(您也可以使用Java UDF)並註冊函數。編寫並註冊UDF操作,請參見開發Java UDF或開發Python UDF。
UDF程式碼範例如下。假設註冊的函數名稱為ParseAccessLog。
from odps.udf import annotate from odps.udf import BaseUDTF import re #此處引入正則函數 regex = '([(\d\.)]+) \[(.*?)\] - "(.*?)" (\d+) (\d+) (\d+) (\d+) "-" "(.*?)" - (.*?) - - (.*?) (.*?) - - - -' #使用的Regex # 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
完成函數註冊後,就可以使用UDF函數處理上傳到表格userlog1的未經處理資料了,注意不要寫錯列的名稱,本例中為data。您可以使用正常的SQL文法,建立一個表格userlog2用於存放處理後的資料。命令樣本如下。
create table userlog2 as select ParseAccessLog(data) as (ip,date,request,code,c1,c2,c3,ua,q1,q2,q3) from userlog1;
完成處理後,可以查詢userlog2的表資料,資料成功分列。
select * from userlog2; --返回結果如下。 +----+------+---------+------+----+----+----+----+----+----+----+ | ip | date | request | code | c1 | c2 | c3 | ua | q1 | q2 | q3 | +----+------+---------+------+----+----+----+----+----+----+----+ | 10.21.17.2 | 24/Jul/2018:00:00:00 +0800 | GET https://example.com/73477.html | 200 | 0 | 81615 | 81615 | iphone | HIT | 0_0_0 | 001 | | 10.17.5.23 | 24/Jul/2018:00:00:00 +0800 | GET https://example.com/73478.html | 206 | 0 | 4936 | 4936 | huawei | HIT | 0_0_0 | 002 | | 10.24.7.16 | 24/Jul/2018:00:00:00 +0800 | GET https://example.com/73479.html | 206 | 0 | 83821 | 83821 | vivo | HIT | 0_0_0 | 003 | +----+------+---------+------+----+----+----+----+----+----+----+
Tunnel Upload完成後,存在髒資料,如何解決?
建議一張單表(沒有分區的表)或一個分區盡量一次性寫入資料,不要多次寫同一個分區,否則容易出現髒資料。您可以在MaxCompute用戶端執行tunnel show bad <sessionid>;
命令查看髒資料。一旦出現髒資料,可以通過如下方法進行刪除:
執行
drop table ...;
命令刪除整張表或執行alter table ... drop partition;
命令刪除目標資料分割後,重新上傳資料。如果髒資料可以通過WHERE條件過濾出來,也可以通過INSERT+WHERE條件,把需要的資料匯入到另一張新表或就地更新(源和目的分區/表名相同)。
geometry類型資料如何同步至MaxCompute?
MaxCompute不支援geometry類型資料,需要將geometry類型資料轉換為STRING類型資料才能同步至MaxCompute。
geometry類型是一種特殊的資料類型,不同於SQL標準中的標準資料類型,因此在JDBC的通用架構並不支援,所以導致geometry類型的匯入匯出需要進行特殊的處理。
Tunnel Download匯出格式有哪些?
使用Tunnel Download匯出的資料檔案格式為TXT或CSV。
在同一地區內使用Tunnel Download命令下載資料,為什麼會產生費用?
同一地區內使用Tunnel下載資料,必須配置雲產品互連網絡或VPC網路的Tunnel Endpoint,否則資料可能路由到其他地區,從公網下載資料從而產生費用。
使用Tunnel Download命令下載資料時,總是提示逾時,如何解決?
通常是Tunnel Endpoint錯誤,請檢查Tunnel Endpoint配置是否正確。簡單的判斷方法是通過Telnet等方法檢測網路連通性。
使用Tunnel Download命令下載資料時,報錯You have NO privilege,如何解決?
問題現象
使用Tunnel Download命令下載資料時,返回報錯資訊如下。
You have NO privilege ‘odps:Select‘ on {acs:odps:*:projects/XXX/tables/XXX}. project ‘XXX‘ is protected.
產生原因
專案開啟了資料保護功能。
解決措施
如果您需要把一個專案中的資料匯出至另一個專案,需要該專案所有者進行操作。
如何使用Tunnel下載部分指定資料?
Tunnel不支援資料的計算或者過濾。如果需要實現此功能,您可以考慮以下兩種方法:
先運行SQL任務,將需要下載的資料儲存成一張暫存資料表,下載結束後再刪除此暫存資料表。
如果您所需要的資料量比較小,可以使用SQL命令直接查詢需要的資料,無需下載。
Tunnel中的history命令資訊會儲存多久?
與時間無關,預設儲存500條。
Tunnel上傳資料的流程是什嗎?
Tunnel上傳資料的流程如下:
準備來源資料,例如源檔案或資料表。
設計表結構和分區定義,進行資料類型轉換,然後在MaxCompute上建立表。
在MaxCompute表上添加分區,沒有分區時忽略此步驟。
把資料上傳到指定分區或表上。
Tunnel目錄名支援中文嗎?
支援中文。
Tunnel使用分隔字元時,需要注意什嗎?
Tunnel使用分隔字元時,需要注意:
行分隔字元為
rd
,資料行分隔符號為fd
。資料行分隔符號
fd
不能包含行分隔字元rd
。Tunnel的預設分隔符號為
\r\n
(Windows)和\n
(Linux)。上傳開始的時候,屏顯會列印提示資訊,告知本次上傳所使用的行分隔字元(0.21.0版本及以後)供使用者查看和確認。
Tunnel檔案路徑是否可以有空格?
可以有空格,參數需要用雙引號("")括起來。
Tunnel是否支援.dbf尾碼非加密資料庫檔案?
Tunnel僅支援文字檔,不支援二進位檔案。
Tunnel上傳下載正常速度範圍是多少?
Tunnel上傳下載受網路因素影響較大,正常網路情況下速度範圍為1 MB/s~20 MB/s。
Tunnel網域名稱如何擷取?
Tunnel網域名稱即公網Tunnel Endpoint,不同地區、不同網路對應不同的Tunnel網域名稱,請參見Endpoint對照表擷取公網Tunnel Endpoint。
Tunnel無法上傳下載,如何處理?
在MaxCompute用戶端安裝目錄..\odpscmd_public\conf
下的odps_config.ini檔案中擷取Tunnel網域名稱,在系統命令列視窗執行curl -i 網域名稱
(例如curl -i http://dt.odps.aliyun.com
)命令測試網路是否連通,若無法連通請檢查裝置網路或更換為正確的Tunnel網域名稱。
Tunnel命令報錯Java heap space FAILED,如何解決?
問題現象
使用Tunnel命令上傳或下載資料時,返回報錯如下。
Java heap space FAILED: error occurred while running tunnel command
產生原因
原因一:上傳資料時,單行資料太大導致報錯。
原因二:下載資料量太大,用戶端程式記憶體不足。
解決措施
原因一的解決措施:
首先確認是否是分隔字元錯誤,導致所有資料都進入同一行記錄,導致單行資料太大。
如果分隔字元正確,檔案中的單行資料的確很大,則為用戶端程式的記憶體不夠用,需要調整用戶端進程的啟動參數。編輯用戶端安裝目錄
bin
下的odpscmd指令碼,適當增加Java進程啟動選項中的記憶體值。即將java -Xms64m -Xmx512m -classpath "${clt_dir}/lib/*:${clt_dir}/conf/"com.aliyun.openservices.odps.console.ODPSConsole "$@"
中-Xms64m -Xmx512m
的值增大即可。
原因二的解決措施:編輯用戶端安裝目錄
bin
下的odpscmd指令碼,適當增加Java進程啟動選項中的記憶體值。即將java -Xms64m -Xmx512m -classpath "${clt_dir}/lib/*:${clt_dir}/conf/"com.aliyun.openservices.odps.console.ODPSConsole "$@"
中-Xms64m -Xmx512m
的值增大即可。
Session是否存在生命週期,超過生命週期後如何處理?
每個Session在服務端的生命週期為24小時,建立後24小時內均可使用。Session逾時後就失效了,此時您不能做任何操作,需要重新建立Session重寫資料。
Session是否可以共用使用?
Session在可以跨進程、線程共用使用,但是必須保證同一個BlockId沒有重複使用。
Tunnel路由功能是什嗎?
如果您未配置Tunnel Endpoint,Tunnel會自動路由到MaxCompute服務所在網路對應的Tunnel Endpoint。如果您配置了Tunnel Endpoint,則以配置為準,不進行自動路由。
Tunnel是否支援多並發?
支援,命令樣本如下。
tunnel upload E:/1.txt tmp_table_0713 --threads 5;