我正在尝试对数据集进行排序并写入新的数据集,每次执行作业时,它都会终止(ABEND=U0016)。
消息表单SYSOUT。
WER276B SYSDIAG= 24646562, 29667262, 29667262, 27500165
WER164B 307,288K BYTES OF VIRTUAL STORAGE AVAILABLE, MAX REQUESTED,
WER164B 0 BYTES RESERVE REQUESTED, 307,272K BYTES USED
WER036B G=5174,B=1,BIAS=99
WER162B 75 PREALLOCATED SORTWORK TRACKS, 3,750,000 DYNAMICALLY
ALLOCATED,
WER162B 26,721,480 ACQUIRED IN 2,230 SECONDARY EXTENTS, 0 RELEASED,
TOTAL 30,471,555 TRACKS USED
WER046A SORT CAPACITY EXCEEDED
WER493I ZIIP PROCESSOR USED
WER211B SYNCSMF CALLED BY SYNCSORT; RC=0000
WER449I SYNCSORT GLOBAL DSM SUBSYSTEM ACTIVE
WER066A APROX RCD CNT 30430982
这是我的代码:
//STEP50 EXEC SORTD
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*
以下是来自jcl:的SORTD代码
4 //STEP40 EXEC SORTD
5 XXSORTD PROC CYLS=1,SYSFICH='*',
XX DMPCLAS='1,DEST=ABNORMAL'
XX*
XX* REMOVED SEP PARAMETER 89/07/20
XX*
6 XXSORTD EXEC PGM=SORT
7 //SYSOUT DD SYSOUT=*
X/SYSOUT DD SYSOUT=&SYSFICH
IEFC653I SUBSTITUTION JCL - SYSOUT=*
8 XXSORTWK01 DD DSN=&WORK1,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK1,SPACE=(CYL,
(1)),UNIT=SORTWORK
9 XXSORTWK02 DD DSN=&WORK2,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK2,SPACE=(CYL,
(1)),UNIT=SORTWORK
10 XXSORTWK03 DD DSN=&WORK3,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK3,SPACE=(CYL,
(1)),UNIT=SORTWORK
11 XXSORTWK04 DD DSN=&WORK4,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK4,SPACE=(CYL,
(1)),UNIT=SORTWORK
12 XXSORTWK05 DD DSN=&WORK5,SPACE=(CYL,(&CYLS)),UNIT=SORTWORK
IEFC653I SUBSTITUTION JCL - DSN=&WORK5,SPACE=(CYL,
(1)),UNIT=SORTWORK
13 XXSYSABEND DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
14 XXSYSUDUMP DD SYSOUT=&DMPCLAS
IEFC653I SUBSTITUTION JCL - SYSOUT=1,DEST=ABNORMAL
15 //SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
16 //SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,PASS,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=TAPE
17 //SYSPRINT DD SYSOUT=*
18 //SYSIN DD *
请给我一些建议,让我把这个问题解决掉。非常感谢。
我将在这里单打独斗,并假设这里有问题的文件与上一个问题相同,具有相同的文件属性,位于:如何在SORT操作中降低CPU
LRECL为30050时有80000000条记录,您的输入文件约为2.2TB。
排序工作空间的一个公认经验法则是输入文件大小的1.3倍。因此,您需要将目标锁定在约285 TB(即约370万个CYLS或约5500万个轨道)的工作空间。
使用SyncSort最多255个SORTWK DD,您需要在支持的255个DD中的每一个上获取约14500个CYL,以满足您的空间需求。这有点极端,可能会带来许多挑战,但有一些选择可以让你实现这一点。
免责声明-我自己没有亲自使用SyncSort,但在仔细阅读文档后,这些概念看起来与我有经验的其他排序产品一致
依赖DYNALLOC
您已经指定了DYNALLOC=(SYSDA,255)
,这通常是推荐的方法。然而,您当前的设置有几个问题:
-
通过使用
SORTD
PROC,您正在掠夺本可以更适当地使用的5个DD。带有SPACE=(CYL,(1))
的PROC中的硬编码SORTWK DD限制了您可以获得的总工作空间,因为DYNALLOC现在只有250个DD可供使用。正如@SaggingRufus所建议的,直接调用SYNCSORT将避免PROC DD的1-CYL分配,并允许DYNALLOC处理所有255个DD。 -
SyncSort没有准确地投影必要的工作空间。根据您提供的输出,SyncSort最初明确地获取了75个磁道(SORTD过程中5个硬编码DD中的每一个都有1个CYL……换句话说,每个CYL为1个CYL*15个磁道的5个DD=75),然后动态地获取了另外3750000个磁道(1000个CYL(或15000个磁道)*250个DD)。然后,它在2230个辅助扩展数据块上额外获取了2670万个磁道(178万个CYL),这表明每个辅助扩展数据段平均有799个CYL(或11983个磁道),每个卷/DD平均有8.75个辅助扩展。所有这些导致总共约1.6TB(约2MM Cyls)被分配用于排序工作空间,这比2.2TB输入文件的估计工作空间需求低。即使我们将DYNALLOC属性应用于PROC中的硬编码SORTWK DD,也只会为总工作空间增加约32GB,而且仍然严重不足。因此,正如@phunsoft所建议的,添加SIZE=Ennnnnnnn参数可能是SyncSort适当投影工作空间所必需的。
-
附加说明-事实上,你得到了<每个DD/卷10个辅助扩展数据块表示您正在耗尽环境的工作空间池中卷上的可用可用空间。您应该与存储管理员协调,以确保有足够的磁盘空间可用于您的工作空间。
因此,绕过PROC以提供对所有255个DD的访问,并提供估计的记录计数可以允许SyncSort更可靠地计算必要的工作空间,但单个排序中的数据量可能是异常值,默认计算可能不够。此外,工作空间池中的可用可用空间可能是一个限制因素。
硬编码SORTWK DD
如果您在JCL中对SORTWK DD进行硬编码,则可以绕过PROC中的DD,并消除DYNALLOC计算的一些不确定性。这实际上是我个人在这种情况下首先要采取的方法…用最佳选项对每个SORTWK DD进行硬编码,以在每个DD上获得约14500个CYLS。因此:
-
对作业中的255个DD(SORTWK01-SORTWKFF)进行硬编码
-
在每个DD上包括
SPACE=(CYL,(4000,1000))
(即使SyncSort可能会自己计算二次分配) -
在每个DD上包括
DSNTYPE=LARGE
,以允许每个卷超过4G(每个SORTWK限制为1个卷)这些DD的集合应该为您的分拣需求提供足够的工作空间。
以上每个选项都假设工作空间池中有足够的卷/扩展数据块/总空间可供您的商店使用。我建议与您的存储管理团队协调,以确保资源的可用性
使用MAXSORT
SyncSort提供MAXSORT
功能,以容纳超大数据集。它将输入文件的部分排序为中间文件,并为后续部分重新使用SORTWK空间,直到每个部分的中间文件可以合并为一个输出文件。使用MAXSORT
有特殊要求。如前所述,我无法访问SyncSort,因此我无法自己测试此功能。您必须亲自研究SyncSort文档以了解此功能的详细信息。
由于排序输入是从磁带读取的,sort无法可靠地计算所需的排序工作空间。尝试将SIZE=Ennnnnnn参数添加到SORT语句中nnnnnnn是要读取的记录数E告诉sort这是一个估计。
尝试直接调用SYNCSORT,而不是调用此proc。本PROC仅设置了5个工作文件。通常最好让SYNCSORT根据需要分配尽可能多的工作文件,而不是告诉它可以使用多少。
我相信是工作文件空间不足。试试这个:
//SORT10 EXEC PGM=SYNCSORT,
// PARM=('INCORE=OFF,DYNALLOC=(SYSDA,255)',EQUALS)
//SORTIN DD DSN=FILEXYZ(0),
// DISP=SHR,DCB=BUFNO=192
//SORTOUT DD DSN=FILE2XXY,
// DISP=(NEW,CATLG,DELETE),RETPD=365,VOL=(,,,99),
// DCB=(RECFM=FB,LRECL=30050,BLKSIZE=0,BUFNO=192),
// UNIT=(TAPE,2)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SORTMSG DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(19,5,PD,A,8,6,PD,A,50,2,ZD,A)
OUTREC IFTHEN=(WHEN=(70,18,CH,EQ,C' encoding="IBM037"'),
OVERLAY=(70:C' encoding="UTF-8"'))
OPTION DYNALLOC=(SYSDA,255)
/*