本文为您介绍小文件优化以及作业诊断时的常见问题。
问题类别 | 常见问题 |
小文件优化 | |
作业诊断 |
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
命令查询是否绑定正确。