apache / apache/druid

Druid 37.0.0: EXTERN parquet from S3 fails with java.io.IOException: No such file or directory

Open
#19,619 0 comments 1 reaction 0 assignees View on GitHub
Uncategorized problem report
Dominant language
Java
Stars
14.1k
Forks
3.8k
Avg merge
2d 58m
Merged PRs (30d)
233

Description

### Minimal reproduction

```
SELECT *
FROM TABLE(
EXTERN(
'{"objectGlob" : "**.parquet", "type":"s3","uris":["s3://bucket/path/file.parquet"]}',
'{"type":"parquet","binaryAsString":false}',
'[{"name":"column_a","type":"string"},{"name":"column_b","type":"string"}]'
)
)
LIMIT 1
```

### Affected Version

37.0.0

### Observed

```
java.io.IOException: No such file or directory

at java.io.File.createTempFile
at org.apache.druid.data.input.InputEntity.fetch
at org.apache.druid.data.input.parquet.ParquetReader
```

### Regression

```
Works on 36.0.0
Fails on 37.0.0
```

### Stacktrace:

```
org.apache.druid.error.DruidException: java.io.IOException: No such file or directory
at org.apache.druid.java.util.common.Either.valueOrThrow(Either.java:106)
at org.apache.druid.frame.processor.FrameProcessorExecutor$1ExecutorRunnable.runProcessorNow(FrameProcessorExecutor.java:275)
at org.apache.druid.frame.processor.FrameProcessorExecutor$1ExecutorRunnable.run(FrameProcessorExecutor.java:141)
at org.apache.druid.msq.exec.WorkerImpl$2$2.run(WorkerImpl.java:929)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.druid.query.PrioritizedListenableFutureTask.run(PrioritizedExecutorService.java:259)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)

Caused by: java.lang.RuntimeException: java.io.IOException: No such file or directory
at org.apache.druid.data.input.parquet.ParquetReader.intermediateRowIterator(ParquetReader.java:98)
at org.apache.druid.data.input.IntermediateRowParsingReader.intermediateRowIteratorWithMetadata(IntermediateRowParsingReader.java:235)
at org.apache.druid.data.input.IntermediateRowParsingReader.read(IntermediateRowParsingReader.java:49)
at org.apache.druid.data.input.impl.InputEntityIteratingReader.lambda$read$0(InputEntityIteratingReader.java:76)
at org.apache.druid.java.util.common.parsers.CloseableIterator$2.findNextIteratorIfNecessary(CloseableIterator.java:82)
at org.apache.druid.java.util.common.parsers.CloseableIterator$2.hasNext(CloseableIterator.java:93)
at org.apache.druid.java.util.common.parsers.CloseableIterator$1.hasNext(CloseableIterator.java:42)
at org.apache.druid.msq.input.external.ExternalSegment$1$1.hasNext(ExternalSegment.java:89)
at org.apache.druid.java.util.common.guava.BaseSequence.toYielder(BaseSequence.java:70)
at org.apache.druid.java.util.common.guava.Yielders.each(Yielders.java:32)
at org.apache.druid.segment.RowWalker.(RowWalker.java:53)
at org.apache.druid.segment.RowBasedCursorFactory$1.asCursor(RowBasedCursorFactory.java:75)
at org.apache.druid.msq.querykit.scan.ScanQueryFrameProcessor.runWithSegment(ScanQueryFrameProcessor.java:324)
at org.apache.druid.msq.querykit.BaseLeafFrameProcessor.runIncrementally(BaseLeafFrameProcessor.java:95)
at org.apache.druid.msq.querykit.scan.ScanQueryFrameProcessor.runIncrementally(ScanQueryFrameProcessor.java:189)
at org.apache.druid.msq.counters.CpuTimeAccumulatingFrameProcessor.runIncrementally(CpuTimeAccumulatingFrameProcessor.java:66)
at org.apache.druid.frame.processor.FrameProcessors$1FrameProcessorWithBaggage.runIncrementally(FrameProcessors.java:72)
at org.apache.druid.frame.processor.FrameProcessorExecutor$1ExecutorRunnable.runProcessorNow(FrameProcessorExecutor.java:243)
... 8 more

Caused by: java.io.IOException: No such file or directory
at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.base/java.io.File.createTempFile(File.java:2170)
at org.apache.druid.data.input.InputEntity.fetch(InputEntity.java:89)
at org.apache.druid.data.input.BytesCountingInputEntity.fetch(BytesCountingInputEntity.java:68)
at org.apache.druid.data.input.parquet.ParquetReader.intermediateRowIterator(ParquetReader.java:86)
... 25 more
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the minimal EXTERN parquet query against Druid 37.0.0 and compare it with 36.0.0. Start with org.apache.druid.data.input.InputEntity.java and org.apache.druid.data.input.parquet.ParquetReader.java, following the stack trace through temporary-file creation. Done means the S3 parquet query succeeds on 37.0.0 without the IOException and the regression is covered by a test.

Written by the indexing model from the issue text.

Assessment

Tech stack
aws, java
Domain
data-engineering, database
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
62/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.