Java SDK常見問題
本文為您介紹Java SDK的常見問題。
問題類別 | 常見問題 |
SDK咨詢 | |
運(yùn)行報(bào)錯(cuò) |
如何下載Java SDK包?
MaxCompute的Java SDK包已經(jīng)托管在Maven上,您可以通過Maven下載Java SDK包。
例如,MapReduce的Java SDK包。您可以在Maven中搜索odps-sdk-mapred,在Versions頁簽中單擊對(duì)應(yīng)SDK版本后的,然后下載對(duì)應(yīng)類型的包。
Java SDK包詳情請(qǐng)參見Java SDK介紹。
如何通過MaxCompute Java SDK設(shè)置SQL的Flag?
當(dāng)您使用DataWorks控制臺(tái)或MaxCompute客戶端(odpscmd)提交SQL時(shí),通常需要設(shè)置SQL的Flag。例如,如果您需要使用MaxCompute 2.0數(shù)據(jù)類型,可以通過Session級(jí)別方式開啟,在涉及2.0新數(shù)據(jù)類型的SQL前增加Set Flag語句set odps.sql.type.system.odps2=true;
。
使用Java SDK提交SQL時(shí),不能簡(jiǎn)單地把Set Flag語句直接增加到SQL中,設(shè)置Flag的正確方式如下。
--構(gòu)造SQLTask對(duì)象。
SQLTask task = new SQLTask();task.setName("foobar");task.setQuery("select ...");
--設(shè)置Flag。
Map settings = new HashMap<>();settings.put("odps.sql.type.system.odps2", "true");...
--設(shè)置其它Flags。
task.setProperty("settings", new JSONObject(settings).toString()); --這里是關(guān)鍵:將Flags對(duì)應(yīng)的JSON String設(shè)置到settings中。
--執(zhí)行。
Instance instance = odps.instances().create(task);
如何使用Logview排查Java SDK報(bào)錯(cuò)?
MaxCompute Java SDK提供了Logview接口i = SQLTask.run(odps, sql); String logview = odps.logview().generateLogView(i, 7×24)
。
如何在MaxCompute的Java業(yè)務(wù)代碼中執(zhí)行SQL作業(yè)?
您可以在業(yè)務(wù)代碼中調(diào)用MaxCompute的Java SDK執(zhí)行SQL作業(yè),詳情請(qǐng)參見Java SDK介紹。
使用SQLTask執(zhí)行SQL查詢時(shí),如果查詢結(jié)果條數(shù)大于限制的10000條,該如何獲取所有數(shù)據(jù)?
您可以將SQL查詢的結(jié)果集寫入一張表中,通過Tunnel下載所有數(shù)據(jù)。
SQLTask中,按照如下方法返回結(jié)果集的數(shù)據(jù)量是否有限制?如果有限制,最大返回結(jié)果集大小是多少?
命令示例如下。
Instance instance = SQLTask.run(odps, "sql語句");
instance.waitForSuccess();
List<Record> records = SQLTask.getResult(instance);
有限制,您可以最多調(diào)整到10000。如果數(shù)據(jù)量比較大,建議您使用Tunnel SDK導(dǎo)出數(shù)據(jù)。
SQLTask查詢數(shù)據(jù)和DownloadSession在使用及功能上,有什么不同?
SQLTask運(yùn)行SQL并返回結(jié)果,返回條數(shù)有限制,默認(rèn)是10000條。
DownloadSession下載某個(gè)存在的表里的數(shù)據(jù),結(jié)果條數(shù)無限制。
MaxCompute Java SDK執(zhí)行作業(yè)卡頓,如何解決?
問題現(xiàn)象
用戶A使用MaxCompute Java SDK執(zhí)行作業(yè)卡頓,沒有Logview信息。
用戶B使用MaxCompute Java SDK訪問表,執(zhí)行RestClient Retry操作后,作業(yè)卡頓。
產(chǎn)生原因
用戶A由于沒有Instance的Logview,導(dǎo)致系統(tǒng)無法追蹤Instance的運(yùn)行過程。Instance創(chuàng)建后會(huì)調(diào)用
instance.waitForSuccess()
方法,一旦作業(yè)耗時(shí)大,就會(huì)卡頓。此時(shí)如果有Logview,就可以查看并追蹤作業(yè)卡頓的具體原因。用戶B從表面看就是作業(yè)卡頓了,沒有任何輸出。Java SDK的RestClient本身有重試機(jī)制,如果系統(tǒng)在每次重試時(shí)都輸出錯(cuò)誤日志,就可以快速定位問題。
解決措施
使用MaxCompute Java SDK生成Instance Logview。
MaxCompute Java SDK提供了Logview接口,詳情請(qǐng)參見Instance Logview示例。
說明請(qǐng)您在使用Java SDK時(shí),為每個(gè)Instance記錄Logview,一旦遇到問題可快速追蹤。
在MaxCompute客戶端(odpscmd)執(zhí)行
WAIT<instance_id>
命令可以獲得Logview鏈接。
每次執(zhí)行RestClient Retry操作時(shí)都輸出錯(cuò)誤日志。
MaxCompute Java SDK提供了抽象類RetryLogger,詳情請(qǐng)參見輸出錯(cuò)誤日志示例。
MaxCompute運(yùn)行代碼時(shí),報(bào)錯(cuò)java.lang.ClassNotFoundException,如何解決?
出現(xiàn)上述報(bào)錯(cuò),是因?yàn)槟谝氚鼤r(shí),沒有引入與其相關(guān)的依賴包或重復(fù)引入某個(gè)包,請(qǐng)排查本地環(huán)境配置。
如果您是在MaxCompute上執(zhí)行MapReduce作業(yè)時(shí)出現(xiàn)此錯(cuò)誤,請(qǐng)檢查是否已通過-resources
參數(shù)引入依賴的包。
MaxCompute運(yùn)行代碼時(shí),報(bào)錯(cuò)OpenJDK 64-Bit Server VM warning,如何解決?
問題現(xiàn)象
報(bào)錯(cuò)信息如下。
OpenJDK 64-Bit Server VM warning: Insufficient space for shared memory
產(chǎn)生原因
出現(xiàn)上述報(bào)錯(cuò),是因?yàn)榕R時(shí)文件的目錄空間不足。
解決方法
您可以通過
df
命令,查看并清理臨時(shí)文件的目錄空間。
MaxCompute查找實(shí)例時(shí),報(bào)錯(cuò)Instance not found,如何解決?
問題現(xiàn)象
報(bào)錯(cuò)信息如下。
com.aliyun.odps.rest.RestException: RequestId=**,Code=NoSuchObject,Message=ODPS-0424111: Instance not found - 'instanceid'. at
產(chǎn)生原因
出現(xiàn)上述報(bào)錯(cuò),可能是因?yàn)轫?xiàng)目信息錯(cuò)誤。
解決方法
建議您確認(rèn)實(shí)例所在的項(xiàng)目連接信息是否正確,包括項(xiàng)目名稱、賬號(hào)認(rèn)證信息等。