本文汇总了数据上传下载时遇到的常见问题。

什么是MaxCompute Tunnel?

MaxCompute Tunnel是MaxCompute的数据通道,您可以通过Tunnel向MaxCompute中上传或者下载数据。目前Tunnel仅支持表(不包括视图View)数据的上传下载。

Odpscmd Tunnel目录文件支持中文吗?

支持中文。

Tunnel上传是否支持通配符或正则表达式?

使用Tunnel命令行工具上传数据,当前不支持通配符或正则表达式 。

Tunnel是否支持ASCII字符的分隔符?

命令行方式不支持,配置文件可以用十六进制表示。例如\u000A,表示回车。

Tunnel需注意的分隔符问题有哪些?

Tunnel 需要注意的分隔符问题,如下所示:
  • 行分隔符rd、列分隔符fd
  • 列分隔符fd不能包含行分隔符rd
  • 默认值为 \r\n (windows)和\n(linux)。
  • 上传开始的时候会打印提示信息,告知本次上传所使用的行分隔符(0.21.0 版本及以后)供用户查看和确认。

文件大小是否有限制?记录大小是否有限制?是否要使用压缩?

文件大小没有限制,但一次上传无法超过2小时,根据实际上传速度和时间可以估算能够上传的数据量。

记录大小不能超过200MB。

默认会使用压缩,如果带宽允许的情况下,可以关掉压缩。

同一个表或分区是否可以并行上传?

可以并行上传。

是否支持不同字符编码?为什么会出现乱码?

支持不同的编码格式参数,带Bom的标识文件不需要指定编码。

可能是上传文件的字符编码和工具指定的编码不符。

导入后的脏数据如何处理?

导入结束后,如果有脏数据可以通过tunnel show bad [sessionid]命令查看脏数据。

上传下载的文件路径是否可以有空格?

可以有空格,参数需要用双引号括起来。

导入数据最后一列为什么多出\r符号?

Windows的换行符是\r\n,Mac OS和Linux的换行符是\n,Tunnel命令使用系统换行符作为默认列分隔符,所以从Mac OSX或Linux上传Windows编辑保存的文件会把\r作为数据内容导进去。

Tunnel上传下载正常速度范围是多少?

Tunnel上传下载受网络因素影响较大,正常网络情况下速度范围在1MB/s-20MB/s区间内。

Tunnel域名是什么?

不同Region对应不同的域名,详情请参见配置Endpoint

无法上传下载如何处理?

找到配置中Tunnel域名,通过curl -i 域名(例如curl -i http://dt.odps.aliyun.com)测试网络是否连通,若无法连通请检查机器网络或更换为正确的域名。

上传下载速度缓慢如何处理?

您可以从以下几方面进行检查:
  • 检查机器网络状态,通过ping tunnel_endpoint域名检查网络延迟是否异常。
  • 检查流量状态, 通过ifstat等命令检查客户端机器的流量是否满载。
  • 若为ECS机器,请检查是否使用的公网域名而不是跨域或ECS域名,若使用公网域名,请检查ECS的带宽使用情况是否打满或更换域名。

报错Java heap space FAILED,如何处理?

报错信息如下。
Java heap space FAILED: error occurred while running tunnel command
您可以从以下几方面进行解决:
  • 如果是上传数据,通常是单行数据太大导致,与整体文件的大小无关。
    1. 首先确认是否是分隔符错误,导致所有数据都进入同一行记录,导致单行数据太大。
    2. 如果分隔符正确,文件中的单行数据的确很大,则为客户端程序的内存不够用,需要调整客户端进程的启动参数。打开odpscmd脚本,适当增加Java进程启动选项中的内存值 。如 java -Xms64m -Xmx512m -classpath "${clt_dir}/lib/*:${clt_dir}/conf/"com.aliyun.openservices.odps.console.ODPSConsole "$@" 中将 -Xms64m -Xmx512m的值增大即可。
  • 如果下载数据,通常是数据量太大,客户端程序的内存不够用。打开odpscmd脚本,适当增加Java进程启动选项中的内存值 。如java -Xms64m -Xmx512m -classpath"${clt_dir}/lib/*:${clt_dir}/conf/"com.aliyun.openservices.odps.console.ODPSConsole "$@" 中将-Xms64m -Xmx512m的值增大即可。

MaxCompute数据导出分别有几种格式?

一般使用Tunnel Download导出数据,格式有TXT、CSV,详情请参见Tunnel命令参考

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

报错信息如下。
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这个Writer时出现的。可能有以下几种情况:
    • 对一个已经关闭的Writer做了关闭操作。
    • 这个Writer对应的Session已经关闭。
    • Session已经被提交过。
  • 解决方法:您可以针对上述可能出现的原因进行排查,比如打印一些日志、在提交前打印一些当前Writer的状态与Session的状态。

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

目前Tunnel是无法自动上传数据并自动分配到各个分区的。每一次上传只支持数据上传到一张表或表的一个分区,有分区的表一定要指定上传的分区,多级分区一定要指定到末级分区。Java SDK详情请参见Java SDK

使用Tunnel Java SDK上传数据,如果是分区表,SDK能够动态根据数据创建不同的分区吗?

首先需要创建好分区,在使用SDK上传数据时指定分区。或者您也可以先把数据上传到MaxCompute上的表中,再用SQL语句动态分区。

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

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

使用Tunnel批量数据通道SDK来导入MaxCompute数据库是否有分区限制?

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

关于分区表的更多信息请参见分区

BlockId是否可以重复?

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

Block大小是否存在限制?

一个Block大小上限为100GB,强烈建议大于64MB的数据,每一个Block对应一个文件,小于 64MB的文件统称为小文件,小文件过多将会影响使用性能。

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

Session是否可以共享使用,是否存在生命周期?

每个Session在服务端的生命周期为24小时,创建后24小时内均可使用,也可以跨进程、线程共享使用,但是必须保证同一个BlockId没有重复使用,分布式上传的操作步骤如下:
  1. 创建Session。
  2. 估算数据量。
  3. 分配Block(例如线程1使用0-100,线程2使用100-200)。
  4. 准备数据。
  5. 上传数据。
  6. Commit所有写入成功的Block。

遇到读写超时或IOException时如何处理?

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

建议使用Tunnel-SDK-BufferedWriter

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

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

MaxCompute Tunnel目前有Java及C++版的SDK。

MaxCompute Tunnel是否支持多个客户端同时上传同一张表?

支持。

MaxCompute Tunnel适合批量上传还是流式上传?

MaxCompute Tunnel用于批量上传,不适合流式上传,流式上传可以使用 DataHub 高速流式数据通道

MaxCompute Tunnel上传数据时一定要先存在分区吗?

是的,Tunnel不会自动创建分区。

Dship与MaxCompute Tunnel的关系?

Dship是一个工具,通过MaxCompute Tunnel来进行上传和下载。

Tunnel Upload数据的行为是追加还是覆盖?

追加模式。

Tunnel路由功能是什么原因?

路由功能指的是Tunnel SDK通过设置MaxCompute获取Tunnel Endpoint的功能。因此,SDK可以只设置MaxCompute的Endpoint来正常工作。

用MaxCompute Tunnel上传数据时,一个Block的数据量大小多大比较合适?

需要综合考虑网络情况、实时性要求、数据如何使用以及集群小文件等因素。通常,如果数量较大且是持续上传模式,Block的数据量在64MB~256MB之间, 如果是每天传一次的批量模式,Block可以设置为1GB左右。

使用MaxCompute Tunnel下载,总是提示Timeout,是什么原因?

通常是Endpoint错误,请检查Endpoint配置。简单的判断方法是通过Telnet等方法检测网络连通性。

通过MaxCompute Tunnel下载,报错You have NO privilege如何处理 ?

报错信息如下。
You have NO privilege ‘odps:Select‘ on {acs:odps:*:projects/XXX/tables/XXX}. project ‘XXX‘ is protected.

该项目空间开启了数据保护功能,如果您需要把一个项目中的数据导向另一个项目,需要该项目空间所有者进行操作。

Tunnel上传时异常FlowExceeded如何处理?

报错信息如下。
ErrorCode=FlowExceeded,ErrorMessage=Your flow quota is exceeded
Tunnel对请求的并发进行了控制,默认上传和下载的并发资源组为2000,任何相关的请求发出到结束过程中均会占用一个Quota单位 。若出现类似错误,解决方案有如下几种:
  • 休眠一下再重试。
  • 增大Project的Tunnel并发资源组。此方法需要联系管理员评估流量压力。
  • 请Project Owner控制占用了大量并发资源组的任务。

Tunnel上传时每个Session的生命周期是一天,因源表数据太大,导致Session超时任务失败,如何处理?

建议将源表拆分成2个任务执行。

上传数据Session太多导致上传速度慢,应该如何解决?

应合理设置Block大小。Block ID最大为20000,Session的时间根据具体业务需求设置,Session 提交以后数据才可见。建议您创建Session的频率不要太高,建议最多5分钟一个Session,Session里的Block值应该设置的较大一些,建议每个Block超过64MB。

为什么使用Tunnel命令行在DataIDE上进行分区上传时报错?

报错信息如下。
FAILED: error occurred while running tunnel command.

DataIDE不支持MaxCompute Tunnel命令行工具的Upload语句。

利用Tunnel命令行工具上传数据时,共分为50个Block,开始一切正常,但是在第22个Block时,出现Upload Fail,重试直接跳过开始上传第23个Block,为什么会发生这种情况?

一个Block对应一个HTTP Request,多个Block的上传可以并发且是原子的,一次同步请求要么成功要么失败,不会影响其他的Block。

重传Retry有次数的限制,当重传的次数超过了这个限制,就会继续上传下一个Block。上传完成后,可以通过select count(*) from table;语句,检查是否有数据丢失。

本地服务器每天采集的网站日志有10GB,需要上传至MaxCompute,在使用Tunnel Upload命令上传时速度约为300KB/S,如何提升上传速度?

Tunnel Upload命令上传是不设速度限制的。上传速度的瓶颈在网络带宽以及服务器性能。为了提升性能,可以考虑在上传时分区分表,或在多台ECS上传或下载数据。

如何在Shell脚本中将一个TXT文件中的数据上传到MaxCompute的表中?

请参见客户端设置命令行的启动参数,在Shell中的启动命令如下。
/odpscmd/bin/odpscmd -e “tunnel upload "$FILE" project.table”

MaxCompute使用Tunnel Upload命令上传数据,如果数据里面有回车或空格为什么上传失败?

如果数据里有回车或空格,可以给数据设置不同于回车或空格的分隔符后,用-rd-fd指定对应的分隔符实现数据的上传。如果无法更换数据中的分隔符,可以将数据作为单独一行上传,然后使用UDF解析。例如下面示例数据中包含回车,使用“,”作为列分隔符-rd,使用“@”作为行分隔符-fd,可以正常上传。
shopx,x_id,100@
shopy,y_id,200@
shopz,z_id,300@
上传命令
odps@ MaxCompute_DOC>tunnel u d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false -fd "," -rd "@";
上传结果
+-----------+-------------+-------------+-----------+--------+
| 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
d      | 300.0       | 201312    | hangzhou |
+-----------+-------------+-------------+-----------+--------+

MaxCompute使用TunnelUpload命令上传数据,使用逗号进行列分割,但是数据中有逗号,这种情况如何分割?

如果数据描述字段内本身有逗号,可以考虑转换数据的分隔符为其他符号,再通过-fd指定为其他分隔符进行上传。

MaxCompute使用Tunnel Upload命令上传数据。Tunnel Upload命令默认使用逗号分割的,但数据CSV文件也是用逗号分割的。文件中的一列数据里本身就含有用引号引起来的逗号。这种情况如何处理?

CSV文件使用其他分隔符,可以通过-fd参数指定。

通常,如果数据中有很多符号,可能与分隔符发生冲突,可以自定义数据中的分隔符来避免冲突,比如$#@$@ 或者)$*#@$@$

MaxCompute使用Tunnel Upload命令上传数据时失败,报错java.lang.OutOfMemoryError是什么原因?

数据上传时内存溢出了。目前TunnelUpload命令是支持海量数据的上传的,如果出现内存溢出,可能是因为数据的行分隔符和列分隔符设置错误,导致整个文本会被认为是同一条数据,全部缓存至内存里导致内存溢出报错。

这种情况下可以先用少量的数据进行测试,当-td-fd调试成功后再上传全量数据。

MaxCompute使用Tunnel Upload命令上传数据,需要上传很多个数据文件到一个表中,是否有方法写一个脚本就可以把文件夹下的所有数据文件循环上传上去?

Tunnel Upload命令上传支持文件或目录(指一级目录)的上传,详情请参见Tunnel命令使用说明

例如下述命令,上传数据为文件夹d:\data
odps@ MaxCompute_DOC>tunnel u d:\data sale_detail/sale_date=201312,region=hangzhou -s false;

导入文件夹报错,字段不匹配,但是这个文件夹下的文件单独导入时是可以导入的,是因为文件太大吗?

在Upload命令后加上-dbr=false -s true对数据格式进行验证。

出现column mismatch通常是由于列数不匹配导致的。例如列分隔符设置的不对或者文件最后有空行,导致空行通过分隔符进行分割时列数不对。

MaxCompute使用Tunnel Upload命令上传两个文件,第一个文件上传结束之后,第二个文件没有上传且没有报错信息,是什么原因?

当使用老版本MaxCompute客户端,上传参数有--scan时,续跑模式的参数传递存在问题,将--scan=true去掉重试即可。

MaxCompute使用Tunnel Upload命令把一个目录下的所有文件上传到一个表里,并且想要自动建立分区,执行报错为acp FAILE,是什么原因?

报错信息如下。
Unrecognized option: -acp FAILED: error occurred while running tunnel comman

出现这种报错通常是因为使用了不支持的命令或字符。MaxCompute使用Tunnel Upload命令上传不支持通配符及正则表达式。

MaxCompute使用Tunnel Upload命令上传文件数据报错,是否有类似MySQL的-f参数,可以强制跳过错误数据继续进行上传的命令?

使用-dbr true参数忽略脏数据(多列、少列及列数据类型不匹配等情况)。-dbr参数默认值为false,表示不忽视脏数据,当值为true时,将不符合表定义的数据全部忽略。详情请参见Tunnel命令使用说明

MaxCompute使用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.       

此错误表示当前文件已经在上传或下载中,无法重复操作。

MaxCompute使用Tunnel Upload命令行上传数据,对数据大小有限制吗?

Tunnel Upload命令行通常不会限制需上传的数据大小。

MaxCompute使用Tunnel Upload命令行上传CSV文件,如何跳过第一行表头上传其他数据?

建议使用-h true参数,跳过第一行表头。

一次性上传8000万条数据时,在执行odps tunnel recordWriter.close()时报错StatusConflict,是什么原因?

报错原因如下。
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版本之后新增了BufferredWriter的SDK,简化了数据上传,并且提供了容错功能。BufferedWriter从用户角度看,就是在Session上打开一个Writer然后进行写记录即可。具体实现时,BufferedWriter先将记录缓存在客户端的缓冲区中,并在缓冲区填满之后打开一个http连接进行上传。

BufferedWriter会尽最大可能容错,保证数据上传上去。使用方法请参见BufferedWriter使用指南

MaxCompute使用TunnelUpload命令行上传CSV文件,为什么导入成功后原文本中有很大一部分内容莫名消失?

这种情况很可能是因为数据编码格式错误或者是分隔符使用错误导致上传到表的数据错误。建议规范原始数据后上传。

MaxCompute使用Tunnel Upload上传是否支持引用一个表的配置?

可以使用shell脚本执行Tunnel Upload命令行实现上传。可通过/odpscmd/bin/odpscmd -e执行脚本,并在脚本内粘贴表格配置。

MaxCompute使用Tunnel Upload命令行上传数据,如果数据使用空格作为列分隔符,或需要对数据做正则表达式过滤时该如何处理?

Tunnel Upload命令行不支持正则表达式。如果数据使用空格作为列分隔符,或需要对数据做正则表达式过滤时可借助MaxCompute的UDF自定义函数功能。

首先,将数据作为单列数据上传。本例中原始数据如下,列分割符为空格,行分隔符为回车,并且需要取的部分数据在引号内,部分数据例如”-“需要被过滤。这种复杂的需求可通过正则表达式实现。
10.21.17.2 [24/Jul/2018:00:00:00 +0800] - "GET https://help.aliyun.com/document_detail/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://help.aliyun.com/document_detail/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://help.aliyun.com/document_detail/73479.html" 206 0 83821 83821 "-" "vivo" - HIT - - 0_0_0 003 - - - -
  1. 为使数据单列上传,首先在MaxCompute项目空间内创建一个单列的表格用于接收数据。
    odps@ bigdata_DOC>create table userlog1(data string);
  2. 使用一个不存在的列分隔符\u0000上传数据,从而达到不分割列的效果。
    odps@ bigdata_DOC>tunnel upload C:\userlog.txt userlog1 -s false -fd "\u0000" -rd "\n";
  3. 完成原始数据上传后,使用MaxCompute IntelliJ IDEA编写一个Python UDF(您也可以使用JAVA UDF),详情可参见配置Python开发环境
    1. 使用代码如下。
      from odps.udf import annotate
      from odps.udf import BaseUDTF
      import re           #此处引入正则函数
      regex = '([(\d\.)]+) \[(.*?)\] - "(.*?)" (\d+) (\d+) (\d+) (\d+) "-" "(.*?)" - (.*?) - - (.*?) (.*?) - - - -'             #使用的正则表达式
      # 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
    2. 完成函数的编写后,上传代码。完成函数的编写后,选择上传代码。11
    3. 完成上传后,注册函数并填写函数名称,本例中函数名称为ParseAccessLog。
  4. 函数上传完成后,就可以使用编写的UDF函数处理上传到表格userlog1的原始数据了,注意不要写错列的名称,本例中为data。您可以使用正常的SQL语法,新建一个表格userlog2用于存放处理后的数据。
    odps@ bigdata_DOC>create table userlog2 as select ParseAccessLog(data) as (ip,date,request,code,c1,c2,c3,ua,q1,q2,q3) from userlog1;
    完成处理后,可以观察到目标表已创建,数据成功分列。
    +----+------+---------+------+----+----+----+----+----+----+----+
    | ip | date | request | code | c1 | c2 | c3 | ua | q1 | q2 | q3 |
    +----+------+---------+------+----+----+----+----+----+----+----+
    | 10.21.17.2 | 24/Jul/2018:00:00:00 +0800 | GET https://help.aliyun.com/document_detail/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://help.aliyun.com/document_detail/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://help.aliyun.com/document_detail/73479.html | 206  | 0  | 83821 | 83821 | vivo | HIT | 0_0_0 | 003 |
    +----+------+---------+------+----+----+----+----+----+----+----+

MaxCompute使用Tunnel Upload命令上传数据,如何实现批量上传一个目录下的多个文件到同一张表,并且每个文件放在不同的分区内?

可以巧妙的利用Shell脚本实现上述功能,本章节中以在Windows环境下配合odpscmd客户端使用Shell脚本举例,Linux环境下原理相同。Shell脚本内容如下。
#!/bin/sh
C:/odpscmd_public/bin/odpscmd.bat  -e "create table user(data string) partitioned by (dt int);" //首先创建一个分区表user,分区关键字为dt,本例中odpscmd客户端的安装路径为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举例。回显
完成上传后,您可以在odpscmd客户端查看表数据。回显2

MaxCompute使用Tunnel Upload命令上传数据时为什么报错java.io.IOException?

详细报错信息如下。
java.io.IOException: Error writing request body to server
这是一个上传数据到服务器时的异常,通常是因为上传过程中的网络连接断开/超时导致的。
  • 当您的数据源并非是本地文件,需要从数据库等地方获取,因此数据在写入的过程中还需要等待数据获取而导致超时。目前UploadSession在上传数据的过程中,如果600秒没有数据上传,则被认为超时。
  • 用户通过公网的Endpoint进行数据上传,由于公网网络质量不稳定导致超时。
解决方法如下:
  • 在上传的过程中,先获取数据,再调用Tunnel SDK上传数据。
  • 一个Block可以上传64MB~1GB的数据,最好不要超过1万条数据以免因重试导致超时。一个Session可以拥有最多2万个Block。如果您的数据在ECS上,可以参见配置Endpoint

MaxCompute使用Tunnel Upload命令行上传数据,设置了经典网络的Endpoint,但为什么会连接到外网的Tunnel Endpoint?

配置文件odps_config.ini中除了Endpoint之外还需要配置Tunnel_Endpoint。请参见配置Endpoint进行配置。目前只有华东2(上海)区域不需要设置Tunnel Endpoint。

MaxCompute使用Tunnel Upload命令行上传数据是否支持限速?

目前MaxCompute使用Tunnel Upload命令行不支持限速,需要通过SDK单独处理。

MaxCompute使用Tunnel Upload命令行上传数据太慢如何处理?

如果上传数据太慢,可以考虑使用-threads参数将数据切片上传,例如将文件切分为10片上传。
odps@ bigdata_DOC>tunnel upload C:\userlog.txt userlog1 -threads 10 -s false -fd "\u0000" -rd "\n";

MaxCompute使用Tunnel Upload命令行上传数据,是按照数据压缩前还是压缩后的大小计费?

按照Tunnel压缩后的大小进行计费。

DataWorks的最大屏显行数是多少?

DataWorks默认显示10000行,显示行数目前在DataWorks上不可配置。如果您需要下载数据,请使用Tunnel Download。

Tunnel目录文件支持中文吗?

支持中文。

Tunnel是否支持.dbf后缀非加密数据库文件?

Tunnel支持文本文件,不支持二进制的文件。

Tunnel是否支持多并发?

支持,命令如下。
tunnel upload E:/1.txt tmp_table_0713 --threads 5;       

Tunnel导入数据时报错分区不存在,如何处理?

  • 问题现象:在执行一些操作时,例如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上传数据报错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个数不符合预期。

如问题还未解决,请提工单

Tunnel SDK如何一次下载分区表里的所有分区?

  • 问题现象:使用Tunnel SDK下载分区表,返回如下报错信息。
    ErrorCode=MissingPartitionSpec, ErrorMessage=You need to specify a partitionspec along with the specified table.       
  • 问题原因:使用Tunnel SDK下载分区表,需要指定分区列的列值,否则会报错。
  • 解决方法:
    • 如果您使用客户端工具里的Tunnel命令行进行导出,客户端支持分区表整个导出,其结果会导出到一个文件夹里。
    • 如果您使用Tunnel SDK进行导出,可以先使用SDK获取分区表的所有分区,如下。
      odps.tables().get(tablename) t.getPartitions()      

如问题还未解决,请提工单

如何使用Tunnel下载部分指定数据?

目前Tunnel不支持数据的计算或者过滤。如果需要实现此功能,您可以考虑以下两种方法:
  • 先运行SQL任务,将需要下载的数据保存成一张临时表,下载结束后再删除此临时表。
  • 如果您所需要的数据量比较小,可以使用SQL命令直接查询需要的数据,无需下载。

Tunnel上传数据如何实现覆盖重写的功能?

目前Tunnel只提供追加的插入方式,如果用户需要覆盖重写,请先删除分区里的数据后再插入数据。
  • 如果表是分区表,可以使用ALTER TABLE TABLE_NAME DROP [IF EXISTS] PARTITION partition_spec;命令。
  • 如果是非分区表,可以使用TRUNCATE TABLE table_name;命令。

为什么MaxCompute控制台下载数据返回JSON文件?

  • 问题现象:通过DataWorks下载数据,却得到名为getTableDataCsv.json的文件,内容如下:
    {"code":"-100","message":"needLogin","success":"false"}       
  • 问题原因:出现上述问题,是因为未获取用户的登录信息。
  • 解决方法:
    • 可能是会话超时,请重新登录后再试。
    • 可能是一个浏览器多个页签中同时登录了多个账号,导致被系统认为没有登录。请先关闭其他页签并重新登录后再试。
    • 可能是使用了类似迅雷的下载软件,因为下载软件并没有保存用户的登录信息,导致被系统认为没有登录。请直接下载数据即可,不需使用下载软件。

MaxCompute导出的数据有几种格式?

一般使用Tunnel Download导出数据,格式有TXT、CSV,详情请参见Tunnel命令使用说明

同一Region内使用Tunnel下载数据为什么会产生费用?

同一Region内使用Tunnel下载数据,必须配置经典网络/VPC类型的Tunnel Endpoint,否则数据可能路由到其他Region,从公网下载从而产生费用。

使用Tunnel SDK上传为何提示重复提交?

  • 问题现象:使用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)       
  • 问题原因:由上述报错可见,此问题是在准备关闭此Writer时出现的。可能有以下几种情况:
    • 对一个已经关闭的Writer执行关闭操作。
    • 这个Writer对应的Session已经关闭。
    • Session已经被提交过。
  • 解决方法:请对上述可能出现的原因进行排查,例如打印日志、在提交前打印当前Writer与Session的状态。

报错Unauthorized是什么原因?

可能原因为:
  • AccessKey ID或AccessKey Secret有误。
  • 本地机器时间与服务端时间相差15分钟以上。

  • 问题现象:报错信息如下。
    ErrorCode=Unauthorized, ErrorMessage=The request authorization header is invalid or missing.
  • 问题原因:可能原因如下:
    • AccessKey ID或AccessKey Secret有误。
    • 本地机器时间与服务端时间相差15分钟以上。
  • 解决方法:
    • 检查AccessKey ID和AccessKey Secret是否有误。
    • 将机器的本地时间调整后,重新打开客户端。对于国内Region,设备获取当前时间即可。

使用MaxCompute Tunnel或者Dship下载数据时,如何设置Endpoint更合理?

您可以通过公网或者阿里云内网环境对MaxCompute Tunnel进行访问。当您在阿里云内网环境中,使用MaxCompute Tunnel内网连接下载数据时,MaxCompute不会将该操作产生的流量计入计费。

不同网路环境Tunnel Endpoint配置请参见配置Endpoint

Tunnel地址支持自动路由。
说明 当使用Tunnel时,MaxCompute及Tunnel的公网及内网地址需要配对使用。

MaxCompute不支持删除部分数据,该如何删除部分脏数据?

建议一个单表(没有分区的表)或一个分区尽量一次性写完(所有数据WRITE完毕后,只调用一次COMPLETE),不要多次去写同一个分区,否则容易出现脏数据。一旦出现脏数据,可以通过以下方法进行删除:
  • 删除整个表或该分区,重新上传数据。
  • 如果脏数据可以通过WHERE条件过滤出来,也可以通过INSERT + WHERE条件,把需要的数据导入到另一张新表或就地更新(源和目的分区/表名相同的更新方式)。

Fluented插件报错ShardNotReady,如何处理?

  • 问题现象:使用Fluentd插件fluent-plugin-aliyun-odps,运行几天后突然报错如下。
    ShardNotReady, Message: write failed because Shard may wait to be loaded now                  
  • 问题原因:出现上述报错的原因,如下所示:
    • 可能系统正在升级,会短暂出现这个问题,会很快恢复。
    • Fluentd存在多个进程,请查看配置项Shard_Num是否都配置为相同的值,如果值不同则会导致这个问题。
    • 存在其他方式(例如SDK)执行了Loadshard/Unloadshard的操作导致此问题。

调用StreamWriter向MaxCompute中写入数据时,报错“ErrorCode=MalformedDataStream”,如何处理?

多个线程调用同一个StreamWriter就会出现此错误。建议您使用多个线程,每个线程建立一个StreamWriter,Session是可以多线程用一个。

上传数据的流程是什么?

根据具体场景,流程会有所不同。通常,流程如下:
  1. 准备源数据,例如源文件或数据表。
  2. 设计表结构和分区定义,进行数据类型转换,然后在MaxCompute上创建表。
  3. 在MaxCompute表上添加分区(没有分区时忽略此步骤)。假如使用日期作分区,则添加分区,如:“20140312”。
  4. 把数据上传到指定分区或表上。

如何将OSS上存储的数据文件上传至MaxCompute?

将数据文件从OSS下载到ECS,再通过内网或外网连接上传到MaxCompute。

如果数据存储在阿里云的ECS、RDS 或OSS上,将数据上传至MaxCompute的速度如何?

数据的上传速度分以下两种情况:
  • 如果数据存储的节点(ECS等)在杭州,则可以进行内网数据传输,效率非常高,单线程能够达到50000条/秒或 20MB/s。
  • 如果数据存储的节点在青岛或北京,需要采用公网方式上传或下载,速度取决于公网的速度。

若数据不在云上存储而是在本地存储,是否可以上传到MaxCompute中?

可以,MaxCompute支持通过公网方式上传或下载数据。
说明
  • 运行效率取决于网络带宽。
  • 因为公网存在不稳定情况,如果数据量较大,请在代码中实现并发和断点续传逻辑。
  • 如果是长期运行,建议把服务器迁移到阿里云。内网环境下上传或下载效率要比公网环境下高百倍左右。
  • 如果历史数据量非常大,建议您提交工单,以协商数据传输方案。

使用DataWorks导入一个包含有中文的TXT文件,导入和查看均正常,但在MaxCompute客户端查看表详情时,中文显示为乱码是什么原因?

请保证您的TXT文件为UTF-8格式。若不是,您可以用记事本打开文件,单击 另存为,将其保存为UTF-8格式。

使用Tunnel上传数据无法导入表中,为何报Java异常Column Mismatch?

通常情况下,可能是数据源文件的行分隔符有问题,将多条记录当成一条记录了。您需要查看是否存在此问题,并重新设置-rd参数。

如何从MaxCompute上批量导入数据到OCS业务场景(需要定时从MaxCompute上将Key-Value的Value值批量导入OCS)?

您可以定时调用MaxCompute的Tunnel SDK读取MaxCompute的数据,处理后再用OCS的SDK把数据写入OCS内。更多详细信息,请参见DownloadSession

HubTable数据上传必须用Java SDK吗?能否仅使用客户端完成?

不能,目前只支持在客户端执行hub load 3 shards on test_project.test_table命令加载Shard,之后还是要用SDK来上传数据。

MaxCompute里存储的数据可以导出到E-MapReduce中吗?

目前E-MapReduce支持HDFS和OSS。 但还没有工具可以直接从MaxCompute导入到HDFS。

可以通过DataWorks数据集成将MaxCompute中的数据导入到OSS中, 然后使用SDK导入到HDFS,也可以在OSS上长期保存,计算时再读取使用。

DataHub 的应用场景是什么?

Datahub用于实时上传数据的场景,主要用于流式计算。数据上传后会保存到实时表里,后续会在几分钟内通过定时任务的形式同步到离线表里,供离线计算使用。

DataHub表和MaxCompute中创建的表,是否是一个表?

MaxCompute的表分为离线表和在线表,Datahub的表是在线表。只有在线表才能处理Datahub数据,以及作为流式计算的输入源。

在线表的数据,会每隔几分钟开启一个定时任务归档到离线表里,所以在线表的数据和离线表的数据是有几分钟的延迟。

MaxCompute中,DataHub是否有流量限制?

在MaxCompute中上传实时数据,将数据通过某个数据通道(Shard)写入MaxCompute表中时,多个客户端可以同时往一个Shard中写。

目前的流量限制为一个Shard数据包5000pack/s,流量10MB/s。您可以根据数据表实际的写入流量,配置一个或者多个Shard。

使用DataHub,为何持续报错“ErrorCode:ShardNotReady”?

DataHub写入数据的分区不存在因此报错,请手动创建缺少的分区重试即可。

Tunnel命令上传数据时,需要设置行分隔符和列分隔符,但是如果源数据里也包含这样的字符,会导致Tunnel命令解析数据的时候出现异常,报错提示列数不匹配,如何处理?

建议您使用如下办法解决:
  • 如果可以修改原文件的分隔符,将原文件中的分隔符修改为一些比较特殊的,数据里不会包含的字符或者字符串,然后通过设置-rd-fd修改上传时的分隔符设置,从而正确解析。详情请参见Tunnel命令使用说明
  • 如果有特定的逻辑可以解析原文件,您可以考虑编写Tunnel SDK代码读取原文件后解析字符串并上传。详情请参见批量数据通道概要

如问题还未解决,请提工单

当一份数据源中的数据对应MaxCompute分区表的多个分区,如何根据数据的内容导入到不同的分区里?

数据导入时只能将数据导入到非分区表或者是分区表的指定分区里。如果需要将数据导入到不同的分区中,可以先创建一张表临时存放所有的导入数据,然后使用SQL进行动态分区。更多动态分区语法请参见输出到动态分区(DYNAMIC PARTITION)
  • 如果通过Tunnel等方法实现数据的导入,可以在完成导入后,自行运行SQL进行动态分区。
  • 如果通过DataWorks的同步任务执行每天的定时任务,可以在同步任务结束后再运行SQL任务,并把SQL任务的父任务设置成同步任务。

Datahub和Tunnel应用场景的区别是什么?

Datahub用于实时上传数据的场景,主要用于流式计算的场景。数据上传后会保存到实时表里,后续会在几分钟内通过定时任务的形式同步到离线表里,供离线计算使用。

Tunnel用于批量上传数据到离线表里,适用于离线计算的场景。

DataHub上传数据时,对数据大小有哪些限制?

每个字段的大小不能超过这个字段本身的限制,详情请参见数据类型,例如STRING类型的长度不能超过8MB。

目前上传的过程,是将多条数据打包成一个Package后上传。

多线程上传数据时报错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.)      
  • 问题原因:上传数据时高并发写入同一个表,频繁并发操作导致报错。
  • 解决方法:请适当减少并发数,在请求之间加入延迟时间,并且在出错的时候重试。

MaxCompute如何通过Sharding-JDBC抽取和回流数据?

目前MaxCompute不支持通过Sharding-JDBC抽取和回流数据。JDBC的更多信息请参见概述