[parquet-java] Intermittent out-of-bounds dictionary ID when reading dictionary-encoded Parquet pages
Maintainer thường phản hồi trong vòng 2 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 42/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- java
- Lĩnh vực
- data-engineering
Hướng nghiên cứu
Bắt đầu với PlainValuesDictionary.decodeToInt, DictionaryValuesReader.readInteger và chuỗi lệnh gọi của ColumnReaderBase được hiển thị trong stack trace. Điều tra cách các ID của dictionary được tạo ra khi đọc các page được mã hóa bằng dictionary, sử dụng dictionary gồm 13 mục được báo cáo và ID 14 làm trường hợp tham chiếu. Được xem là hoàn tất khi các page bị ảnh hưởng có thể được đọc mà không xảy ra truy cập dictionary vượt quá giới hạn và lỗi không liên tục được bao phủ bằng một regression test.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Describe the bug, including details regarding any error messages, version, and platform.
Description
We intermittently encounter a ParquetDecodingException when reading Parquet files written by Apache Hudi with Spark.
The issue cannot be reproduced consistently for every write, but it has occurred repeatedly across different write jobs.
The failures have a similar call chain: while reading a dictionary-encoded data page, parquet-java decodes a dictionary ID that is outside the range of the current dictionary. PlainValuesDictionary then attempts to access the dictionary array with that ID and throws an ArrayIndexOutOfBoundsException.
In the representative case below, the affected column is:
optional int32 chan_second_cate_cd
The dictionary contains 13 entries, so the valid dictionary IDs are 0 through 12. However, the data page produces dictionary ID 14, resulting in:
java.lang.ArrayIndexOutOfBoundsException: Index 14 out of bounds for length 13
This failure occurs in row group 0, at column value 292293 out of 478848, and at value 12293 out of 20000 in the current data page.
The value 14 is an internal Parquet dictionary ID, not the actual value stored in the column.
Environment
| Component | Version |
|---|---|
| Apache Hudi | 0.13.1 |
| Write engine | Apache Spark 3.4 |
| parquet-mr | 1.12.3 |
Representative Stack Trace
Click to expand
org.apache.parquet.io.ParquetDecodingException: Can not read value at 292293 in block 0 in file <sanitized-parquet-file-path>
at org.apache.parquet.hadoop.InternalParquetRecordReader.nextKeyValue(InternalParquetRecordReader.java:264)
at org.apache.parquet.hadoop.ParquetRecordReader.nextKeyValue(ParquetRecordReader.java:207)
at org.apache.spark.sql.execution.datasources.RecordReaderIterator.hasNext(RecordReaderIterator.scala:39)
at org.apache.spark.sql.execution.datasources.RecordReaderIterator$$anon$1.hasNext(RecordReaderIterator.scala:61)
at org.apache.spark.sql.execution.datasources.FileScanRDD$$anon$1.hasNext(FileScanRDD.scala:125)
at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:460)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anon$1.hasNext(WholeStageCodegenExec.scala:760)
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:140)
at org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:101)
at org.apache.spark.scheduler.Task.run(Task.scala:140)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:565)
Caused by: org.apache.parquet.io.ParquetDecodingException: Can't read value in column [chan_second_cate_cd] optional int32 chan_second_cate_cd at value 292293 out of 478848, 12293 out of 20000 in currentPage. repetition level: 0, definition level: 1
at org.apache.parquet.column.impl.ColumnReaderBase.readValue(ColumnReaderBase.java:553)
at org.apache.parquet.column.impl.ColumnReaderImpl.readValue(ColumnReaderImpl.java:30)
at org.apache.parquet.column.impl.ColumnReaderBase.writeCurrentValueToConverter(ColumnReaderBase.java:439)
at org.apache.parquet.column.impl.ColumnReaderImpl.writeCurrentValueToConverter(ColumnReaderImpl.java:30)
at org.apache.parquet.io.RecordReaderImplementation.read(RecordReaderImplementation.java:406)
at org.apache.parquet.hadoop.InternalParquetRecordReader.nextKeyValue(InternalParquetRecordReader.java:234)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 14 out of bounds for length 13
at org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainIntegerDictionary.decodeToInt(PlainValuesDictionary.java:251)
at org.apache.parquet.column.values.dictionary.DictionaryValuesReader.readInteger(DictionaryValuesReader.java:108)
at org.apache.parquet.column.impl.ColumnReaderBase$2$3.read(ColumnReaderBase.java:279)
at org.apache.parquet.column.impl.ColumnReaderBase.readValue(ColumnReaderBase.java:533)
Component(s)
No response
- Ngôn ngữ chính
- Java
- Star
- 3.1k
- Fork
- 1.6k
- Merge trung bình
- 4 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 30
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của apache/parquet-java
-
Row-group copying collides for distinct column paths with the same dot stringCó thể đã có người làm @costas-db đã nhận 5 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
apache/parquet-java#3829 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Binary statistics truncation test ignores its configured truncation lengthCó thể đã có người làm @dhruv-15-03 đã nhận 7 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
apache/parquet-java#3820 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Make PageReader AutoCloseableĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
apache/parquet-java#3767 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Remove duplicate LICENSE and NOTICE files from benchmark JARsCó thể đã có người làm @efegokdemir đã nhận 10 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
apache/parquet-java#3695 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Close input readers when ParquetRewriter setup failsCó thể đã có người làm @anxkhn đã nhận 81 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
apache/parquet-java#3667 ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của apache/parquet-java
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
objectionary/eo#9182 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
objectionary/hone-maven-plugin#1293 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
thrift: security issues < 0.25.0Đang mở1.severity: security
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
NixOS/nixpkgs#569828 · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
MaikuB/flutter_appauth#683 ·