本文为您介绍小文件优化以及作业诊断时的常见问题。

问题类别常见问题
小文件优化MaxCompute什么情况下会产生小文件?如何解决小文件问题?
作业诊断

MaxCompute什么情况下会产生小文件?如何解决小文件问题?

  • 产生场景:

    MaxCompute使用盘古分布式文件系统是按块(Block)存放的,通常文件大小比块大小小的文件(默认块大小为64MB),被称为小文件。

    以下场景会产生小文件:
    • Reduce计算过程会产生大量小文件。
    • Tunnel数据采集过程中会生成小文件。
    • Job执行过程中生成的各种临时文件、回收站保留的过期的文件等,主要分类有以下几种:
      • TABLE_BACKUP:回收站中超过保留天数的表。
      • FUXI_JOB_TMP:作业运行临时目录。
      • TMP_TABLE:作业运行中产生的临时表。
      • INSTANCE:作业运行时保留在META表中的日志。
      • LIFECYCLE:超过生命周期的数据表或分区。
      • INSTANCEPROFILE:作业提交及执行完成后的Profile信息。
      • VOLUME_TMP:没有META信息,但在盘古上有路径的数据。
      • TEMPRESOURCE:用户自定义函数使用的一次性临时资源文件。
      • FAILOVER:系统发生失效转移(Failover)时保留的临时文件。
    可以通过如下命令查看表中的小文件数量。
    desc extended + 表名          
  • 问题影响:
    小文件过多会带来以下影响:
    • 影响启动Map Instance,默认情况下一个小文件对应一个Instance,造成浪费资源,影响整体的执行性能。
    • 过多的小文件给盘古文件系统带来压力,且影响空间的有效利用,严重的会直接导致盘古文件系统不可服务。
  • 处理方式:
    不同原因产生的小文件,需要有不同的处理方法:
    • Reduce过程中产生的小文件。您需要使用Insert Overwrite源表(或分区)即可,或者将数据写入到新表删除源表。
    • Tunnel数据采集过程中产生的小文件,通过如下方式处理:
      • 调用Tunnel SDK时,当缓存达到64MB时提交一次。
      • 使用客户端时避免频繁上传小文件,建议积累较大时一次性上传。
      • 如果导入的是分区表,建议给分区设置生命周期,过期不用的数据自动清理。
      • Insert Overwrite源表(或分区)。
      • ALTER合并模式,通过如下命令进行合并。
        ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;                         

执行并发插入操作报错,如何处理?

  • 问题现象

    执行并发插入操作时,返回报错如下。

    ODPS-0110999: Critical! Internal error happened in commit operation and rollback failed, possible breach of atomicity - Rename directory failed during DDLTask.       
  • 产生原因

    MaxCompute没有并发控制,可能有多个任务在修改这张表。这种情况下,有极小的概率在最后的META操作时,发生并发冲突导致执行异常。同时ALTER、INSERT操作都会发生此情况。

  • 解决措施

    建议您将此表修改为分区表,每个SQL语句插入的数据写入单独的分区里,这样便可以执行并发操作。

运行作业时,报错ODPS-0130121,如何解决?

  • 问题现象

    运行作业时,返回报错如下。

    FAILED:ODPS-0130121:Invalid argument type - line 1:7 'testfunc':in function class
  • 产生原因

    内建函数接收到的参数类型不正确。

  • 解决措施

    建议您检查输入参数的数据类型,确保满足函数入参要求。

创建的Shell任务执行失败,在ECS服务器执行显示成功,运维中心无法查看失败的原因,如何解决?

可以在ECS上执行以下代码,命令重启Agent后,重新执行任务。
su - admin
/home/admin/alisatasknode/target/alisatasknode/bin/serverctl restart

如果还是看不到运行日志,配置IP10.116.134.123访问8000端口后再试。

DataWorks-运维中心-任务管理中查看某个任务属性,为何显示的状态是暂停?

配置中心 > 项目配置中查看是否启用了此任务。
  • 如果启用了此任务,请查看此任务的上游任务是否执行失败。
  • 如果没有启用此任务,请右键单击工作节点查看是否运行正常,或将此任务重新命名后配置调度。

执行数据集成操作时,右上角总是弹出消息框提示Order字段是否已经删除,是什么原因?

首先查看数据库中的Order字段是否已经被删除。

清除缓存后,将同步任务重新配置或者重新创建同步任务,再次执行验证。

odpscmd -f执行SQL文件失败,没有提示报错信息,如何解决?

首先需要获取任务的运行日志或者报错信息,才能定位问题。

通过Shell执行odpscmd -f命令,日志信息会打印在Shell中。不过在Shell中调用正常,但是在crontab中调用时会报错且没有日志。

针对这种情况,您可以在crontab中把任务执行的输出记录下来,后续出了问题可以在日志文件里获取任务的日志。执行语句为odpscmd -f xxx.sql >> path/to/odpscmd.log 2>&1

使用DataWorks时,很多数据同步任务处于等待状态是什么原因?

同步任务使用公共调度资源时一直在等待状态,您可以通过离线同步任务调优实现最大化的同步速度。

您也可以添加自己的调度资源,详情请参见新增和使用自定义数据集成资源组

Shell任务执行时,调度资源管理添加的其中一台服务器一直显示停止状态,重新执行了初始化还是显示停止,是什么原因?

  • 如果是经典网络,请确认注册使用的机器名称是否为机器的真实名称。在ECS上执行hostname命令,返回的结果即为机器名称,不支持自定义名称。
  • 如果是专有网络,请确认是否修改过ECS的主机名称,注意这里不是指实例名。如果修改过主机名称,在ECS上执行cat /etc/hosts命令查询是否绑定正确。