Skip to content

[FLINK] Support ORC filesystem sink format#12327

Open
zhanglistar wants to merge 5 commits into
apache:mainfrom
zhanglistar:codex/flink-orc-sink-format
Open

[FLINK] Support ORC filesystem sink format#12327
zhanglistar wants to merge 5 commits into
apache:mainfrom
zhanglistar:codex/flink-orc-sink-format

Conversation

@zhanglistar

@zhanglistar zhanglistar commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

What changes are proposed in this pull request?

Gluten Flink support ORC flilesystem sink format, solves #12203.
Depends on bigo-sg/velox4j#43 and bigo-sg/velox#52.

How was this patch tested?

UT

Was this patch authored or co-authored using generative AI tooling?

Copilot AI review requested due to automatic review settings June 22, 2026 09:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings June 23, 2026 02:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@zhanglistar zhanglistar force-pushed the codex/flink-orc-sink-format branch from b9fe77f to 4e42142 Compare June 23, 2026 03:39
Copilot AI review requested due to automatic review settings June 23, 2026 03:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings June 23, 2026 04:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Comment thread gluten-flink/ut/src/test/resources/nexmark/q10.sql Outdated
Copilot AI review requested due to automatic review settings June 23, 2026 04:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings June 23, 2026 08:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI review requested due to automatic review settings June 24, 2026 05:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@zhanglistar zhanglistar force-pushed the codex/flink-orc-sink-format branch from 647a12f to 43d0e3f Compare June 29, 2026 09:45
Copilot AI review requested due to automatic review settings June 29, 2026 11:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (1)

gluten-flink/ut/src/test/java/org/apache/gluten/table/runtime/stream/custom/NexmarkTest.java:259

  • verifyQ10OrcOutput() only checks Files.exists(outputDir), which would also pass if the path exists but is not a directory (e.g., a leftover file). Using Files.isDirectory makes the assertion stricter and avoids misleading failures later in Files.walk.
    }

    String insertQuery = sqlStatements[sqlStatements.length - 2].trim();

Copilot AI review requested due to automatic review settings July 3, 2026 04:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

gluten-flink/ut/src/test/java/org/apache/gluten/table/runtime/stream/custom/NexmarkTest.java:263

  • This AssertJ call doesn't assert anything because it doesn't chain an assertion (e.g. .isTrue()). As written, the test will pass even if checkJobRunningStatus() returns false, reducing coverage for the Kafka-source path.
    String insertQuery = sqlStatements[sqlStatements.length - 2].trim();

Copilot AI review requested due to automatic review settings July 3, 2026 04:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

Copilot AI review requested due to automatic review settings July 3, 2026 06:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

Comment on lines +226 to +247
// Clean the ORC output directory before running q10_orc to ensure deterministic verification.
if ("q10_orc.sql".equals(queryFileName)) {
Path orcOutputDir = Paths.get("/tmp/data/output/bid_orc");
if (Files.exists(orcOutputDir)) {
try {
try (java.util.stream.Stream<Path> files = Files.walk(orcOutputDir)) {
files
.sorted(java.util.Comparator.reverseOrder())
.forEach(
p -> {
try {
Files.deleteIfExists(p);
} catch (IOException e) {
throw new RuntimeException("Failed to delete " + p, e);
}
});
}
} catch (IOException e) {
throw new RuntimeException("Failed to clean ORC output directory", e);
}
}
}
Copilot AI review requested due to automatic review settings July 6, 2026 08:49
@zhanglistar zhanglistar force-pushed the codex/flink-orc-sink-format branch from 1c10b05 to b418981 Compare July 6, 2026 08:49

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 6 comments.

Comment on lines 371 to 376
@Override
public void snapshotState(StateSnapshotContext context) throws Exception {
// TODO: implement it
snapshotNativeState(context.getCheckpointId());
task.snapshotState(0);
super.snapshotState(context);
}
Comment on lines +232 to +245
private void processAvailableElement() {
final StatefulElement statefulElement = task.statefulGet();
try {
if (statefulElement.isWatermark()) {
StatefulWatermark watermark = statefulElement.asWatermark();
output.emitWatermark(new Watermark(watermark.getTimestamp()));
} else {
outputBridge.collect(
output, statefulElement.asRecord(), sessionResource.getAllocator(), outputType);
}
} finally {
statefulElement.close();
}
}
Comment on lines +214 to +227
private void processAvailableElement() {
final StatefulElement element = task.statefulGet();
try {
if (element.isWatermark()) {
StatefulWatermark watermark = element.asWatermark();
output.emitWatermark(new Watermark(watermark.getTimestamp()));
} else {
outputBridge.collect(
output, element.asRecord(), sessionResource.getAllocator(), outputType);
}
} finally {
element.close();
}
}
Comment on lines +254 to +272
private void finishTask() {
while (true) {
UpIterator.State state = task.advance();
switch (state) {
case AVAILABLE:
processAvailableElement();
break;
case BLOCKED:
task.waitFor();
break;
case FINISHED:
return;
default:
// Treat unknown states as terminal, consistent with GlutenSourceFunction.
LOG.warn("Unexpected Velox task state in finishTask: {}", state);
return;
}
}
}
Comment on lines +236 to +254
private void finishTask() {
while (true) {
UpIterator.State state = task.advance();
switch (state) {
case AVAILABLE:
processAvailableElement();
break;
case BLOCKED:
task.waitFor();
break;
case FINISHED:
return;
default:
// Treat unknown states as terminal, consistent with GlutenSourceFunction.
LOG.warn("Unexpected Velox task state in finishTask: {}", state);
return;
}
}
}
Comment on lines +270 to +274
// Allow filesystem sink to flush and commit partitions after job completion.
Thread.sleep(2000);
if ("q10_orc.sql".equals(queryFileName)) {
verifyQ10OrcOutput(queryStartMillis);
}
Copilot AI review requested due to automatic review settings July 10, 2026 08:47
@zhanglistar zhanglistar force-pushed the codex/flink-orc-sink-format branch from 84ef067 to 7749d8a Compare July 10, 2026 08:49

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 2 comments.

Comment on lines 269 to +274
waitForJobCompletion(insertResult, 30000);
// Allow filesystem sink to flush and commit partitions after job completion.
Thread.sleep(2000);
if ("q10_orc.sql".equals(queryFileName)) {
verifyQ10OrcOutput(queryStartMillis);
}
Comment thread gluten-flink/pom.xml
Comment on lines 31 to +35
<properties>
<flink.version>1.19.2</flink.version>
<velox4j.version>0.1.0-SNAPSHOT</velox4j.version>
<protobuf.version>3.25.5</protobuf.version>
<hadoop.version>2.7.2</hadoop.version>
Copilot AI review requested due to automatic review settings July 10, 2026 11:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 14 out of 14 changed files in this pull request and generated 3 comments.

Comment on lines 65 to 68
} else if (operatorFactory instanceof GlutenOneInputOperatorFactory) {
return Optional.of(((GlutenOneInputOperatorFactory) operatorFactory).getOperator());
} else if (operatorFactory instanceof GlutenTwoInputOperatorFactory) {
return Optional.of(((GlutenTwoInputOperatorFactory) operatorFactory).getOperator());
}
return Optional.empty();
Comment on lines +283 to +286
outputIdle = leftInputIdle && rightInputIdle;
if (wasIdle != outputIdle) {
output.emitWatermarkStatus(outputIdle ? WatermarkStatus.IDLE : WatermarkStatus.ACTIVE);
}
// ProcessingTimeService for Flink AbstractStreamOperator. GlutenTwoInputOperator uses
// GlutenAbstractStreamOperator so it needs the Gluten-specific factory.
offloadedOpConfig.setStreamOperatorFactory(new GlutenTwoInputOperatorFactory<>(newTwoInputOp));
offloadedOpConfig.setStreamOperator(newTwoInputOp);

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 3 comments.

// ProcessingTimeService for Flink AbstractStreamOperator. GlutenTwoInputOperator uses
// GlutenAbstractStreamOperator so it needs the Gluten-specific factory.
offloadedOpConfig.setStreamOperatorFactory(new GlutenTwoInputOperatorFactory<>(newTwoInputOp));
offloadedOpConfig.setStreamOperator(newTwoInputOp);
zhanglistar and others added 5 commits July 11, 2026 17:11
- Support ORC filesystem sink format with q10_orc.sql test
- Add finishTask() to endInput() for both OneInput and TwoInput operators
- Route finishTask through drainOutput for mailbox reentrancy guard
- Treat unknown UpIterator.State as terminal (log+return, not throw)
- Close() only releases resources, does not drain output
- Add close tests for both operators
- Use protobuf.version and hadoop.version properties in UT pom
- Use dedicated output dir and process trigger for q10_orc
- Clean ORC output dir before q10_orc for deterministic verification
- Align Kafka port with KafkaToHiveE2ETest (19092)
- Update velox4j commit to f8684c84 (includes EmptyOperator NYI fix)
- Remove GlutenWatermarkStatuses (not supported by current velox4j)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 3 comments.

Comment on lines 65 to 68
} else if (operatorFactory instanceof GlutenOneInputOperatorFactory) {
return Optional.of(((GlutenOneInputOperatorFactory) operatorFactory).getOperator());
} else if (operatorFactory instanceof GlutenTwoInputOperatorFactory) {
return Optional.of(((GlutenTwoInputOperatorFactory) operatorFactory).getOperator());
}
return Optional.empty();
// ProcessingTimeService for Flink AbstractStreamOperator. GlutenTwoInputOperator uses
// GlutenAbstractStreamOperator so it needs the Gluten-specific factory.
offloadedOpConfig.setStreamOperatorFactory(new GlutenTwoInputOperatorFactory<>(newTwoInputOp));
offloadedOpConfig.setStreamOperator(newTwoInputOp);
Comment on lines +270 to +274
if ("q10_orc.sql".equals(queryFileName)) {
// Allow filesystem sink to flush and commit partitions after job completion.
Thread.sleep(2000);
verifyQ10OrcOutput(queryStartMillis);
}

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.

Comment on lines 65 to 67
} else if (operatorFactory instanceof GlutenOneInputOperatorFactory) {
return Optional.of(((GlutenOneInputOperatorFactory) operatorFactory).getOperator());
} else if (operatorFactory instanceof GlutenTwoInputOperatorFactory) {
return Optional.of(((GlutenTwoInputOperatorFactory) operatorFactory).getOperator());
}
Comment on lines 280 to 285
sourceOperator.getRightInputType(),
sourceOperator.getOutputTypes(),
inClass,
outClass);
// setStreamOperator would wrap this in Flink's SimpleOperatorFactory, which only initializes
// ProcessingTimeService for Flink AbstractStreamOperator. GlutenTwoInputOperator uses
// GlutenAbstractStreamOperator so it needs the Gluten-specific factory.
offloadedOpConfig.setStreamOperatorFactory(new GlutenTwoInputOperatorFactory<>(newTwoInputOp));
offloadedOpConfig.setStreamOperator(newTwoInputOp);
offloadedOpConfig.setStatePartitioner(0, new GlutenKeySelector());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants