使用MaxCompute Java SDK 执行任务卡住了,怎么办?

场景一
用户A
A: “亲,用 MaxCompute Java SDK 跑作业,为什么卡住不动了?”
me: “有 Logview 吗?发来看下”
A: “没有,我用的是SDK,没Logview”

场景二
用户B
B :“亲,用 MaxCompute Java SDK 访问 Table,为什么卡住半天没反应?”
me:“卡在哪一行了?”
B:"就 RestClient retry 然后卡住了"

去繁就简
用户 A 的问题在于没有 instance 的 logview,导致无法追踪 instance 的运行过程。
通常用户在创建 instance 后会调用 instance.waitForSuccess() 来等待作业运行完成,一旦作业耗时巨大,程序就卡在这一步了,此时如果有 logview ,就能查看追踪查看作业等待的具体原因了。

用户 B 的问题在于 sdk 的 Restclient 本身有重试机制,从表面来看就是卡住了,没有任何输出。
如果在每次重试的时候都输出错误,就可以快速定位问题节约时间了。我已经遇到好几个公共云用户因为缺包导致一直卡住几分钟才丢出异常,严重影响了工作效率。

那么问题可以归结为下面两点:

1【 怎么使用 MaxCompute Java SDK 生成 instance Logview 】
答案很简单, MaxCompute Java SDK 提供了 logview 接口,详情可查看 SDK Java Doc

String logview = odps.logview().generateLogView(instance, 7 * 24);

两个参数: instance 对象,logview token 超时时间 (单位:小时)

再次提醒用户,在使用 SDK 的时候,请为每个 instance 记录 Logview,一旦遇到问题可快速追踪。

当然如果改代码很麻烦,那还有一个绝招。在 MaxCompute Console 中使用 wait <instance_id> 命令也可以得到Logview。

2【 能不能在每次重试的时候,都把错误输出呢?】
当然可以。MaxCompute Java SDK 提供了抽象类 RetryLogger 详情可查看 SDK Java Doc

public static abstract class RetryLogger {

/**
 * 当 RestClent 发生重试前的回调函数
 *
 * @param e
 *     错误异常
 * @param retryCount
 *     重试计数
 * @param retrySleepTime
 *     下次需要的重试时间
 */
public abstract void onRetryLog(Throwable e, long retryCount, long retrySleepTime);

}

用户只需实现一个自己的 RetryLogger 子类,然后在初始化 odps 对象的时候使用 odps.getRestClient().setRetryLogger(new UserRetryLogger()); 就可以将日志输出。

一个典型的实现如下:

// init odps
odps.getRestClient().setRetryLogger(new UserRetryLogger());

// your retry logger
public class UserRetryLogger extends RetryLogger {

@Override
public void onRetryLog(Throwable e, long retryCount, long sleepTime) {
  if (e != null && e instanceof OdpsException) {
    String requestId = ((OdpsException) e).getRequestId();
    if (requestId != null) {
      System.err.println(String.format(
          "Warning: ODPS request failed, requestID:%s, retryCount:%d, will retry in %d seconds.",
          requestId, retryCount, sleepTime));
      return;
    }
  }
  System.err.println(String.format(
      "Warning: ODPS request failed:%s, retryCount:%d, will retry in %d seconds.", e.getMessage(),retryCount,
      sleepTime));
}

}

掌握上面两种技巧,就可以快速定位问题。

原文地址:http://blog.51cto.com/14031893/2345888

时间: 2024-11-04 15:37:12

使用MaxCompute Java SDK 执行任务卡住了,怎么办?的相关文章

使用 MaxCompute(原ODPS) java sdk 运行安全相关命令

转自zhenhong 使用 MaxCompute console 的同学,可能都使用过 odps 安全相关的命令.官方文档上有详细的 odps 安全指南,并给出了安全相关命令列表. 简而言之,权限管理.项目空间安全配置以及用户及授权管理都属于 odps 安全命令相关的范畴. 再直白一点,以下列关键字开头的命令,都是 odps 安全相关操作命令: GRANT/REVOKE ... SHOW GRANTS/ACL/PACKAGE/LABEL/ROLE/PRINCIPALS SHOW PRIV/PRI

使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及解决方案

import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.Upload; public class U

CentOS 使用yum命令安装Java SDK(openjdk)

CentOS 6.X 和 5.X 自带有OpenJDK runtime environment  (openjdk).它是一个在linux上实现开源的java 平台.CentOS  yum 命令 安装 Java SDK openjdk centos linux JAVA(openjdk)软件包名 1.java-1.7.0-openjdk - OpenJDK Runtime Environment 2.java-1.7.0-openjdk-devel - OpenJDK Development E

Beam编程系列之Java SDK Quickstart(官网的推荐步骤)

不多说,直接上干货! https://beam.apache.org/get-started/beam-overview/ https://beam.apache.org/get-started/quickstart-java/ Apache Beam Java SDK Quickstart This Quickstart will walk you through executing your first Beam pipeline to run WordCount, written usin

CentOS7 使用yum命令安装Java SDK(openjdk)

CentOS 6.X 和 7.X 自带有OpenJDK runtime environment  (openjdk).它是一个在linux上实现开源的java 平台. 安装方式: 1.输入以下命令,以查看可用的JDK软件包列表; yum search java | grep -i --color JDK 2.在CentOS linux安装 JAVA SDK在命令行终端以root用户 输入以下命令yum安装 OpenSDK : yum install java-1.8.0-openjdk  jav

大数据技术之_18_大数据离线平台_02_Nginx+Mysql+数据收集+Web 工程 JS/JAVA SDK 讲解+Flume 故障后-如何手动上传 Nginx 日志文件至 HDFS 上

十一.Nginx11.1.介绍11.2.常见其他 Web 服务器11.3.版本11.4.Nginx 安装11.5.目录结构11.6.操作命令十二.Mysql12.1.介绍12.2.关系型数据库(SQL)种类12.3.特征12.4.术语12.4.与非关系型数据库比较(Not Only SQL)12.4.1.种类12.4.2.特征12.4.3.总结十三.数据收集13.1.收集方式13.2.数据的事件类型13.2.1.Launch 事件13.2.2.PageView 事件13.3.Nginx 日志收集

Hyperledger Fabric Java SDK最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程. 如果希望快速掌握Fabric Java SDK的使用方法,建议访问汇智网的在线互动教程: Fabric区块链Java开发详解 1.官方文档 使用Fabric Java SDK开发必备的手册,从Java SDK源代码注释生成的每个接口.类和方法的简要说明,聊胜于无,但是要指望它达到真

java 程序执行输出有两种简单方式

java 程序执行输出有两种简单方式: 1. System.out.println("需要输出的内容"): 该方法可参看运行一个简单的Java程序 结果图: 2. System.out.print("需要输出的内容"): 1 public class HelloWorld 2 { 3 //Java程序的入口方法,程序将从这里开始运行 4 public static void main(String[] args) 5 { 6 //向控制台打印一条语句 7 Syste

第一章 Java代码执行流程

说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内存(类加载)(运行期) 第三步:执行代码(运行期) 2.代码编译 javac命令将源码文件编译为*.class文件. 后边将介绍: javac将*.java编译成*.class文件的过程 class文件的文件格式,以及其存储的内容 3.类加载 主要是指将*.class文件加载到JVM,并形成Class对象的机