使用 Python 在 AWS 上将 EBCDIC 数据转换并解压为 ASCII - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Python 在 AWS 上将 EBCDIC 数据转换并解压为 ASCII

由 Luis Gustavo Dantas (AWS) 编写

代码存储库:大型机数据实用程序

环境:PoC 或试点

来源:大型机 EBCDIC 数据

目标: 分布式或云端现代化 ASCII 数据

R 类型:更换平台

工作负载:IBM

技术:大型机;数据库;存储和备份;现代化

Amazon Web Services:Amazon EBS、Amazon EC2

Summary

由于大型机通常托管关键业务数据,因此在将数据迁移置 Amazon Web Services (AWS) 云或其他美国信息交换标准规范 (ASCII) 环境时,实现数据现代化很重要。在大型机上,数据通常以扩展二进制编码十进制交换码 (EBCDIC) 格式编码。导出数据库、Virtual Storage Access Method (VSAM) 或平面文件通常会生成打包的二进制 EBCDIC 文件,这些文件迁移比较复杂。最常用的数据库迁移解决方案是变更数据捕获 (CDC),在大多数情况下,其会自动转换数据编码。但是,CDC 机制可能不适用于此数据库、VSAM 或平面文件。对于此文件,需要另一种方法来实现数据现代化。

此模式介绍了如何通过将 EBCDIC 数据转换为 ASCII 格式来实现其现代化。转换后,您可将数据加载至分布式数据库中,也可以让云中的应用程序直接处理数据。该模式使用mainframe-data-utilities GitHub 存储库中的转换脚本和示例文件。

先决条件和限制

先决条件

限制

  • 不支持 COBOL 程序定义的文件布局。它们必须单独提供。

产品版本

  • Python 版本 3.8 或更高版本。

架构

源技术堆栈

  • 大型机的 EBCDIC 数据

  • COBOL 副本

目标技术堆栈

  • 虚拟私有云(VPC)中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例

  • Amazon Elastic Block Store (Amazon EBS)

  • Python 及其必需的软件包、 JavaScript 对象表示法 (JSON)、系统和日期时间

  • ASCII 平面文件可供现代应用程序读取或加载至关系数据库表中

目标架构

使用 Python 脚本和 COBOL 副本在 EC2 实例上将 EBCDIC 数据转换为 ASCII

架构图显示了在 EC2 实例上将 EBCDIC 文件转换为 ASCII 文件的过程:

  1. 使用 parse_copybook_to_json.py 脚本,您可将 COBOL 副本转换为 JSON 文件。

  2. 使用 JSON 文件和 extract_ebcdic_to_ascii.py 脚本,您可将 EBCDIC 数据转换为 ASCII 文件。

自动化和扩缩

在首次手动文件转换所需资源到位后,您可自动进行文件转换。此示例不包括自动化说明。有多种方法可自动转换。下文概述了一种可能使用的方法:

  1. 将 AWS 命令行界面(AWS CLI)和 Python 脚本命令封装至 shell 脚本中。

  2. 创建 AWS Lambda 函数,该函数将 shell 脚本作业异步提交至 EC2 实例。有关更多信息,请参阅使用 AWS Lambda 安排 SSH 作业

  3. 创建 Amazon Simple Storage Service (Amazon S3) 触发器,该触发器在每次上传旧文件时调用 Lambda 函数。有关更多信息,请参见使用 Amazon S3 触发器调用 Lambda函数

工具

Amazon Web Services

其他工具

  • GitHub是一项代码托管服务,提供协作工具和版本控制。

  • Python 是高级编程语言。

代码存储库

此模式的代码可在mainframe-data-utilities GitHub 存储库中找到。

操作说明

任务描述所需技能

启动一个 EC2 实例。

EC2 实例必须具有出站互联网访问权限。这允许实例访问上可用的 Python 源代码 GitHub。创建实例:

  1. 打开 Amazon EC2 控制台,网址为 https://console.aws.amazon.com/ec2

  2. 启动 EC2 Linux 实例。使用公有 IP 地址,允许通过端口 22 进行入站访问。确保实例的存储大小至少为 EBCDIC 数据文件大小的两倍。有关说明,请参阅 Amazon EC2 文档

常规 AWS

安装 Git。

  1. 使用 Secure Shell (SSH) 客户端连接到刚启动的 EC2 实例。有关更多信息,请参阅连接到您的 Linux 实例

  2. 在 Amazon EC2 控制台,运行以下命令。这会将 Git 安装至 EC2 实例。

    sudo yum install git
  3. 运行以下命令并确认 Git 已成功安装。

    git --version
常规 AWS、Linux

安装 Python。

  1. 在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装 Python。

    sudo yum install python3
  2. 在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装 Pip3。

    sudo yum install python3-pip
  3. 在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装适用于 Python 的 Amazon SDK (Boto3)。

    sudo pip3 install boto3
  4. 在 Amazon EC2 控制台,运行以下命令,其中 <us-east-1> 是您的 AWS 区域 代码。有关区域代码的完整列表,请参阅 Amazon EC2 用户指南中的可用区域

    export AWS_DEFAULT_REGION=<us-east-1>
常规 AWS、Linux

克隆 GitHub 存储库。

  1. 在 Amazon EC2 控制台,运行以下命令。这将从中克隆mainframe-data-utilities存储库 GitHub 并打开默认的副本位置,即home文件夹。

    git clone https://github.com/aws-samples/mainframe-data-utilities.git
  2. home 文件夹,确认该 mainframe-data-utilities 文件夹存在。

通用 AWS, GitHub
任务描述所需技能

将 COBOL 副本解析至 JSON 布局文件。

mainframe-data-utilities 文件夹中,运行 parse_copybook_to_json.py 脚本。此自动化模块从 COBOL 副本读取文件布局并创建 JSON 文件。JSON 文件包含解释和提取源文件中数据所需信息。这将通过 COBOL 副本创建 JSON 元数据。

以下命令将 COBOL 副本转换为 JSON 文件。

python3 parse_copybook_to_json.py \ -copybook LegacyReference/COBPACK2.cpy \ -output sample-data/cobpack2-list.json \ -dict sample-data/cobpack2-dict.json \ -ebcdic sample-data/COBPACK.OUTFILE.txt \ -ascii sample-data/COBPACK.ASCII.txt \ -print 10000

该脚本打印所接收到的参数。

----------------------------------------------------------------------- Copybook file...............| LegacyReference/COBPACK2.cpy Parsed copybook (JSON List).| sample-data/cobpack2-list.json JSON Dict (documentation)...| sample-data/cobpack2-dict.json ASCII file..................| sample-data/COBPACK.ASCII.txt EBCDIC file.................| sample-data/COBPACK.OUTFILE.txt Print each..................| 10000 -----------------------------------------------------------------------

有关参数的更多信息,请参阅 GitHub 存储库中的 README 文件

常规 AWS、Linux

检查 JSON 布局文件。

  1. 导航到 parse_copybook_to_json.py 脚本中定义的输出路径。

  2. 检查 sample-data/cobpack2-list.json 文件的创建时间,确认您选择了相应的 JSON 布局文件。

  3. 检查 JSON 文件并确认其内容是否与以下内容相似。

"input": "extract-ebcdic-to-ascii/COBPACK.OUTFILE.txt", "output": "extract-ebcdic-to-ascii/COBPACK.ASCII.txt", "max": 0, "skip": 0, "print": 10000, "lrecl": 150, "rem-low-values": true, "separator": "|", "transf": [ { "type": "ch", "bytes": 19, "name": "OUTFILE-TEXT" }

JSON 布局文件最重要属性是:

  • input — 包含要转换的 EBCDIC 文件的路径

  • output — 定义生成 ASCII 文件的路径

  • lrecl — 指定逻辑记录长度的大小(以字节为单位)

  • transf — 列出所有字段及其大小(以字节为单位)

有关 JSON 布局文件的更多信息,请参阅 GitHub 存储库中的自述文件

常规 AWS、JSON

创建 ASCII 文件。

运行 extract_ebcdic_to_ascii.py 脚本,该脚本包含在克隆的 GitHub 存储库中。此脚本读取 EBCDIC 文件,并写入转换后且可读的 ASCII 文件。

python3 extract_ebcdic_to_ascii.py -local-json sample-data/cobpack2-list.json

当脚本处理 EBCDIC 数据,它会为每批 10,000 条记录打印一条消息。请参阅以下示例。

------------------------------------------------------------------ 2023-05-15 21:21:46.322253 | Local Json file | -local-json | sample-data/cobpack2-list.json 2023-05-15 21:21:47.034556 | Records processed | 10000 2023-05-15 21:21:47.736434 | Records processed | 20000 2023-05-15 21:21:48.441696 | Records processed | 30000 2023-05-15 21:21:49.173781 | Records processed | 40000 2023-05-15 21:21:49.874779 | Records processed | 50000 2023-05-15 21:21:50.705873 | Records processed | 60000 2023-05-15 21:21:51.609335 | Records processed | 70000 2023-05-15 21:21:52.292989 | Records processed | 80000 2023-05-15 21:21:52.938366 | Records processed | 89280 2023-05-15 21:21:52.938448 Seconds 6.616232

有关如何更改打印频率的信息,请参阅 GitHub 存储库中的 README 文件

常规 AWS

检查 ASCII 文件。

  1. 检查 extract-ebcdic-to-ascii/cobpack.ascii.txt 文件的创建时间,以验证该文件是否是最近创建的。

  2. 在 Amazon EC2 控制台中,输入以下命令。这将会打开 ASCII 文件的第一条记录。

    head sample-data/COBPACK.ASCII.txt -n 1| xxd
  3. 检查第一条记录内容。由于 EBCDIC 文件通常是二进制文件,因此它们并没有回车符和换行符 (CRLF) 特殊字符。extract_ebcdic_to_ascii.py 脚本添加了竖线字符作为列分隔符,该分隔符在脚本参数中定义。

如果您使用了提供的示例 EBCDIC 文件,以下是 ASCII 文件中的第一条记录。

00000000: 2d30 3030 3030 3030 3030 3130 3030 3030 -000000000100000 00000010: 3030 307c 3030 3030 3030 3030 3031 3030 000|000000000100 00000020: 3030 3030 3030 7c2d 3030 3030 3030 3030 000000|-00000000 00000030: 3031 3030 3030 3030 3030 7c30 7c30 7c31 0100000000|0|0|1 00000040: 3030 3030 3030 3030 7c2d 3130 3030 3030 00000000|-100000 00000050: 3030 307c 3130 3030 3030 3030 307c 2d31 000|100000000|-1 00000060: 3030 3030 3030 3030 7c30 3030 3030 7c30 00000000|00000|0 00000070: 3030 3030 7c31 3030 3030 3030 3030 7c2d 0000|100000000|- 00000080: 3130 3030 3030 3030 307c 3030 3030 3030 100000000|000000 00000090: 3030 3030 3130 3030 3030 3030 307c 2d30 0000100000000|-0 000000a0: 3030 3030 3030 3030 3031 3030 3030 3030 0000000001000000 000000b0: 3030 7c41 7c41 7c0a 00|A|A|.
常规 AWS、Linux

评估 EBCDIC 文件。

在 Amazon EC2 控制台中,输入以下命令。这将会打开 EBCDIC 文件的第一条记录。

head sample-data/COBPACK.OUTFILE.txt -c 150 | xxd

如果您使用 EBCDIC 示例文件,则结果如下所示。

00000000: 60f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 f0f0 `............... 00000010: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 ................ 00000020: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 ................ 00000030: f0f0 f0f0 f0f0 d000 0000 0005 f5e1 00fa ................ 00000040: 0a1f 0000 0000 0005 f5e1 00ff ffff fffa ................ 00000050: 0a1f 0000 000f 0000 0c10 0000 000f 1000 ................ 00000060: 0000 0d00 0000 0000 1000 0000 0f00 0000 ................ 00000070: 0000 1000 0000 0dc1 c100 0000 0000 0000 ................ 00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000090: 0000 0000 0000 ......

要评估源文件和目标文件之间的等效性,则需要全面了解 EBCDIC。例如,示例 EBCDIC 文件的第一个字符是连字符 (-)。在 EBCDIC 文件的十六进制表示法中,此字符由 60 表示,在 ASCII 文件的十六进制表示法中,该字符由 2D 表示。有关 EBCDIC 到 ASCII 的转换表,请参阅 IBM 网站上的 EBCDIC 到 ASCII

常规 AWS、Linux、EBCDIC

相关资源

参考

教程