littlelittlewhite09 opened a new issue, #12474:
URL: https://github.com/apache/gluten/issues/12474

   ### Backend
   
   VL (Velox)
   
   ### Bug description
   
   ### Example
   ```sql
   set spark.sql.maxConcurrentOutputFileWriters = 0;
   set spark.sql.sources.partitionOverwriteMode = DYNAMIC;
   
   -- src table
   DROP TABLE IF EXISTS sql_migration.tmp_gluten_repro_src;
   CREATE TABLE sql_migration.tmp_gluten_repro_src (k string, v string, day 
string) STORED AS ORC;
   
   INSERT INTO sql_migration.tmp_gluten_repro_src VALUES
     ('k1','v01','2026-06-01'), ('k2','v02','2026-06-02'),
     ('k3','v03','2026-06-01'), ('k4','v04','2026-06-02'),
     ('k5','v05','2026-06-01'), ('k6','v06','2026-06-02'),
     ('k7','v07','2026-06-01'), ('k8','v08','2026-06-02'),
     ('k9','v09','2026-06-01'), ('k10','v10','2026-06-02');
   
   -- target table
   DROP TABLE IF EXISTS sql_migration.tmp_gluten_repro_tgt;
   CREATE TABLE sql_migration.tmp_gluten_repro_tgt (k string, m string)
     PARTITIONED BY (day string) STORED AS ORC;
   
   -- insert into partitions dynamically
   INSERT OVERWRITE TABLE sql_migration.tmp_gluten_repro_tgt PARTITION(day)
   SELECT k, max(v) AS m, day
   FROM sql_migration.tmp_gluten_repro_src
   GROUP BY day, k;
   
   ```
   
   ```
   Exception:
   Caused by: org.apache.hadoop.fs.FileAlreadyExistsException: 
/xx/xx/sql_migration/tmp_gluten_repro_tgt/.spark-staging-46b3ca99-cab6-4c7e-9e12-dd6a8ad81bc9/_temporary/0/_temporary/attempt_202607081201073995302620617304707_0039_m_000000_2127/day=2026-06-02/part-00000-46b3ca99-cab6-4c7e-9e12-dd6a8ad81bc9.c000.snappy.orc
 for client 10.69.52.150 already exists
        at 
org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.startFile(FSDirWriteFileOp.java:386)
        at 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2464)
        at 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2361)
        at 
org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:774)
        at 
org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:462)
        at 
org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at 
org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:522)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1025)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:931)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:870)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at 
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2763)
   
        at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
 Method)
        at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at 
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at 
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at 
org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:121)
        at 
org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:88)
        at 
org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:284)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1219)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1198)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1136)
        at 
org.apache.hadoop.hdfs.DistributedFileSystem$8.doCall(DistributedFileSystem.java:531)
        at 
org.apache.hadoop.hdfs.DistributedFileSystem$8.doCall(DistributedFileSystem.java:528)
        at 
org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at 
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:542)
        at 
org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:469)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1123)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1103)
        at org.apache.orc.impl.PhysicalFsWriter.<init>(PhysicalFsWriter.java:94)
        at org.apache.orc.impl.WriterImpl.<init>(WriterImpl.java:230)
        at org.apache.orc.OrcFile.createWriter(OrcFile.java:1040)
        at 
org.apache.spark.sql.execution.datasources.orc.OrcOutputWriter.<init>(OrcOutputWriter.scala:50)
        at 
org.apache.spark.sql.execution.datasources.orc.OrcFileFormat$$anon$1.newInstance(OrcFileFormat.scala:92)
        at 
org.apache.spark.sql.execution.datasources.BaseDynamicPartitionDataWriter.renewCurrentWriter(FileFormatDataWriter.scala:298)
        at 
org.apache.spark.sql.execution.datasources.DynamicPartitionDataSingleWriter.write(FileFormatDataWriter.scala:365)
        at 
org.apache.spark.sql.execution.datasources.FileFormatDataWriter.writeWithMetrics(FileFormatDataWriter.scala:85)
        at 
org.apache.spark.sql.execution.datasources.FileFormatDataWriter.writeWithIterator(FileFormatDataWriter.scala:92)
        at 
org.apache.spark.sql.execution.datasources.FileFormatWriter$.$anonfun$executeTask$2(FileFormatWriter.scala:481)
        at 
org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1398)
        at 
org.apache.spark.sql.execution.datasources.FileFormatWriter$.executeTask(FileFormatWriter.scala:488)
        ... 17 more
   ```
   ### BUG Description
   ```text
   Gluten plan:
   Execute InsertIntoHadoopFsRelationCommand (16)
      +- WriteFiles (15)
         +- VeloxColumnarToRow (14)
            +- ^ ProjectExecTransformer (12)
               +- ^ RegularHashAggregateExecTransformer (11)
                  +- ^ InputIteratorTransformer (10)
                     +- AQEShuffleRead (8)
                        +- ShuffleQueryStage (7), Statistics(sizeInBytes=271.0 
B, rowCount=10)
                           +- ColumnarExchange (6)
                              +- VeloxResizeBatches (5)
                                 +- ^ ProjectExecTransformer (3)
                                    +- ^ FlushableHashAggregateExecTransformer 
(2)
                                       +- ^ FileSourceScanExecTransformer orc 
spark_catalog.sql_migration.tmp_gluten_repro_src (1)
   
   initial plan:
      Execute InsertIntoHadoopFsRelationCommand (24)
      +- WriteFiles (23)
         +- SortAggregate (22)
            +- Sort (21)
               +- Exchange (20)
                  +- SortAggregate (19)
                     +- Sort (18)
                        +- Scan orc 
spark_catalog.sql_migration.tmp_gluten_repro_src (17)
   ```
   Gluten transforms SortAggregate into HashAggregate,it destroys the ordering 
requirement for dynamic partitions writing. When 
dynamicPartitionDataSingleWriter is adopted, Task may process data that is not 
sorted by the partition column, which leading the  FileAlreadyExistsException. 
Actually, when spark.sql.maxConcurrentOutputFileWriters > 0, 
dynamicPartitionDataConcurrentWriter can be adopted, and the problem can be 
avoided. But, I do not think it is a graceful way.
   
   
   ### Gluten version
   
   _No response_
   
   ### Spark version
   
   None
   
   ### Spark configurations
   
   _No response_
   
   ### System information
   
   _No response_
   
   ### Relevant logs
   
   ```bash
   
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to