我们正在使用SFTP将文件从本地导入EC2,然后最终将其上传到S3数据仓库。
这些文件是纯文本文件,并且是在数据湖中的后输入操作,我们正在使用python3大熊猫创建相同的结构化数据框(一些用于数据整理的业务逻辑)。
该代码是使用Windows计算机上本地存在的测试文件在本地开发和测试的,通常需要几秒钟才能完成转换。但是,当相同的代码转换到EC2并从S3读取SFTP的文件时,它开始需要花费很多时间。
在EC2上以调试模式(py-console)运行代码之后,我们能够找到导致速度慢的命令,因此我们尝试了以下不同的方案。
本地或EC2本地
file = open('/path/to/file/abc.out', 'r')
for line in file:
##############
BUSINESS LOGIC
##############
FOR S3
s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, key)
body = obj.get()['Body']
for line in body.read().decode('utf-8').split('\n'):
##############
BUSINESS LOGIC
##############
对于每种情况,文件(在所有业务逻辑处理之后)已成功读取到字符串中(在一秒钟之内)。但是,当我们尝试创建字符串的数据帧时,它具有以下行为:
formatted_data = BUSINESS LOGIC
final_data = StringIO(formatted_data)
# reading data into a dataframe
df = pd.read_csv(final_data, sep='|')
场景分析
| FILE LOCATION | PROCESSING | TIME TO EXECUTE |
------------------------------------------------------------------------------------
| WINDOWS LOCAL | LOCAL | SECONDS |
| COPY LOCAL TO S3 | EC2 | SECONDS |
| DOS2UNIX ON LOCAL & COPY TO S3 | EC2 | HOURS |
| UNIX2DOS ON LOCAL & COPY TO S3 | EC2 | SECONDS |
| SFTP TO EC2 | EC2 | SECONDS |
| SFTP TO EC2 & COPY TO S3 | EC2 | HOURS |
| SFTP TO EC2 & COPY TO S3 & RE-COPY FROM S3 TO EC2 | EC2 | SECONDS |
根据分析,我们认为可能是S3上的unix文件编码引起了问题。但是下载到EC2时使用相同的文件就可以了。此外,我们在 for语句中从S3读取时进行解码。有什么见解可能是什么原因?预先谢谢你!