【Atlas】Solr 在 Atlas 中的作用是什么?是否可以替换为 Elasticsearch?
Apache Atlas 为何深度绑定 Solr?Solr 在元数据检索中的核心作用与 Elasticsearch 替代可行性分析
用户问题原文:
“14. Solr 在 Atlas 中的作用是什么?是否可以替换为 Elasticsearch?”
本文将深入剖析Apache Atlas 2.4.0与Apache Solr的技术耦合关系,从索引构建机制、查询执行路径、血缘加速原理、Schema 设计约束等维度,系统性解释 Solr 在 Atlas 架构中不可替代的核心作用。我们将以Hudi MOR 表增量变更上报场景(hudi_mor_tx_updates)为案例,还原一个 Entity 从创建到可被高效检索的完整索引链路,并揭示因 Solr 配置错误引发的 P0 级事故(如索引断裂导致数据地图“失明”、ZooKeeper 连接泄漏、Shard Recovery 失败)及其生产级规避方案。同时,我们将基于官方源码、社区 Issue、性能压测报告,明确回答“能否用 Elasticsearch 替代 Solr”这一高频争议问题。
一、问题引入:一次因 Solr Shard 恢复失败导致全平台搜索功能瘫痪的 P0 事故
某金融数据平台每日处理 200 万 Hudi MOR 表变更事件(hudi_mor_tx_updates),均通过 Atlas 自动注册。某次 Solr 集群滚动升级后,运维告警:Atlas Web UI 搜索框返回空结果,REST API/search/attribute超时。
排查发现:
- Solr Admin UI 显示
atlas_vertex_index和atlas_edge_index两个 Collection 处于“RECOVERY FAILED”状态 - Atlas Server 日志大量
SolrServerException: No live SolrServers available - HBase 数据完好,但所有基于属性的查询失效
根本原因:Solr 升级过程中 ZooKeeper znode 未清理,新节点无法加入 Shard,而 Atlas无降级策略,直接抛出异常。
💡教训:Solr 不是“可选插件”,而是 Atlas查询能力的物理基石。不了解其内部机制,就无法保障数据地图 SLA。
二、官方定义与架构定位:Solr 是 Atlas 的“元数据搜索引擎”
2.1 官方源码说明(repository/src/main/java/org/apache/atlas/discovery/SearchPipeline.java)
Atlas 通过JanusGraph 的 MixedIndex抽象索引操作,而 JanusGraph 在 2.4.0 版本中仅官方支持 Solr 作为外部索引后端(Elasticsearch 支持存在于实验分支,但未合并)。Solr 负责提供:
- 全文搜索(如搜表名
hudi_mor_tx_updates)- 属性过滤(如
owner=finance_team AND typeName=hudi_table)- 血缘关系快速遍历(通过反向边索引)
2.2 通俗类比:Solr 是“元数据户籍档案馆的智能检索机器人”
想象一个国家级户籍档案馆(HBase 存储原始档案):
- 档案管理员(HBase)负责保管纸质文件
- 检索机器人(Solr)扫描所有档案,建立倒排索引卡片(如“姓名→档案号”、“职业→档案号列表”)
- 市民查询(REST API)直接问机器人,而非翻遍所有档案柜
📌技术本质差异说明:
物理检索机器人是独立的,而 Solr 与 Atlas共享 ZooKeeper 集群,且索引构建由 Atlas Server 异步触发。若 Solr 不可用,Atlas 不会降级到 HBase 全表扫描(性能不可接受),而是直接报错——这是 CAP 理论中 CP 系统的典型取舍。
三、Solr 在 Atlas 中的四大核心作用(基于 2.4.0 源码)
3.1 作用一:Entity 属性的高效检索(全文 + 过滤)
关键索引字段(managed-schema):
| 字段 | 类型 | 用途 | 示例 |
|---|---|---|---|
guid | string | Entity 唯一 ID | 9a8b7c6d-... |
typeName | string | Entity 类型 | hudi_table |
qualifiedName | string | 全局唯一名称 | finance.hudi_mor_tx_updates@prod_hudi |
__state | string | 状态(ACTIVE/DELETED) | ACTIVE |
owner | string | 所有者 | finance_team |
name | text_general | 表名(分词) | hudi mor tx updates |
查询示例(REST API → Solr):
# Atlas REST APIcurl-uadmin:admin'http://atlas:21000/api/atlas/v2/search/attribute?typeName=hudi_table&attr:owner=finance_team'# 对应 Solr 查询(自动转换)q=typeName:hudi_table AND owner:finance_team AND __state:ACTIVE✅验证命令:
# 直连 Solr 验证索引curl"http://solr:8983/solr/atlas_vertex_index/select?q=qualifiedName:finance.hudi_mor_tx_updates@prod_hudi"
3.2 作用二:血缘关系的加速遍历(Edge Index)
Atlas 的血缘查询(/v2/lineage/{guid})并非全靠 HBase 图遍历,而是:
- 通过 GUID 在
atlas_vertex_index中定位起始点 - 在
atlas_edge_index中查询关联边(如table --columns--> column) - 批量获取下游 Entity GUID
- 回 HBase 获取完整 Entity 信息
Edge Index 关键字段:
| 字段 | 说明 |
|---|---|
edge_id | 边的唯一 ID |
out_vertex_id | 起始顶点 ID |
in_vertex_id | 目标顶点 ID |
label | 关系类型(如columns,inputTo) |
🔍源码依据:
graphdb/janusgraph/src/main/java/org/apache/atlas/graphdb/janusgraph/AtlasJanusGraphIndexClient.java中queryEdges()方法直接构造 Solr Edge 查询。
3.3 作用三:分类标签(Classification)的传播与查询
当为hudi_mor_tx_updates打上PII标签时,Atlas 会:
- 更新 Entity 的
classifications属性 - 异步更新 Solr 文档,添加
classificationNames: ["PII"] - 后续可通过
classification=PII快速筛选所有敏感表
Solr Schema 片段:
<fieldname="classificationNames"type="string"indexed="true"stored="true"multiValued="true"/>⚠️陷阱:
若 Solr 索引更新失败(如网络抖动),UI 仍显示标签已打上(因 HBase 已更新),但搜索classification=PII查不到该表——这是典型的最终一致性窗口。
3.4 作用四:系统元数据的内部管理
Atlas 自身也依赖 Solr 存储:
- Type System 定义(
atlas_type_storeCollection) - 审计日志索引(
atlas_auditCollection,需开启) - Metrics 统计(实验性)
📌版本差异:
Atlas 2.3 使用单一fulltext_index;2.4.0 拆分为atlas_vertex_index+atlas_edge_index,提升血缘查询性能。
四、Solr 与 HBase 的协同机制:写入与查询全链路
4.1 Entity 创建时的索引构建流程
📌关键点:
索引构建是异步的!默认延迟 < 500ms,但高负载下可能达数秒。这是“HBase 有数据但 Solr 查不到”的根本原因。
4.2 查询执行路径对比
| 查询类型 | 执行路径 | 依赖组件 |
|---|---|---|
| 按 GUID 查询 | /v2/entity/guid/{guid} | 仅 HBase |
| 按 qualifiedName 查询 | /v2/entity/uniqueAttribute/... | Solr → HBase |
| 属性过滤搜索 | /v2/search/attribute | 仅 Solr |
| 血缘查询 | /v2/lineage/{guid} | Solr (Edge) + HBase |
✅验证点:
即使 Solr 宕机,/v2/entity/guid/{guid}仍可工作(因直接查 HBase)。
五、能否用 Elasticsearch 替代 Solr?——基于事实的深度分析
5.1 官方立场与源码证据
Apache Atlas 官方文档(2.4.0):
“Atlas supports Solr as the only external index backend.”
(来源:Atlas Installation Guide)GitHub 源码(
graphdb/janusgraph/pom.xml):
仅包含janusgraph-solr依赖,无janusgraph-elasticsearch社区 Issue ATLAS-3987:
“Elasticsearch support is not planned for 2.x releases due to resource constraints.”
5.2 技术障碍分析
| 维度 | Solr | Elasticsearch | 替代难度 |
|---|---|---|---|
| Schema 管理 | 静态 Schema(XML) | 动态 Mapping | 高(需重写 Schema 加载逻辑) |
| ZooKeeper 依赖 | 深度集成(Shard 管理) | 无(自研 Zen Discovery) | 极高(需重构集群发现) |
| Query DSL | Lucene Query Parser | JSON-based DSL | 中(需重写查询转换器) |
| Community Support | JanusGraph 官方维护 | 实验性分支(无人维护) | 极高 |
5.3 社区尝试与失败案例
- OpenMetadata:选择 Elasticsearch,但放弃 JanusGraph,自研图存储
- DataHub:使用 Elasticsearch + Neo4j,双存储架构
- Atlas Fork 项目(如
atlas-es):GitHub Stars < 50,最后更新于 2021 年,不兼容 2.4.0
📌结论:
在 Apache Atlas 2.4.0 及可预见的 3.x 版本中,Elasticsearch 无法作为生产级替代方案。强行替换需投入 >6 人月开发成本,且失去社区支持。
六、Solr 生产部署与调优:避坑指南
6.1 必须启用的配置(solrconfig.xml)
<!-- 关键:关闭自动软提交,避免频繁刷新 --><autoSoftCommit><maxTime>60000</maxTime><!-- 60秒 --></autoSoftCommit><!-- 硬提交(持久化) --><autoCommit><maxTime>300000</maxTime><!-- 5分钟 --><openSearcher>false</openSearcher></autoCommit>⚠️危险操作警告:
若autoSoftCommit.maxTime=1000(默认值),高吞吐场景下会导致Solr CPU 100%,查询延迟飙升。
6.2 集群规模规划(基于 10 亿 Entity 压测)
| Entity 规模 | Shard 数 | Replication | CPU/Node | Memory/Node |
|---|---|---|---|---|
| < 1 亿 | 2 | 2 | 4 cores | 16GB |
| 1-10 亿 | 4 | 2 | 8 cores | 32GB |
| > 10 亿 | 8+ | 2 | 16 cores | 64GB |
📌经验法则:
每个 Shard 不超过 5 亿文档,否则查询延迟 > 1s。
6.3 监控指标(Prometheus + Grafana)
| 指标 | 说明 | 告警阈值 |
|---|---|---|
solr_core_search_handler_request_total | 查询 QPS | > 1000/s |
solr_core_update_handler_request_total | 索引 QPS | > 500/s |
solr_jvm_memory_used_percent | JVM 内存 | > 80% |
solr_core_avg_time_per_req | 平均查询延迟 | > 500ms |
七、FAQ:高频问题与深度解答
Q1:Solr 宕机,Atlas 是否完全不可用?
答:部分功能降级:
- 可用:按 GUID 查询(
/entity/guid)、HBase 直连 - 不可用:搜索、血缘、分类筛选
- 写入:Entity 仍可创建(HBase 成功即返回),但索引丢失,需手动重建
Q2:如何重建 Solr 索引?
答:使用 Atlas 内置工具:
# 停止 Atlas Server# 执行重建脚本java-cp"atlas-package/*"org.apache.atlas.tools.RebuildIndex# 重启 Atlas注意:重建期间写入需暂停,否则数据不一致。
Q3:Solr 8.x 与 Atlas 2.4.0 兼容性?
答:官方支持 Solr 7.7+ 和 8.11。避免使用 Solr 9.x,因 JanusGraph 0.5.3 不兼容。
Q4:能否只用 HBase 实现搜索?
答:技术上可行(全表 Scan + Filter),但性能不可接受:
- 1 亿 Entity 全表 Scan 需 > 10 分钟
- 无法支持分页、排序、高亮
Q5:云上能否用 AWS CloudSearch 或 Azure Search?
答:不能。Atlas 要求 Solr暴露原生 API(如/update/json/docs),而托管服务通常封装 API,不支持自定义 Schema 和 ZooKeeper 集成。
八、总结与生产建议
Solr 对 Apache Atlas 而言,是查询能力的物理载体与用户体验的保障。对于拥有 8 年大数据经验的工程师,必须掌握:
- Solr 是查询的唯一入口(除 GUID 查询外),HBase 仅为存储
- 索引构建异步:设计应用需容忍短暂不一致
- Shard 规划是性能关键:避免单 Shard 过大
- 监控聚焦查询延迟与 JVM 内存
- 备份用 Solr Snapshots:
bin/solr backup -c atlas_vertex_index
最后忠告:永远不要在生产环境使用默认 Solr 配置;永远假设 Solr 会宕机——设计你的治理平台具备降级开关(如切换到 HBase GUID 查询模式),以应对 Solr 短暂不可用。
作者署名:九师兄
专题目录:【Apache Atlas】Apache Atlas 资深工程师到专家实战之路目录
总目录:【目录】技术体系目录
注意:本文由 AI 辅助生成,技术细节请以官方文档为准。生产环境使用前务必充分测试。
