本文介绍使用数据迁移工具ossimport的常见问题及解决方法。

通用说明

本文提到的所有涉及ossimport的命令均为简写,实际操作时,需补全命令。

  • Windows系统需加上console.bat进行补全,例如submit实际为console.bat submit
  • Linux系统需要加上bash console.sh进行补全,例如submit实际为bash console.sh submit

迁移失败常见问题

如果迁移文件失败,建议您先查看迁移失败日志,确认失败的原因。您可以在解决这些问题后使用retry命令进行重试。迁移失败日志的路径为master/jobs/${JobName}/failed_tasks/${TaskName}/audit.log

使用stat命令查看任务状态显示失败

解决方法:使用stat命令查看迁移任务状态,如果JobState为failed,则迁移任务失败。迁移完成后请使用retry命令进行重试。

部分文件迁移失败后反复重试都无法成功迁移

解决方法:

  1. 查看迁移失败文件列表master/jobs/${JobName}/failed_tasks/${TaskName}/error.list,获取失败文件的相对路径。
  2. 确认是否有这部分文件的权限访问、文件是否被删除、是否是软链接文件、文件名是否存在乱码等。
  3. 解决以上问题后,使用retry命令进行重试。

迁移失败日志报错The bucket you are attempting to access must be addressed using the specified endpoint.

Exception:com.aliyun.oss.OSSException: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
<Error>
  <Code>AccessDenied</Code>
  <Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
  <RequestId>56EA98DE815804**21B23EE6</RequestId>
  <HostId>my-oss-bucket.oss-cn-qingdao.aliyuncs.com</HostId>
  <Bucket>my-oss-bucket</Bucket>
  <Endpoint>oss-cn-hangzhou.aliyuncs.com</Endpoint>
</Error>

迁移失败日志报错The request signature we calculated does not match the signature you provided.

Exception:com.aliyun.oss.OSSException: The request signature we calculated does not match the signature you provided. Check your key and signing method.
[ErrorCode]: SignatureDoesNotMatch
[RequestId]: xxxxxxx
[HostId]: xxx.oss-cn-shanghai.aliyuncs.com
  • 问题原因:destAccessKeydestSecretKey填写错误。
  • 解决方法:请填写正确的AccessKey信息。

迁移失败日志报错The bucket name “xxx/xx” is invalid.

java.lang.IllegalArgumentException: The bucket name "xxx/xx" is invalid. A bucket name must: 1) be comprised of lower-case characters, numbers or dash(-); 2) start with lower case or numbers; 3) be between 3-63 characters long.
  • 问题原因:destBucket填写错误。
  • 解决方法:填写正确的Bucket名称。关于Bucket名称的命名规范,请参见存储空间命名

迁移失败日志报错Connect to xxx.oss-cn-beijing-internal.aliyuncs.com:80 timed out.

Unable to execute HTTP request: Connect to xxx.oss-cn-beijing-internal.aliyuncs.com:80 timed out
[ErrorCode]: ConnectionTimeout
[RequestId]: Unknown
  • 问题原因:这个是连接超时的报错,通常原因是迁移用的设备非ECS实例或不是与OSS同地域的ECS实例,但是配置文件使用了OSS的内网域名。OSS内网域名仅支持同地域ECS实例访问。
  • 解决方法:
    • 修改配置文件中域名为外网Endpoint,清除任务后重新提交任务。
    • 使用与OSS同地域的ECS实例运行迁移任务。

迁移失败日志报错The specified bucket is not valid.

com.aliyun.oss.OSSException: The specified bucket is not valid.
[ErrorCode]: InvalidBucketName
[RequestId]: 57906B4DD0EBAB0FF553D661
[HostId]: you-bucket.you-bucketoss-cn-hangzhou-internal.aliyuncs.com
  • 问题原因:destDomian配置错误。
  • 解决方法:destDomian配置的域名是Bucket所在地域的Endpoint地址,而不是带Bucket名称的二级域名。例如Bucket所在地域为华北2(北京),应填写oss-cn-beijing.aliyuncs.com。详情请参见配置文件示例

迁移失败日志报错Unable to execute HTTP request: The Difference between … is too large.

Unable to execute HTTP request: The Difference between the request time and the current time is too large.
[ErrorCode]: RequestTimeTooSkewed
[RequestId]: xxxxxxx
  • 问题原因
    • 本地机器时间不对,与OSS服务器时间相差15分钟以上,该情况居多。
    • 可能是并发太高,尤其是CPU占用率很高,导致并发上传慢。
  • 解决方法
    • 修改本地机器时间,与OSS服务器一致。
    • 如果是并发问题,可以通过降低sys.properties文件的workerTaskThreadNum参数调整并发。

迁移失败日志报错No route to host.

  • 问题原因:可能本地防火墙或者iptables等原因导致网络不通。
  • 解决方法:通过ping命令测试迁移服务器到源端和目的端网络是否正常。
    • 如果网络正常,检查电脑防火墙和本地的防火墙设备是否有限制,可尝试关闭防火墙进行测试。
    • 如果网络异常,排查网络原因进行相关处理后重试。

使用HTTP模式迁移,迁移失败日志报错Unknown http list file format.

  • 问题原因:指定的HTTP列表文件格式错误或内容不符合规范。
  • 解决方法:
    • 如果是从其他操作系统上拷贝的文件,Linux系统可以用mac2unix、dos2unix等相关命令转换文件格式;Windows系统可以使用notepad等工具转换格式。
    • 如果是列表文件内容的格式不正确,请修改为正确的格式。关于列表文件内容的格式,请参见说明及配置

迁移失败日志报错The object key “/xxxxx.jpg” is invalid.

Exception:java.lang.IllegalArgumentException: The object key "/xxxxx.jpg" is invalid. An object name should be between 1 - 1023 bytes long when encoded as UTF-8 and cannot contain LF or CR os unsupported chars in XML1.0, and cannot begin with "/" or "\".
  • 问题原因:srcPrefix或者destPrefix填写错误。
  • 解决方法
    • 检查srcPrefix是否为目录。如果是目录,请以正斜线(/)结尾。
    • 检查destPrefix是否以正斜线(/)或者反斜线(\)开头。如果是,请删除正斜线(/)或反斜线(\)。

任务运行常见问题

如果在迁移运行过程中出现问题,您可以先查看任务运行日志。

  • 单机部署:运行日志的文件路径为logs/ossimport2.log
  • 分布式部署:运行日志的文件路径为logs/import.log

执行任何命令均报错UnsupportedClassVersionError.

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/aliyun/ossimport2/OSSImport2 : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at com.simontuffs.onejar.JarClassLoader.defineClass(JarClassLoader.java:693)
        at com.simontuffs.onejar.JarClassLoader.findClass(JarClassLoader.java:599)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at com.simontuffs.onejar.Boot.run(Boot.java:300)
        at com.simontuffs.onejar.Boot.main(Boot.java:159)
  • 问题原因:Java版本过低。
  • 解决方法:将Java版本升级为1.7或1.8版本。

使用submit命令提交任务报错InvocationTargetException.

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.simontuffs.onejar.Boot.run(Boot.java:306)
        at com.simontuffs.onejar.Boot.main(Boot.java:159)
Caused by: java.lang.NullPointerException
        at com.aliyun.ossimport2.config.JobConfig.load(JobConfig.java:44)
        at com.aliyun.ossimport2.OSSImport2.doSubmitJob(OSSImport2.java:289)
        at com.aliyun.ossimport2.OSSImport2.main(OSSImport2.java:120)
        ... 6 more
  • 问题原因:系统检查配置文件时发现配置文件不完整,例如某些配置项被删除或已注释。
  • 解决方法:还原配置文件中被删除或注释的配置项。对于不需要配置的内容请在等号后留空删除配置项。配置示例请参见配置文件示例

任务运行日志报错com.aliyun.oss.ClientException: Unknown.

com.aliyun.oss.ClientException: Unknown
[ErrorCode]: NonRepeatableRequest
[RequestId]: Cannot retry request with a non-repeatable request entity.  The cause lists the reason the original request failed.
  • 问题原因:com.aliyun.oss.ClientException: Unknown.以及SocketTimeoutException错误通常是网络被占满。
  • 解决方法:ossimport会自动进行重试,如果重试完后仍然失败,您可以在任务完成后调用retry命令再次重试。

Linux系统运行日志报错too many open files.

解决方法:使用ulimit -n查看系统句柄。

  • 如果值在10,000以下,先通过ulimit -n 65536增大该值,然后重启进程。
  • 如果值在10,000以上,先通过sudo lsof -n排查是哪些进程打开了句柄。然后评估这些进程是否需要保留。如果不需要请释放相应的句柄。

Windows系统启动任务后秒退

  • 问题原因
    • 没安装Java或Java版本低于1.7。
    • 配置文件错误。
  • 解决方法
    • 安装1.8版本的Java。
    • 按照示例正确编辑配置文件。配置示例,请参见配置文件示例

使用submit命令提交任务后,通过stat命令查看任务状态一直显示no jobs is running or finished.

bash console.sh stat
[WARN]   List files dir not exist : /home/<user>/ossimport/workdir/master/jobs/
no jobs is running or finished.
  • 问题原因:任务开始运行时,未启动服务。任务已提交且服务已启动后,才能通过stat命令才能查看到任务的运行状态。
  • 解决方法
    • 使用start命令启动服务。
    • 如果服务已启动,且任务刚提交,Master需要先去扫描文件列表,这时Task还没有真正生成和分发,因此出现该报错是正常现象。
    • 如果服务已启动,且任务已提交一段时间后仍然出现该错误,需查看该进程启动后是否异常退出。如果是单机部署,请通过logs/ossimport2.log查看日志文件。如果是分布式部署,请通过logs/ossimport.log查看日志文件。找到异常原因并解决,然后再启动服务进程。

使用stat命令查看任务状态一直显示scanFinished:false.

解决方法:观察Task的总数是否增加。

  • 如果Task总数增加,则表明Job的文件列表还在List新的文件,是正常现象。
  • 如果Task总数没变化,且Job配置的是增量模式,scanFinished不为true的情况下,ossimport会根据您配置的间隔时间定期扫描文件列表,检查有无新增或修改的文件。
  • 如果不是增量模式,Task数不会增多,此时应检查运行日志是否异常。如果是单机部署,请通过logs/ossimport2.log查看日志文件。如果是分布式部署,请通过logs/ossimport.log查看日志文件。找到异常原因并解决,然后再启动服务进程。

Linux系统服务进程异常,日志却没有输出异常

  • 问题原因:如果机器的可用内存少于2 GB,服务进程可能因为内存不足出现异常。
  • 解决方法:请检查dmesg日志是否存在因内存不足导致进程异常的记录。

进程异常后,重启服务时需要执行哪些操作

解决方法:如果没有使用clean命令清除同名任务,所有提交过的Job都会有断点记录。您可以直接调用start命令启动服务即可,已经提交的Job不需要重新提交。

如何将Linux系统中文件名乱码的文件上传到OSS

解决方法:
  1. 确认乱码文件的编码格式。
  2. 使用export LANG="<your file name encode>"命令解析编码。
  3. 使用clean命令清除原来的Job,然后使用submit命令重新提交Job。

启动服务时报错java.nio.file.AccessDeniedException.

  • 问题原因:没有权限访问配置文件。
  • 解决方法
    • 将配置文件的权限设置为所有人可读。
    • 将操作系统账号切换为管理员后启动服务。

Task个数显示为0,但JobState显示成功

[2015-12-28 16:12:35]   [INFO]  JobName:dir_data
[2015-12-28 16:12:35]   [INFO]  Pending Task Count:0
[2015-12-28 16:12:35]   [INFO]  Dispatched Task Count:0
[2015-12-28 16:12:35]   [INFO]  Succeed Task Count:0
[2015-12-28 16:12:35]   [INFO]  Failed Task Count:0
[2015-12-28 16:12:35]   [INFO]  Is Scan Finished:true
[2015-12-28 16:12:35]   [INFO]  JobState:SUCCEED
  • 问题原因
    • srcPrefix填写错误,导致列举不出来文件。
    • srcPrefix下只有目录,没有文件,因为目录概念是OSS模拟出来的,不会被真正上传。
  • 解决方法:填写正确的srcPrefix参数,并确保srcPrefix中有可用文件。

提交任务时报错InvocationTargetException.

submit job:/disk2/ossimport2/local_job.cfg
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.simontuffs.onejar.Boot.run(Boot.java:306)
        at com.simontuffs.onejar.Boot.main(Boot.java:159)
Caused by: java.lang.NullPointerException
        at com.aliyun.ossimport2.OSSImport2.doSubmitJob(OSSImport2.java:289)
        at com.aliyun.ossimport2.OSSImport2.main(OSSImport2.java:120)
        ... 6 more
  • 问题原因:配置文件错误或配置文件路径错误。
  • 解决方法
    • 正确配置conf/sys.properties中的配置项workingDir
    • 检查配置文件路径是否正确。

同步过程中显示源端的文件不存在

问题原因:Master执行迁移任务时,会先List文件列表,然后按照文件列表迁移数据。如果List操作完成后,源端某些文件被删除,则出现源端文件不存在的情况。此时,Master会跳过已删除的源端文件,并在错误列表里输出此类文件。

Job配置文件正确,但迁移任务时,运行状态和Job配置文件不符。

  • 问题原因:如果之前提交过迁移任务,任务被中止后,对Job配置文件的修改不生效。
  • 解决方法:使用clean命令清除之前的任务,待Job配置文件修改完成后重新提交任务。

文件正常传输,但报错NullPointerException.

  • 问题原因:ossimport2.3.5版本新增文件统计功能,该功能需要加载cpt文件,而HTTP任务的cpt加载格式与其他源不同,导致程序不匹配出现异常。
  • 解决方法
    • 将ossimport回退至2.3.4版本。
    • 忽略该报错。该问题只是打印报错,不影响迁移任务。

又拍云迁移常见问题

又拍云迁移的任务数一直显示0

解决方法:查看任务运行日志。

[2016-07-21 10:21:46] [INFO] [name=YoupaiList, totalRequest=1729925, avgLatency=38,
          recentLatency=300000]
  • 如果日志中recentLatency小于或等于30,000,表示正常List文件。又拍云List过程较慢,通常会超出30秒的超时时间。返回文件的个数取决于30秒内List的文件个数,请等待List操作完成。
  • 如果recentLatency数值较低,通常是账号密码填写错误。又拍云的SDK出错只返回null,不返回错误结果。这种情况下,需要通过抓包的方式获取又拍云返回的错误码进行排查。

又拍云迁移时如何填写srcAccessKeysrcSecretKey

解决方法:填写又拍云操作员的账号和密码 。

又拍云迁移时一直显示HTTP 429错误

  • 问题原因:又拍云对SDK访问间隔进行了限速处理。
  • 解决方法:请联系又拍云解除限速限制。

任务完成OSS控制台显示的数据量比源数据量小

  • 问题现象:Job全部成功上传完后,OSS控制台里显示Bucket大小无变化,但是Linux系统下使用du命令统计的大小与数据量实际大小相差较大。
  • 问题原因
    • OSS控制台的Bucket数据量会延迟1~2小时更新,请在1~2小时后查看Bucket大小是否有变化。
    • Linux系统的du命令统计的是数据块大小,数据块大小大于数据量实际大小。建议使用 ls -lR <目录绝对路径> | grep "\-rw" | awk '{sum+=$5}END{print sum}'命令统计本地目录的实际大小。

Linux系统执行时命令时出现unknown command “java”、 unknown command “nohup等提示

  • 问题原因:没有安装对应命令。
  • 解决方法:请使用yumapt-getzypper命令安装相应的命令。

配置文件中的srcPrefix是否支持指定为文件格式

不支持。srcPrefix只支持目录或者前缀级别。

ossimport是否支持设置代理

不支持。

OSS之间的迁移为什么还会产生费用

如果配置了内网域名,将不收取流量费用,但仍然收取访问次数的费用。

开启增量模式后,OSS是否会同步删除本地已删除的文件

不删除。本地删除操作不会同步到OSS。

开启增量模式后,本地新增的文件没有被同步到OSS

增量模式通过对比文件最后修改时间来判断文件是否为增量。Linux的mv、Windows的cp、mv以及rsync带-t或者-a参数等操作不会修改文件的最后修改时间,因此通过此类操作修改的文件不会被扫描,也不会同步迁移至OSS。

迁移文件到OSS时是否支持同步迁移文件权限

不支持。您可以在迁移完成后使用命令行工具ossutil的set-meta命令修改文件权限。具体操作,请参见set-meta(管理文件元信息)