Tunnel SDK常见问题

本文为您介绍使用Tunnel SDK过程中的常见问题。

问题类别

常见问题

Tunnel SDK Upload

Tunnel SDK Download

使用Tunnel SDK下载数据时,报错You need to specify a partitionspec along with the specified table,如何解决?

其他问题

使用Tunnel SDK上传数据时,上传的数据可以自动分配到各个分区吗?

Tunnel SDK上传数据时,是无法自动分配到各个分区的。每一次上传只支持将数据上传到一张表或表的一个分区,有分区的表一定要指定上传的分区,多级分区一定要指定到末级分区。

使用Tunnel SDK上传数据时,编写完UDF打成JAR包后上传,对JAR包大小有要求吗?

JAR包不能超过10 MB,如果JAR包超过10 MB,建议转用MaxCompute Tunnel Upload命令上传数据。

使用Tunnel SDK上传数据时,是否有分区数量限制?

最大支持6万个分区。分区数量过多,不方便进行统计和分析。MaxCompute会限制单个作业中Instance的数量。作业的Instance和用户输入的数据量及分区数量是密切相关的,因此建议先评估下业务,选择合适的分区策略,避免分区过多带来的影响。

使用Tunnel SDK上传数据时,报错StatusConflict,如何解决?

  • 问题现象

    使用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)
  • 问题原因:该问题是在Close RecordWriter时出现的,可能原因如下。

    • 对一个已经关闭的RecordWriter执行了关闭操作。

    • RecordWriter对应的Session已经关闭。

    • Session已经提交过。

  • 解决措施:您可以针对上述可能出现的原因进行排查,比如打印一些日志、在提交Session前打印一些当前RecordWriter的状态与Session的状态。确保无上述问题后,重新尝试上传数据。

使用Tunnel SDK上传数据时,报错Blocks Not Match,如何解决?

  • 问题现象:

    使用Tunnel SDK上传数据时,返回如下报错。

    ErrorCode=Local Error, ErrorMessage=Blocks not match, server: 0, tunnelServiceClient: 1
    at com.aliyun.odps.tunnel.TableTunnel$UploadSession.commit(TableTunnel.java:814)      
  • 产生原因

    服务器收到的Block个数和Commit时参数的个数不一致。

  • 解决措施

    • 在代码中查看uploadSession.openRecordWriter(i)打开的Writer个数和Commit时的Block数组,确保相对应。

    • 代码中写入执行完成后,确认是否调用recordWriter.close(); 。如果直接执行Commit,可能导致服务器端的Block个数不符合预期。

一次性上传8000万条数据,在执行odps tunnel recordWriter.close()时报错StatusConflict,如何解决?

  • 问题现象

    一次性上传8000万条数据,在执行odps tunnel recordWriter.close()时,返回如下报错。

    ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.
  • 产生原因

    Session状态错误,前面的操作里已经关闭或者提交了该Session。

  • 解决措施

    建议重新创建一个Session再上传一次数据。对于不同的分区,每个分区需要单独的一个Session。对于多次提交导致报错,请先检查数据是否已经上传成功,如果失败,请重新上传一次,请参见多线程上传示例

如何使用TunnelBufferedWriter规避使用Tunnel SDK进行批量数据上传出错的问题?

MaxCompute Java SDK在0.21.3-public版本之后新增了BufferedWriter的SDK,简化了数据上传,并且提供了容错功能。BufferedWriter从用户角度看,就是在Session上打开一个Writer然后进行写记录即可。具体实现是,BufferedWriter先将记录缓存在客户端的缓冲区中,并在缓冲区填满之后打开一个HTTP连接进行上传。

BufferedWriter会尽最大可能容错,保证数据上传成功,使用方法请参见TunnelBufferedWriter

使用Tunnel SDK下载数据时,报错You need to specify a partitionspec along with the specified table,如何解决?

  • 问题现象

    使用Tunnel SDK下载分区表数据,返回如下报错。

    ErrorCode=MissingPartitionSpec, ErrorMessage=You need to specify a partitionspec along with the specified table.       
  • 产生原因

    使用Tunnel SDK下载分区表数据时,需要指定分区列的列值,否则会报错。

  • 解决措施

    • 如果您使用MaxCompute客户端工具里的Tunnel命令行进行导出,客户端支持分区表整个导出,其结果会导出到一个文件夹里。

    • 如果您使用Tunnel SDK进行导出,可以先使用SDK获取分区表的所有分区,命令示例如下。

      odps.tables().get(tablename) t.getPartitions()      

MaxCompute Tunnel目前支持哪些语言的SDK?

MaxCompute Tunnel目前支持Java版的SDK。

BlockId是否可以重复?

同一个UploadSession中的BlockId不能重复。对于同一个UploadSession,用一个BlockId打开RecordWriter,写入一批数据后,调用Close,写入成功后不可以再用该BlockId打开另一个RecordWriter写入数据。Block默认最多20000个,即取值范围为0~19999。

Block大小是否存在限制?

每次上传至Tunnel的数据块大小默认为100 MiB。一个Block大小上限为100 GB,强烈建议为大于64 MB的数据,每一个Block对应一个文件,小于64 MB的文件统称为小文件,小文件过多将会影响使用性能。如果数量较大且是持续上传模式,Block的数据量在64 MB~256 MB之间; 如果是每天传一次的批量模式,Block可以设置为1 GB左右。

使用新版BufferedWriter可以更简单地进行上传且可以避免小文件等问题,详情请参见TunnelBufferedWriter

遇到读写超时或IOException时,如何解决?

上传数据时,Writer每写入8 KB数据会触发一次网络动作,如果120秒内没有网络动作,服务端将主动关闭连接,届时Writer将不可用,请重新打开一个新的Writer写入。

建议您使用TunnelBufferedWriter

下载数据时,Reader也有类似机制,若长时间没有网络动作会断开连接,建议Reader过程连续进行,中间不穿插其他系统的接口。