在AWS Lambda中使用@dsnp/parquetjs读取Parquet文件失败求助
问题描述
在AWS Lambda中使用@dsnp/parquetjs读取Parquet文件时,抛出以下错误:
2023-09-21T05:49:13.435Z undefined ERROR Uncaught Exception { "errorType": "Error", "errorMessage": "ENOENT: no such file or directory, open '/var/task/wasm_brotli_nodejs_bg.wasm'", "code": "ENOENT", "errno": -2, "syscall": "open", "path": "/var/task/wasm_brotli_nodejs_bg.wasm", "stack": [ "Error: ENOENT: no such file or directory, open '/var/task/wasm_brotli_nodejs_bg.wasm'", " at Object.openSync (node:fs:590:3)", " at Object.readFileSync (node:fs:458:35)", " at node_modules/wasm-brotli/wasm_brotli_nodejs_bg.js (/var/task/index.js:18200:31)", " at __require (/var/task/index.js:10:50)", " at node_modules/wasm-brotli/wasm_brotli_nodejs.js (/var/task/index.js:18292:12)", " at __require (/var/task/index.js:10:50)", " at node_modules/@dsnp/parquetjs/dist/lib/compression.js (/var/task/index.js:18307:25)", " at __require (/var/task/index.js:10:50)", " at node_modules/@dsnp/parquetjs/dist/lib/schema.js (/var/task/index.js:18635:44)", " at __require (/var/task/index.js:10:50)" ] }
读取文件的代码如下:
const file = fs.readFileSync(localFilePath); console.log('file:', file); const reader = await parquet.ParquetReader.openBuffer(file);
已确认Parquet文件存在于Lambda的/tmp/目录,但未在代码中直接引用brotli,请问错误原因是什么?
原因分析与解决方案
原因
@dsnp/parquetjs内部依赖wasm-brotli库处理Parquet文件的brotli压缩格式,该依赖会尝试从/var/task/目录加载对应的WASM文件。但当你用打包工具(如Webpack、ESBuild)将代码打包成单文件部署到Lambda时,WASM文件可能未被正确包含到部署包中,或者打包后的代码硬编码了错误的WASM文件路径,导致Lambda运行时找不到该文件。
解决方案
- 检查部署包内容:确保
wasm_brotli_nodejs_bg.wasm文件存在于部署包根目录(对应Lambda的/var/task/)。npm安装依赖后,该文件通常在node_modules/wasm-brotli/目录下,打包时需手动复制到部署包根目录。 - 调整打包配置:
若使用Webpack,需添加规则处理WASM文件,确保输出到正确路径:
若使用Serverless Framework或SAM,可在配置文件中添加文件复制规则,将WASM文件纳入部署包。module.exports = { module: { rules: [ { test: /\.wasm$/, type: 'asset/resource', generator: { filename: '[name][ext]' } } ] } }; - 替换依赖库:如果配置麻烦,可改用
parquetjs-lite——这是@dsnp/parquetjs的轻量版本,移除了WASM依赖,更适配Lambda环境。
内容的提问来源于stack exchange,提问作者MG123
相关产品推荐
相关产品推荐

