本文介绍使用数据迁移工具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>

    问题分析:srcDomaindestDomain填写错误,请按照域名列表填写正确的Endpoint。

  • 迁移失败日志报“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有误,请填写正确的AK信息。

  • 迁移失败日志报“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名称是不带正斜线(/)以及路径的。

  • 迁移失败日志报“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配置的域名是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是否以正斜线(/)或者反斜线(\)开头。如果是,请删除正斜线(/)或反斜线(\),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版本过低,请更新到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查看系统句柄。
    • 如果值在一万以下,可以通过ulimit -n 65536调大,之后重启进程即可。
    • 如果本来就设置的比较大,使用sudo losf -n排查是哪些进程打开了句柄,您可以评估下这些进程是否需要,如果不需要可以kill掉它们从而释放相应的句柄。
  • Windows系统启动任务后秒退
    问题分析:
    • 没安装Java或Java版本低于1.7。
    • 配置文件错误。
    解决方案:
    • 安装正确的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命令才可以查看到任务的运行状态 。
    • 若仅使用submit命令提交了任务,而没有使用start命令启动服务,则会一直报“no jobs is running or finished”。您需要使用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系统服务进程挂掉,日志却没有输出异常

    问题分析:如果机器的可用内存少于2GB,服务进程很可能是因为内存不足被杀掉了。可以检查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显示成功

    问题现象:Pending Task Count和Diapatched Task Count都显示为0,但JobState显示为SUCCEED。

    [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

    问题分析:这种情况一般是配置文件错误或配置文件路径错误。

    解决方案:
    1. 正确配置conf/sys.properties中的配置项workingDir
    2. 若配置无问题,检查配置文件路径是否正确。
  • 同步的过程中显示源端的文件不存在

    问题分析:Master是先List出文件列表,之后按照文件列表做数据迁移。若List完成后,源端某些文件被删除,就会出现源端文件不存在的情况。这种文件会被跳过,并把文件输出在错误列表里。

  • 迁移任务与配置文件不符

    问题描述:Job配置文件正确,但进行迁移任务的时候,运行状态和Job配置文件不符。

    问题分析:如果之前提交过迁移任务,任务被中止后修改Job配置文件是不会生效的。

    解决方案:使用clean命令清除之前的任务,待Job配置文件修改完成后重新提交任务即可。

又拍云迁移常见问题

  • 又拍云迁移的任务数一直显示0
    问题分析:首先查看任务运行日志。
    [2016-07-21 10:21:46] [INFO] [name=YoupaiList, totalRequest=1729925, avgLatency=38,
              recentLatency=300000]
    • 如果这条日志中recentLatency小于或等于30000,表示在正常List文件。又拍云List过程比较慢,一般都会超过30秒的超时时间。30秒内List出几个文件就返回几个文件,这种情况等任务慢慢List完成就可以了。
    • 如果recentLatency很小,一般是账号密码填写错误。因为又拍的SDK出错只返回null,并不返回错误结果,所以只能先通过抓包的方式获得又拍云返回的错误码进行排查。
  • 又拍云迁移时srcAccessKeysrcSecretKey填写什么

    填写又拍云的操作员账号和密码 。

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

    又拍云对SDK访问间隔做了限制,如果访问稍微快一点就会进行限速。请联系又拍云的客服放开限制。ossimport本身会对这种情况进行重试。

一般性问题

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

    问题描述:Job全部成功上传完后OSS控制台里没有看到Bucket的大小有变化,或者Linux系统下用du命令统计的大小相差很大。

    问题分析:
    • OSS控制台的Bucket数据量是延迟1~2小时更新的。
    • Linux系统的du命令统计的是块大小,会比实际文件要大。您可以使用 ls -lR <目录绝对路径> | grep "\-rw" | awk '{sum+=$5}END{print sum}'。命令统计本地目录的真实大小。
  • Linux系统执行时命令时出现unknown command “java”、 unknown command “nohup”等提示

    问题分析:使用的对应命令没有安装,请根据系统使用yumapt-getzypper 命令安装相应的命令。

  • 配置文件里的srcPrefix能单独指定文件吗

    不可以,srcPrefix只支持目录或者前缀级别,不支持单独指定文件。

  • 是否支持设置代理

    目前不支持代理。

  • OSS迁移到OSS为什么还会产生费用

    如果是配置的内网域名,将不收取流量费用,但访问次数的费用是依旧计费的。

  • 开启增量模式,本地删除后OSS上会不会被删

    开启增量模式,本地删除后OSS上不会被删,删除操作不会被同步。

  • 开启增量模式,有些新增的文件没有被同步

    增量模式是采用对比文件最后修改时间来判断文件是否为增量的。Linux的mv,Windows的cp、mv以及rsync带-t或者-a参数等操作是不会修改文件的最后修改时间的,这些操作修改的文件是不会被扫描到,所以在迁移时会被忽略。

  • 迁移文件到OSS时能否将文件权限也迁移过来

    不能。您可以在迁移完成后使用命令行工具ossutil的set-meta命令修改,详情参见set-meta