diff --git a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java index ac49777600463a..fce74a27dc64fe 100644 --- a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java +++ b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java @@ -60,8 +60,10 @@ public class PaimonJniScanner extends JniScanner { private long tblId; private long lastUpdateTime; private RecordReader.RecordIterator recordIterator = null; + private final ClassLoader classLoader; public PaimonJniScanner(int batchSize, Map params) { + this.classLoader = this.getClass().getClassLoader(); LOG.debug("params:{}", params); this.params = params; String[] requiredFields = params.get("required_fields").split(","); @@ -87,9 +89,19 @@ public PaimonJniScanner(int batchSize, Map params) { @Override public void open() throws IOException { - initTable(); - initReader(); - resetDatetimeV2Precision(); + try { + // When the user does not specify hive-site.xml, Paimon will look for the file from the classpath: + // org.apache.paimon.hive.HiveCatalog.createHiveConf: + // `Thread.currentThread().getContextClassLoader().getResource(HIVE_SITE_FILE)` + // so we need to provide a classloader, otherwise it will cause NPE. + Thread.currentThread().setContextClassLoader(classLoader); + initTable(); + initReader(); + resetDatetimeV2Precision(); + } catch (Exception e) { + LOG.warn("Failed to open paimon_scanner: " + e.getMessage(), e); + throw e; + } } private void initReader() throws IOException { @@ -182,7 +194,7 @@ private void initTable() { PaimonTableCacheKey key = new PaimonTableCacheKey(ctlId, dbId, tblId, paimonOptionParams, dbName, tblName); TableExt tableExt = PaimonTableCache.getTable(key); if (tableExt.getCreateTime() < lastUpdateTime) { - LOG.warn("invalidate cacha table:{}, localTime:{}, remoteTime:{}", key, tableExt.getCreateTime(), + LOG.warn("invalidate cache table:{}, localTime:{}, remoteTime:{}", key, tableExt.getCreateTime(), lastUpdateTime); PaimonTableCache.invalidateTableCache(key); tableExt = PaimonTableCache.getTable(key);