本文為您介紹外部表格的常見問題。
問題類別 | 常見問題 |
OSS外部表格 | |
Hologres外部表格 | |
效能問題 |
自訂Extractor在讀取非結構化資料時,如果資料欄位存在DATETIME類型,報錯ODPS-0123131,如何解決?
問題現象
自訂Extractor在讀取非結構化資料時,如果資料欄位存在DATETIME類型(例如2019-11-11 06:43:36),會返回如下報錯。
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194) at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153) at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)產生原因
查看指定位置的代碼
Date.valueOf(parts[i]),其中java.sql.Date.valueOf()函數只支援形如"yyyy-[m]m-[d]d"的STRING型別參數,不支援DATETIME時間型別參數。解決措施
引入Joda-Time依賴並在代碼中增加匯入資訊。
--依賴。 <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> --匯入資訊。 import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat;引入
DateTimeFormat.forPattern()函數,將DATETIME類型的日期格式轉化為STRING類型進行讀取。record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
使用樣本如下。
通過MaxCompute用戶端上傳Extractor專案打包產生的JAR包。
add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar為產生JAR包的本地儲存路徑。通過MaxCompute用戶端上傳Joda-Time第三方JAR包。
add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar為Joda-Time第三方JAR包本地存放路徑。上傳測試資料至OSS指定的目錄下。假設檔案名稱為
video_play_log.txt,樣本資料如下。5c661071dba64d5080c91da085ff1073^音樂-點擊-快進^26.12.04.68^2019-11-11 06:43:36通過外部表格讀取資料。
select * from <project_name>.video_play_log;讀取結果如下。
+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | 音樂-點擊-快進 | 26.12.04.68 | 2019-11-11 06:43:36 | +------+-------+---+----------------+
在MaxCompute上訪問OSS外部表格,編寫UDF本地測試通過,上傳後報錯記憶體溢出,如何解決?
問題現象
在MaxCompute上訪問OSS外部表格,編寫UDF本地測試通過,上傳後返回如下報錯。
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap space設定如下參數後已耗用時間增加但依然報錯。
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096;產生原因
外部表格的對象檔案太多,記憶體佔用過大且未設定分區。
解決措施
使用小資料量查詢。
將對象檔案進行分區,以減少記憶體佔用。
通過外部表格處理OSS資料時,報錯Inline data exceeds the maximun allowed size,如何解決?
問題現象
處理OSS資料時,報錯
Inline data exceeds the maximum allowed size。產生原因
OSS Store對於每一個小檔案有一個大小限制,如果超過3 GB則報錯。
解決措施
針對該問題,您可以通過調整以下兩個屬性進行處理。其原理是通過屬性值調整執行計畫,控制每個Reducer寫入外部表格OSS的資料大小,使得OSS Store檔案不超過3 GB的限制。
set odps.sql.mapper.split.size=256; #調整每個Mapper讀取資料的大小,單位是MB。 set odps.stage.reducer.num=100; #調整Reduce階段的Worker數量。
如何在MaxCompute中使用OSS外部表格讀取JSON資料?
在MaxCompute中使用OSS外部表格讀取JSON資料的操作,請參見在MaxCompute中使用OSS外部表格讀取JSON資料。
如何通過OSS外部表格將多個小檔案輸出為一個檔案?
通過Logview日誌,查看SQL的執行計畫中最後一個是Reducer還是Joiner。如果是Reducer,則執行語句set odps.stage.reducer.num=1;,如果是Joiner,則執行語句set odps.stage.joiner.num=1;。
通過MaxCompute直讀Hologres資料時,報錯ODPS-0130071,如何解決?
問題現象
直讀Hologres資料時,報錯ODPS-0130071 Failed to split to equal size...max count: 7777。例如:
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777產生原因
MaxCompute直讀Hologres中的資料時,按照預設的拆分Mapper策略(輸入資料量/split.size 256 M),導致任務產生的Mapper並發數超過了最大限制數7777。
說明該限制是防止使用者直接提交產生大量Mapper任務,從而對Hologres檔案或網路連接的穩定性產生影響。
解決措施
您可以通過設定以下參數,解決報錯問題。
SET odps.external.holo.mapper.instances=10000; --提高並發上限,最高不超過10000 SET odps.sql.mapper.split.size=512; --調整任務並發數,最高不超過512M
基於外部表格執行SQL作業時,運行慢,如何解決?
基於外部表格執行SQL作業時,運行慢的常見情況如下:
OSS外部表格中的GZ壓縮檔讀取慢
問題現象
使用者建立了一個OSS外部表格,資料來源為OSS中的GZ壓縮檔,大小為200 GB。在讀取資料過程中執行緩慢。
產生原因
由於Map端執行計算的Mapper數量過少,所以SQL處理慢。
解決措施
對於結構化資料,您可以設定以下參數調整單個Mapper讀取資料量的大小,加速SQL執行。
set odps.sql.mapper.split.size=256; #調整每個Mapper讀取Table資料的大小,單位是MB。對於非結構化資料,您需要查看OSS外部表格路徑下的OSS檔案是否只有1個。如果只有1個,由於壓縮方式下的非結構化資料不支援拆分,所以只能生產1個Mapper,導致處理速度較慢。建議您在OSS對應的外部表格路徑下,將OSS大檔案拆分為小檔案,從而增加讀取外部表格產生的Mapper數量,提升讀取速度。
使用SDK搜尋MaxCompute外部表格資料速度慢
問題現象
使用SDK搜尋MaxCompute外部表格資料速度慢。
解決措施
外部表格僅支援全量搜尋,所以較慢,建議您改用MaxCompute內部表。
查詢外部表格Tablestore資料慢
問題現象
查詢外部表格Tablestore的資料慢,同樣的業務資料,1個即時寫入Tablestore,1個定時寫入MaxCompute,兩個表結構和資料量一樣。查詢MaxCompute內部表耗時遠小於查詢Tablestore外部表格。
解決措施
這種情況可能是對1份資料進行了多次計算,導致速度慢。相比每次從Tablestore遠程讀取資料,更高效快速的方法是先一次性把需要的資料匯入到MaxCompute內部,轉為MaxCompute內部表,再進行查詢。
讀取OSS外部表格時報錯Couldn't connect to server,如何解決?
問題現象
讀取OSS外部表格的資料時,報錯
ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server。產生原因
原因一:建立OSS外部表格時,oss_location地址中的
oss_endpoint使用了公網地址,未使用內網地址。原因二:建立OSS外部表格時,oss_location地址中的
oss_endpoint使用了其他Region的地址。
解決措施
對於原因一:
您需要核查OSS外部表格的建表語句中oss_location參數的
oss_endpoint是否為內網地址,如果是公網地址則需要修改為內網地址,具體參數資訊請參見參數說明。例如,使用者在印尼(雅加達)地區,使用了
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....地址建立外部表格,應該改為對應的內網地址oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/....。對於原因二:
您需要核查OSS外部表格的建表語句中,oss_location參數的
oss_endpoint是否為要訪問的Region的Endpoint,更多OSS傳統網路網域名稱資訊,請參見OSS地區和訪問網域名稱。
建立OSS外部表格時報錯Network is unreachable (connect failed) ,如何解決?
問題現象
建立OSS外部表格時,報錯
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed)。產生原因
建立OSS外部表格時,oss_location地址中的
oss_endpoint使用了公網地址,未使用內網地址。解決措施
你需要核查OSS外部表格的建表語句中,oss_location參數的
oss_endpoint是否為內網地址。如果是公網地址,則需要修改為內網地址,具體參數資訊請參見參數說明。例如,使用者在華北2(北京)地區,使用了
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....地址建立外部表格,應該改為對應的內網地址oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....。