doris

📅 2026/6/26 20:12:22
doris
doris写入问题1版本信息doris 4.04 hadoop 3.4.12背景在doris中建表成功后插入语句报错CREATETABLEidbtaskinfo1(taskidvarchar(128)NOTNULLCOMMENT任务ID主键,resultcsvarchar(128)NULLCOMMENT结果存储集合,levelintNULLCOMMENT任务优先级,taskdatedatetimeNULLCOMMENT任务完整创建时间 yyyy-MM-dd HH:mm:ss,countbigintNULLCOMMENT结果数量未执行NULL,resultclvarchar(128)NULLCOMMENT结果存储表,statetinyintNULLCOMMENT任务状态 0待执行 1执行中 2成功 3失败,commandtextNULLCOMMENTSQL命令,usetimebigintNULLCOMMENT执行耗时(ms)未执行NULL)ENGINEOLAPUNIQUEKEY(taskid)DISTRIBUTEDBYHASH(taskid)BUCKETS10PROPERTIES(file_cache_ttl_seconds0,is_being_syncedfalse,storage_mediumhdd,storage_formatV2,inverted_index_storage_formatV3,enable_unique_key_merge_on_writetrue,light_schema_changetrue,storage_vault_id1,storage_vault_namehdfs_vault,disable_auto_compactionfalse,enable_single_replica_compactionfalse,group_commit_interval_ms10000,group_commit_data_bytes134217728,enable_mow_light_deletefalse);插入语句INSERTINTOidbtaskinfo1(-taskid,resultcs,level,taskdate,count,resultcl,state,command,usetime-)VALUES(-778d2512b7694663872a3608fce3c89d,-NULL,-100,-2026-06-24 18:05:51,-NULL,-NULL,-0,-SELECT * FROM iceberg_catalog.default.idc WHERE id \123\,-NULL-);报错如下 ERROR1105(HY000): errCode2,detailMessage(192.168.1.4)[INTERNAL_ERROR][INTERNAL_ERROR]VNodeChannel[1779336396455-1777363401407],load_iddfdceb34807f4a5a-983e10523c046b50,txn_id5125085179679744,node192.168.1.2:8060,addbatch req success butstatusisnt ok,err:[INTERNAL_ERROR]PStatus:(192.168.1.2)[INTERNAL_ERROR]openfilefailed.fs_name:hdfs://192.168.1.4:8020 path:/doris/data_B9663C9A-2464-E8D2-9185-74F79FA22C8D/data/1779336396484/0200000000000dba1545e0b39cbc06f360f38bb2082f5ea3_0.dat, err: (255), Unknown分析原因由于建表语句中使用设置了存储路径这是存算分离的特性storage_vault_name “hdfs_vault” 这行配置意味着正在使用的表或数据库其数据会被存储在名为 hdfs_vault 的这个存储后端上。结合错误日志很可能这个 hdfs_vault 在创建时其 fs.defaultFS 属性直接配置了一个处于 Standby 状态的NameNode地址hdfs://192.168.1.4:8020从而导致写入失败。 因此是修改或重建这个 hdfs_vault将其 fs.defaultFS 指向HDFS高可用集群的nameservice而不是单个节点的IP。如果 hdfs_vault 是默认存储库你无法直接修改名称但可以通过 ALTER STORAGE VAULT 命令来修改其 fs.defaultFS 等属性。下面我尝试不设置存储路径默认是一般是存储在be本地1建表语句如下CREATETABLEidbtaskinfo_local(-taskidVARCHAR(128)-)-ENGINEOLAP-UNIQUEKEY(taskid)-DISTRIBUTEDBYHASH(taskid)BUCKETS10-PROPERTIES(-replication_num1-);插入语句INSERTINTOidbtaskinfo_localVALUES(test);2报错信息报错信息errCode2,detailMessage(192.168.1.3)[INTERNAL_ERROR][INTERNAL_ERROR]VNodeChannel[1779336412691-1777363401488],load_id5d6e0cd5af8643b3-8289133716b36bf4,txn_id5125662740726784,node192.168.1.4:8060,add batch req success but status isnt ok,err:[INTERNAL_ERROR]PStatus:(192.168.1.4)[INTERNAL_ERROR]openfilefailed.fs_name:hdfs://192.168.1.4:8020path:/doris/data_B9663C9A-2464-E8D2-9185-74F79FA22C8D/data/1779336412724/0200000000000768d3425df3107220f6dadebfac49967589_0.dat,err:(255),Unknown分析本地表也失败 → 和表无关没有 storage_vault_name没有 HDFS 配置理论上应该用 BE 本地磁盘但 INSERT 仍然报错说明Doris 集群级别已经被“绑死”到 HDFS Storage Vault查看存储 Vault 定义SHOWSTORAGE VAULTS;-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|Name|Id|Propeties|IsDefault|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|hdfs_vault|1|build_conf { fs_name:hdfs://192.168.1.4:8020} prefix:doris/data_B9663C9A-2464-E8D2-9185-74F79FA22C8D|true||hdfs_test|2|build_conf { fs_name:hdfs://everdchdfs_confs {key:dfs.namenode.rpc-address.everdc.nn2value:192.168.1.3:8020} hdfs_confs {key:dfs.namenode.rpc-address.everdc.nn1value:192.168.1.4:8020} hdfs_confs {key:dfs.client.failover.proxy.provider.everdcvalue:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider} hdfs_confs {key:dfs.ha.namenodes.everdcvalue:nn1,nn2} hdfs_confs {key:dfs.nameservicesvalue:everdc} } prefix:big/data_FF6673E7-C619-E296-9E1A-6EB8CB4151C0|false|本质原因hdfs_vault 是默认 Storage Vault这意味着所有没有显式指定 storage_vault 的表都会默认使用 hdfs_vault而hdfs_vault设置的是是集群的单节点刚好这个节点又变成了从节点导致这个问题切换到hdfs_test 应该可以这个是有HA功能-- 设置 hdfs_test 为默认 Vault SET hdfs_test AS DEFAULT STORAGE VAULT;验证SHOW STORAGE VAULTS;这个只是对新建的表有影响之前建的表还是有问题**写在最后**新建【数据库】默认走 hdfs_test推荐从 Doris 3.0.5 / 4.x 支持Database 级别 VaultCREATE DATABASE IF NOT EXISTS my_dbPROPERTIES (“storage_vault_name” “hdfs_test”);修改已有数据库的 Vault仅影响新建表ALTER DATABASE my_dbSET PROPERTIES (“storage_vault_name” “hdfs_test”);