首页 / 资讯中心 / 文章详情

Apache Atlas 独立部署避坑指南:HBase、Solr、Kafka 依赖选型与常见报错排查

Apache Atlas 独立部署避坑指南:HBase、Solr、Kafka 依赖选型与常见报错排查 ★ FEATURED ARTICLE
1. 为什么我要写这份部署避坑指南Apache Atlas 这个组件但凡在大数据治理领域摸爬滚打过一阵子的人应该都不陌生。它本质上是一套元数据管理与数据血缘追踪系统帮我们把 Hive、HBase、Kafka、Spark 这些散落在集群各处的数据资产统一登记造册理清这张表从哪来、到哪去、被谁用过的完整链路。听起来很美好但真正动手部署过的人都知道这东西的安装过程堪称一步一个坎——环境依赖挑剔、版本兼容性玄学、启动报错信息又极其不友好。我在过去几年里先后在测试环境、准生产环境、生产环境部署过 Atlas 不下十次踩过的坑从 JDK 版本冲突到 Solr 索引崩溃从 HBase 表结构初始化失败到 Kafka 消息队列连接超时几乎把官方文档没写清楚的角落都趟了一遍。这份内容就是把这些经验系统化整理出来面向的是正在或即将部署 Atlas 的运维工程师、大数据平台开发者以及需要搭建元数据管理能力的技术团队。不管你是第一次接触 Atlas 的新手还是被某个诡异报错卡住的老手希望这里的排查思路和实操细节能帮你少走弯路。需要提前说明的是Atlas 的部署方式有好几种——独立部署、集成到 Ambari、用 Docker 容器化。我这里主要围绕独立部署Standalone这条路径展开因为这是最能理解 Atlas 内部机制的方式也是遇到问题时最容易定位根因的方式。集成部署虽然省事但一旦出问题排查链路会拉得很长反而不利于积累经验。2. 部署前的整体设计与依赖选型思路2.1 Atlas 的架构组成与依赖关系拆解在动手之前必须先搞清楚 Atlas 到底依赖哪些外部组件否则你会在安装过程中被各种意外打断。Atlas 的核心架构可以分成四层来理解存储层Atlas 自身不存储元数据实体它把元数据存到HBase里也可以配置 Cassandra但 HBase 是主流选择。同时全文检索能力依赖Solr或Elasticsearch用来支撑前端的搜索和 DSL 查询。消息层Atlas 通过Kafka接收来自各个数据源的元数据变更事件比如 Hive Hook 捕获的建表操作然后异步写入存储层。服务层Atlas 核心进程提供 REST API 和 Web UI内部包含 TypeSystem、GraphEngine、Notification 等模块。采集层各种 HookHive Hook、HBase Hook和 Bridge 负责从数据源抓取元数据并投递到 Kafka。这四层里存储层和消息层是最容易出问题的环节。HBase 的版本、Solr 的配置、Kafka 的 Topic 初始化任何一个环节不匹配Atlas 都起不来。所以我的建议是先把这三个外部依赖单独跑通确认它们自身健康再开始装 Atlas。2.2 版本兼容性为什么这是第一大坑Atlas 的版本兼容性矩阵是官方文档里最容易被忽略、但实际影响最大的部分。我见过太多人因为版本不匹配卡在启动阶段好几天。核心原则是Atlas 版本决定了它依赖的 HBase、Solr、Kafka、JDK 的版本范围不能随意搭配。以 Atlas 2.1.0 为例它官方验证过的组合大致是JDK 8注意JDK 11 在部分版本上会有反射相关的兼容问题、HBase 2.0.x、Solr 7.7.x、Kafka 2.2.x。如果你用的是 Atlas 2.2.0Solr 可以升到 8.x但 HBase 仍然建议 2.0.x 或 2.1.x。这些数字不是随便写的背后是 Atlas 代码里对 HBase Client API 和 SolrJ API 的调用方式决定的。提示不要迷信用最新版本总没错。Atlas 的发布节奏比 HBase、Solr 慢很多用最新版 HBase 配老版 Atlas大概率会遇到 NoSuchMethodError 或 ClassNotFoundException。2.3 部署模式选择内嵌 vs 外置Atlas 支持两种部署模式一种是使用内嵌的 HBase 和 Solr仅用于快速体验另一种是连接外置的 HBase 和 Solr 集群。生产环境必须用外置模式原因很简单内嵌模式的 HBase 是单机版数据可靠性没有保障而且 Atlas 重启后内嵌存储的数据可能丢失。外置模式下你需要提前准备好一个可用的 HBase 集群单机伪分布式也可以但生产建议至少 3 节点一个可用的 Solr 集群或单机 Solr 服务一个可用的 Kafka 集群单机也可以但要注意 Topic 的副本数配置我个人的习惯是在部署 Atlas 之前先用一个简单的脚本验证这三个组件之间的网络连通性和基本读写能力。比如用 HBase shell 建一张测试表、用 Solr 的 API 建一个测试 collection、用 Kafka 命令行工具生产消费一条消息。这三步都通过了再开始 Atlas 的安装。3. 核心细节解析与实操要点3.1 环境准备阶段的关键检查项环境准备看起来简单但这里埋的雷最多。我整理了一份必查清单按优先级排序检查项具体要求常见问题JDK 版本JDK 8推荐 8u201 以上JDK 11 反射报错、JDK 9 模块化冲突主机名解析/etc/hosts 中主机名与 IP 对应主机名解析失败导致 Kafka 连接超时端口占用21000Atlas、2181ZK、9092Kafka、16000HBase、8983Solr端口冲突导致进程启动即退出内存分配Atlas 至少 4GB 堆内存HBase 和 Solr 各 2GB 以上OOM 导致进程被 kill文件句柄数ulimit -n 至少 65535句柄耗尽导致连接被拒绝时间同步各节点时间差小于 5 秒时间偏差导致 Kerberos 认证失败如启用这里面我特别想强调主机名解析这一项。Atlas 在启动时会通过主机名去连接 Kafka 和 HBase如果 /etc/hosts 里没有正确配置或者用了 localhost 但 Kafka 注册的是真实主机名就会出现明明端口通、但就是连不上的诡异现象。我遇到过好几次最后发现是 Kafka 的 advertised.listeners 配置和 Atlas 使用的主机名不一致导致的。3.2 HBase 表结构初始化的正确姿势Atlas 启动时会自动在 HBase 中创建它需要的表主要是apache_atlas_janus这张图存储表。但自动创建经常失败原因通常是 HBase 的权限问题或者 namespace 不存在。我的做法是手动预创建这样能提前发现权限和配置问题。具体步骤确认 HBase 中是否存在apache_atlas这个 namespace如果没有先创建create_namespace apache_atlas确认 Atlas 使用的 HBase 用户对该 namespace 有读写权限。如果是简单认证模式通常没问题如果启用了 Kerberos需要提前授权。检查hbase-site.xml中的zookeeper.znode.parent配置Atlas 需要读取这个配置来定位 HBase 在 ZooKeeper 中的根节点。如果 HBase 是 HA 模式这个值通常是/hbase如果是单机可能是/hbase-unsecure。这个配置错了Atlas 会报 Cant get the location of hbase 之类的错误。注意Atlas 的atlas.graph.storage.hbase.table配置项默认是apache_atlas_janus如果你手动改了表名记得同步修改这个配置。3.3 Solr Collection 的创建与 Schema 配置Solr 这块的坑主要集中在Collection 创建和Schema 字段定义上。Atlas 需要一个名为vertex_index和edge_index的两个 Collection分别对应顶点和边的索引。这两个 Collection 的 Schema 必须包含 Atlas 预定义的字段否则索引写入会失败。手动创建 Collection 的命令大致如下solrctl collection --create vertex_index -s 1 -r 1 -m 1 solrctl collection --create edge_index -s 1 -r 1 -m 1创建完成后需要把 Atlas 自带的 schema 文件在atlas/conf/solr/目录下上传到 Solr 的 ZooKeeper 中或者直接通过 Solr 的 Schema API 添加字段。这一步如果漏了Atlas 启动时不会报错但前端搜索会一直返回空结果非常隐蔽。我踩过的一个典型坑是Solr 的autoSoftCommit配置没开导致索引写入后要等很久才能被搜索到。Atlas 的搜索功能依赖近实时索引所以建议在solrconfig.xml中把autoSoftCommit的maxTime设为 1000ms 左右。3.4 Kafka Topic 的初始化与消息格式验证Atlas 启动时会自动创建它需要的 Kafka Topic主要是ATLAS_HOOK和ATLAS_ENTITIES。但自动创建依赖 Kafka 的auto.create.topics.enable为 true如果这个配置被关了生产环境常见就需要手动创建。手动创建的命令kafka-topics.sh --create --topic ATLAS_HOOK --partitions 3 --replication-factor 1 --bootstrap-server localhost:9092 kafka-topics.sh --create --topic ATLAS_ENTITIES --partitions 3 --replication-factor 1 --bootstrap-server localhost:9092分区数建议至少 3副本数根据集群规模定。创建完成后可以用kafka-console-consumer.sh消费一下ATLAS_HOOK然后手动往里面发一条测试消息看看 Atlas 是否能正常消费并写入 HBase。这一步能提前验证整条链路是否通畅。4. 实操过程与核心环节实现4.1 从零开始Atlas 安装的完整流程假设你已经准备好了 HBase、Solr、Kafka并且 JDK 8 已经安装配置好。下面是我常用的安装流程按顺序执行基本不会出大问题。第一步下载与解压从官方渠道获取 Atlas 的二进制包比如apache-atlas-2.1.0-bin.tar.gz解压到/opt/目录下tar -zxvf apache-atlas-2.1.0-bin.tar.gz -C /opt/ cd /opt/apache-atlas-2.1.0第二步配置 atlas-env.sh这个文件主要设置 JDK 路径和内存参数。关键配置项export JAVA_HOME/usr/lib/jvm/java-8-openjdk export ATLAS_SERVER_HEAP-Xms4096m -Xmx4096m export ATLAS_SERVER_OPTS-server -XX:ParallelGCThreads4 -XX:UseConcMarkSweepGC内存不要给太小Atlas 启动时会加载大量类堆内存低于 2GB 很容易 OOM。第三步配置 atlas-application.properties这是 Atlas 最核心的配置文件需要修改的地方包括atlas.graph.storage.backendhbase指定图存储后端atlas.graph.storage.hostname你的ZK地址HBase 的 ZooKeeper 地址atlas.graph.index.search.backendsolr指定索引后端atlas.graph.index.search.solr.zookeeper-url你的ZK地址Solr 的 ZooKeeper 地址atlas.kafka.bootstrap.servers你的Kafka地址:9092atlas.kafka.zookeeper.connect你的ZK地址这里有个细节如果 HBase 和 Solr 共用同一个 ZooKeeper 集群atlas.graph.storage.hostname和atlas.graph.index.search.solr.zookeeper-url可以填一样的值但要注意 Solr 在 ZooKeeper 中的根节点路径可能不同通常是/solr。第四步初始化 HBase 表结构执行 Atlas 自带的初始化脚本./bin/atlas_stop.py # 先确保没有残留进程 ./bin/atlas_start.py # 启动时会自动初始化如果自动初始化失败可以手动执行./bin/atlas_start.py --init第五步验证启动状态启动后检查日志logs/atlas.log看到 Atlas Server started 字样才算成功。然后访问http://localhost:21000默认用户名密码是admin/admin。4.2 关键参数的计算与选择过程在配置过程中有几个参数需要根据实际环境计算不能照抄。堆内存大小的计算Atlas 的堆内存需求主要取决于元数据实体数量。一个经验公式是每 10 万个实体大约需要 1GB 堆内存。如果你预计管理 50 万张表那至少需要 5GB 堆内存。另外Solr 的索引也会占用内存如果 Solr 和 Atlas 部署在同一台机器上要预留足够的内存给 Solr。Kafka 分区数的计算分区数决定了 Atlas 消费元数据事件的并行度。如果数据源比如 Hive的元数据变更非常频繁建议分区数设为 6 或更多。但分区数也不是越多越好因为每个分区都会占用文件句柄和内存。一般来说3 到 6 个分区能满足大多数场景。Solr 分片数的计算Solr Collection 的分片数决定了索引的分布式程度。如果元数据量不大少于 100 万实体单分片就够了。如果实体数量很大可以按每 50 万实体一个分片来估算。4.3 启动后的健康检查与功能验证Atlas 启动成功后不要急着接入数据源先做一轮健康检查REST API 检查访问http://localhost:21000/api/atlas/admin/status返回{Status:ACTIVE}说明服务正常。HBase 表检查用 HBase shell 执行list确认apache_atlas_janus表存在且有数据。Solr Collection 检查访问 Solr 的管理界面确认vertex_index和edge_index两个 Collection 的状态是 active。Kafka Topic 检查用kafka-topics.sh --list确认ATLAS_HOOK和ATLAS_ENTITIES存在。这四项都通过后可以尝试创建一个测试实体。比如通过 REST API 创建一个 Database 类型的实体curl -X POST -u admin:admin -H Content-Type: application/json -d {entity:{typeName:Database,attributes:{name:test_db,qualifiedName:test_dbcluster}}} http://localhost:21000/api/atlas/v2/entity如果返回的 JSON 中包含创建的实体信息说明整条链路REST - Kafka - HBase - Solr都是通的。5. 常见问题与排查技巧实录5.1 启动阶段典型报错与解决方案报错一java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration这个报错说明 Atlas 找不到 HBase 的客户端 jar 包。原因是 Atlas 的 classpath 中没有包含 HBase 的依赖。解决方法是把 HBase 的hbase-client.jar和hbase-common.jar拷贝到 Atlas 的lib/目录下或者在atlas-env.sh中通过ATLAS_CLASSPATH指定 HBase 的 lib 路径。报错二org.apache.solr.client.solrj.SolrServerException: Server refused connection这个报错通常是 Solr 的 ZooKeeper 地址配置错误或者 Solr 服务没有正常启动。先检查 Solr 进程是否存在再用zkCli.sh连接 ZooKeeper确认/solr节点下有 live_nodes 信息。如果 live_nodes 为空说明 Solr 没有注册到 ZooKeeper需要检查 Solr 的solr.in.sh中的 ZK_HOST 配置。报错三kafka.common.KafkaException: Failed to construct kafka consumer这个报错一般是 Kafka 版本与 Atlas 内置的 Kafka Client 版本不兼容。Atlas 2.1.0 内置的是 Kafka 2.2 的客户端如果你连接的 Kafka 集群是 0.10 或 0.11 版本就会出现协议不匹配。解决办法是升级 Kafka 集群或者替换 Atlas lib 目录下的 Kafka Client jar 包为匹配版本。5.2 运行阶段性能问题与调优问题一Atlas 前端搜索响应慢如果搜索一个表名要等好几秒通常是 Solr 索引没有优化。可以检查 Solr 的solrconfig.xml中autoSoftCommit和autoCommit的配置。另外如果 Solr 的堆内存太小频繁 GC 也会导致响应慢。建议给 Solr 分配至少 4GB 堆内存。问题二元数据写入延迟高Atlas 通过 Kafka 异步消费元数据事件如果 Kafka 消费 lag 很高说明 Atlas 的消费能力不足。可以增加ATLAS_HOOKTopic 的分区数并相应增加 Atlas 的消费者线程数通过atlas.notification.consumer.threads配置。问题三HBase 写入超时如果 Atlas 日志中频繁出现 HBase 写入超时可能是 HBase 的 RegionServer 负载过高或者 Atlas 与 HBase 之间的网络延迟大。可以调整 HBase 客户端的hbase.client.write.buffer和hbase.client.retries.number参数。5.3 独家避坑技巧汇总技巧一在atlas-application.properties中把atlas.server.run.setup.on.start设为false可以避免每次启动都尝试初始化 HBase 表结构加快启动速度。技巧二如果使用 Kerberos 认证务必确保 Atlas 的 keytab 文件权限正确通常是 600并且 principal 名称与 Kafka、HBase 中配置的一致。技巧三Atlas 的日志级别默认是 INFO排查问题时可以临时调到 DEBUG但记得问题解决后调回来否则日志文件会迅速膨胀。技巧四定期清理 Solr 的旧索引和 HBase 的过期数据Atlas 本身没有自动清理机制长期运行会导致存储膨胀。5.4 常见问题速查表问题现象可能原因排查方向解决方案启动即退出JDK 版本不匹配检查 java -version切换到 JDK 8连接 HBase 超时ZK 地址错误检查 hbase-site.xml修正 atlas-application.propertiesSolr 索引为空Schema 未上传检查 Solr Collection 字段上传 Atlas schema 文件Kafka 消费 lag 高分区数不足检查 Topic 分区数增加分区和消费者线程前端搜索无结果Solr 索引未刷新检查 autoSoftCommit调整 commit 策略内存溢出堆内存不足检查 atlas-env.sh增加 Xmx 参数6. 部署后的持续维护与扩展思路Atlas 部署完成只是第一步后续的维护同样重要。我通常会在部署完成后做几件事一是配置监控把 Atlas 的 JVM 指标、Kafka 消费 lag、HBase 写入延迟接入监控系统二是设置日志轮转避免日志占满磁盘三是定期备份 HBase 中的 Atlas 元数据表以防万一。另外Atlas 的扩展性其实很强。你可以通过自定义 TypeSystem 来定义自己的元数据模型也可以通过编写 Hook 来接入自定义的数据源。这些进阶用法我后续会单独整理但前提是基础部署必须稳固。如果基础环境都不稳定上层功能根本无从谈起。我个人在实际操作中的体会是Atlas 的部署难点不在 Atlas 本身而在于它对周边组件的强依赖。把 HBase、Solr、Kafka 这三个基础打牢Atlas 的安装其实半小时就能搞定。反过来如果这三个组件本身有问题你在 Atlas 上花再多时间也是白搭。所以我的建议永远是先验证依赖再安装主体最后做端到端测试。这个顺序不能乱。
阅读完成 · 觉得有帮助?
咨询建站