2019年的一篇旧文,内容中涉及版本相对陈旧,分享出来希望对大家有所帮助。
1. Atlas简介
简单说明一下元数据管理的重要性,做数仓的时候,自然就会有很多报表,当你有几百个报表,几千张表的时候,现在有个需求需要修改一个表,然后有人问你,修改这个表会影响哪些报表? 如果你仅仅凭借记忆是完全不可行的,必须要有一个平台来管理数据的数据。
知道了元数据的意义,那么从技术角度要做到什么程度才算是一个好的元数据管理呢?从我个人的认知,表的元数据必须做到字段级别,也就是说修改了一个字段,你查询元数据 系统就知道,这个字段会影响谁。这个元数据属于数据库元数据,通常来说是HIVE,HBASE或者传统数据库,除此之外,还有报表的元数据,一个报表一般会用到3-4个SQL,大部分是图形展示了,也有表格,那么再深入的问一个问题,如果我修改了某个表的一个字段,请问会影响哪个报表的哪个图表?如果你能通过元数据系统回答这个问题,那么就算做的还不错了。
Apache Atlas就属于元数据管理系统,整个原理是通过在HIVE/HBASE等组件建立HOOK,如果你不知道什么是HOOK,去谷歌一下,所有在HIVE/HBASE的操作都会通过HOOK发送到KAFKA,然后atlas后台会去接收KAFKA的数据,并分析处理,最后输出到HBASE,前段通过SOLR进行查询展示。atlas可以分到字段级别的血缘关系。
2. 编译安装
Atlas需要根据集群的版本和依赖进行手动编译,以下内容主要依据CDH发行版本的5.13.3,Atlas 1.1.0版本为基础进行编译。
2.1 软件版本
- CDH 版本:CDH5.13.3(hadoop2.6.0)
- Atlas 1.1.0
- JDK 1.8.0_111
- CentOS-6.8-x86_64
- Solr5.5.1(CDH中安装的组件为4版本,需要独立部署)
2.2 编译环境
- Maven3.5.0 及以上版本
- JDK8及以上版本(和上面的相同)
2.3 环境配置及检查
2.3.1 Java环境变量
2.3.2 Maven环境变量
Maven3.5.4版本的下载地址,apache-maven-3.5.4-bin.tar.gz
2.4 编译Atlas 1.1.0
编译过程使用hadoop用户
2.4.1 下载源码
使用清华镜像
apache-atlas-1.1.0-sources.tar.gz
使用wget下载到服务器
解压文件
tar -zxvf apache-atlas-1.1.0-sources.tar.gz
2.4.2 编译前需对部分源文件进行修改,由于环境原因部分会报错
进入解压目录apache-atlas-sources-1.1.0
修改文件
apache-atlas-sources-1.1.0/common/src/main/java/org/apache/atlas/service/Services.java
删除注解
@Profile("!test")
启动服务的脚本中并没有指定运行环境,编译过程中已经将生产环境配置写入的配置文件中,这个配置会导致服务并未完全启动,服务错误,所以我的处理方案是修改一下代码,直接将该注解删除
2.4.3 编译打包
cd apache-atlas-sources-1.1.0/
export MAVEN_OPTS="-Xms2g -Xmx2g"
mvn clean -DskipTests package -Pdist
编译完成后,我们需要的文件在目录apache-atlas-sources-1.1.0/distro/target/apache-atlas-1.1.0-bin
下面
将apache-atlas-1.1.0
拷贝到部署服务的目录下,本文档拷贝到/data2/
目录下面,后续环节介绍配置部分,我们的配置环境是基于CDH版本的集群,已经有HBase和Kafka可以使用,不需要单独搭建,CDH带的Solr版本较低,需要独立配置,下面首先解决Solr的部署。
2.5 部署solr5.5.1
2.5.1 下载solr程序包
下载链接如下:solr-5.5.1.tgz
2.5.2 解压文件部署
上传到/data2目录
tar -zxvf solr-5.5.1.tgz
进入文件目录,修改solr配置
$SOLR_HOME=/data2/solr-5.5.1
cd solr-5.5.1
修改solr.in.sh
配置文件,位于:$SOLR_HOME/bin/
配置solr zookeeper路径:
ZK_HOST="dmp5:2181,dmp6:2181,dmp7:2181/solr"
dmp5:2181,dmp6:2181,dmp7:2181
为已有的zookeeper集群
独立配置solr和集群自带的solr端口可能冲突,配置solr 端口:
SOLR_PORT=9838
修改内容如下:
在zookeeper中创建solr目录
登录到dmp5的zookeeper的client,执行创建命令
create /solr "solr"
2.5.3 启动solr
注意不要设置SOLR_HOME
的环境变量,这个变量有默认配置,修改后会导致启动失败
export SOLR_DIR=/data2/solr-5.5.1
$SOLR_DIR/bin/solr start
出现如下提示,启动完成
Solr部署完成
2.5.4 创建atlas所需要的索引文件
export SOLR_DIR=/data2/solr-5.5.1
export SOLR_CONF=/data2/apache-atlas-1.1.0/conf/solr
$SOLR_DIR/bin/solr create -c vertex_index -d $SOLR_CONF -shards 1
$SOLR_DIR/bin/solr create -c edge_index -d $SOLR_CONF -shards 1
$SOLR_DIR/bin/solr create -c fulltext_index -d $SOLR_CONF -shards 1
2.5.5 solr常用命令
启动:$SOLR_DIR/bin/solr start
停止:$SOLR_DIR/bin/solr stop
重启:$SOLR_DIR/bin/solr restart
2.6 部署atlas
进入到/data2/apache-atlas-1.1.0
ATLAS_HOME=/data2/apache-atlas-1.1.0
2.6.1 配置Solr
vim conf/atlas-application.properties
修改为
# Graph Search Index
atlas.graph.index.search.backend=solr
#Solr
#Solr cloud mode properties
atlas.graph.index.search.solr.mode=cloud
atlas.graph.index.search.solr.zookeeper-url=dmp5:2181/solr,dmp6:2181/solr,dmp7:2181/solr
atlas.graph.index.search.solr.zookeeper-connect-timeout=60000
atlas.graph.index.search.solr.zookeeper-session-timeout=60000
atlas.graph.index.search.solr.wait-searcher=true
2.6.2 配置kafka
vim conf/atlas-application.properties
修改配置为如下
修改内容
atlas.notification.embedded=false
atlas.kafka.zookeeper.connect=dmp5:2181,dmp6:2181,dmp7:2181
atlas.kafka.bootstrap.servers=dmp5:9092,dmp6:9092,dmp7:9092
在kafka中创建atlas使用的topic
kafka-topics --create --zookeeper dmp5:2181 --replication-factor 3 --partitions 3 --topic ATLAS_HOOK
kafka-topics --create --zookeeper dmp5:2181 --replication-factor 3 --partitions 3 --topic ATLAS_ENTITIES
2.6.3 Hbase配置
修改为,hostname为zookeeper的hostname
#Hbase
#For standalone mode , specify localhost
#for distributed mode, specify zookeeper quorum here
atlas.graph.storage.hostname=dmp5,dmp6,dmp7
atlas.graph.storage.hbase.regions-per-server=1
atlas.graph.storage.lock.wait-time=10000
修改为
配置为独立部署的hbase
######### Entity Audit Configs #########
atlas.audit.hbase.tablename=apache_atlas_entity_audit
atlas.audit.zookeeper.session.timeout.ms=1000
atlas.audit.hbase.zookeeper.quorum=dmp5:2181,dmp6:2181,dmp7:2181
配置hbase conf目录的环境变量
vim conf/atlas-env.sh
export HBASE_CONF_DIR=/etc/hbase/conf
2.6.4 首次启动初始化服务
vim conf/atlas-application.properties
设置atlas.server.run.setup.on.start=true
执行bin/atlas_start.py开始初始化,过程大约持续5分钟左右完成,请耐心等待
重要:完成初始化后面将上述参数值在修改为false
atlas.server.run.setup.on.start=false
注意python版本需要为2,如果升级成了3,需要指定python2的命令运行
2.6.5 启动atlas服务
启动服务器bin/atlas_start.py
访问21000端口
登录系统默认用户名和密码 admin/admin
2.7 Hive Hook部署
2.7.1 配置Hive Hook
修改atlas-application.properties
相关配置
配置文件位于:$ATLAS_HOME/conf/atlas-application.properties
添加如下配置:
######### Hive Hook Configs #######
atlas.hook.hive.synchronous=false
atlas.hook.hive.numRetries=3
atlas.hook.hive.queueSize=10000
atlas.cluster.name=primary
将conf/atlas-application.properties
配置文件加入到atlas-plugin-classloader-1.0.0.jar
中,这项配置对Hive加载Hook jar包生效
命令:
export ATLAS_HOME=/data2/apache-atlas-1.1.0
cd $ATLAS_HOME/conf/
zip -u $ATLAS_HOME/hook/hive/atlas-plugin-classloader-1.1.0.jar atlas-application.properties
# 查看是否已经成功将文件压入到jar包中
jar -vtf $ATLAS_HOME/hook/hive/atlas-plugin-classloader-1.1.0.jar
备注:这个配置不能参照官网,将配置文件考到hive的conf中。参考官网的做法一直读取不到atlas-application.properties配置文件,看了源码发现是在classpath读取的这个配置文件,所以将它压到jar里面
将apache atlas的hook jar包拷贝到所有hiveserver2和client的服务器中
部署路径为:
ATLAS_HOME=/data2/apache-atlas-1.0.0
拷贝jar包连接到HIVE_AUX_JARS_PATH的配置目录下,拷贝的atlas-plugin-classloader-1.1.0.jar
一定是执行过上一个操作,包含配置文件的jar包
HIVE_AUX_JARS_PATH
这里使用/usr/lib/hadoop/hive
cd /usr/lib/hadoop/hive
cp /data2/apache-atlas-1.1.0/hook/hive/atlas-plugin-classloader-1.1.0.jar ./
cp /data2/apache-atlas-1.1.0/hook/hive/hive-bridge-shim-1.1.0.jar ./
cp -r /data2/apache-atlas-1.1.0/hook/hive/atlas-hive-plugin-impl ./
# atlas-hive-plugin-impl中的部分依赖jar包和hive classpath中的jar包有冲突,保留必要的文件
rm atlas-hive-plugin-impl/commons-configuration-1.10.jar;
rm atlas-hive-plugin-impl/hbase-common-1.1.2.jar;
rm atlas-hive-plugin-impl/hbase-server-1.1.2.jar;
rm atlas-hive-plugin-impl/jackson-annotations-2.9.6.jar;
rm atlas-hive-plugin-impl/jackson-core-2.9.6.jar;
rm atlas-hive-plugin-impl/jackson-databind-2.9.6.jar;
rm atlas-hive-plugin-impl/jackson-jaxrs-base-2.9.6.jar;
rm atlas-hive-plugin-impl/jackson-jaxrs-json-provider-2.9.6.jar;
rm atlas-hive-plugin-impl/jackson-module-jaxb-annotations-2.9.6.jar;
rm atlas-hive-plugin-impl/jersey-json-1.9.jar;
rm atlas-hive-plugin-impl/jersey-multipart-1.19.jar;
rm atlas-hive-plugin-impl/jsr311-api-1.1.jar
在cm中修改hiveserver2的配置
hive.exec.post.hooks=org.apache.atlas.hive.hook.HiveHook
Hive Service Advanced Configuration Snippet (Safety Valve) for hive-site.xml
修改hive客户端配置,hive shell启动的任务可以捕获
Hive Client Advanced Configuration Snippet (Safety Valve) for hive-site.xml
修改HIVE_AUX_JARS_PATH配置
复制hive hook的jar包到hive客户端和服务器的节点上,通过脚本执行jar的复制
在/data2/apache-atlas-1.1.0
下创建shell脚本文件deploy_atlas_hive_hook.sh
#! /bin/bash
# 将atlas hive hook 需要的jar文件拷贝到集群节点上,使用通用目录保存文件,
# 通过创建连接方式部署到cdh的hive aux lib目录中,方便后期维护和更新
local_lib_dir=/usr/lib/hadoop
hive_hook_lib=${local_lib_dir}/hive
run_dir=/data2/apache-atlas-1.1.0
#run_dir=/data/apache-atlas-1.1.0
function copy_file()
{
host_name=$1
scp_file=$2
echo "开始拷贝到远程节点hive hook jar文件"
if [ "$scp_file" = 'jar' ];then
scp -r ${run_dir}/hook/hive/* ${host_name}:${hive_hook_lib}/
# 精简jar包,避免冲突
ssh -tt "${host_name}" "rm ${hive_hook_lib}/atlas-hive-plugin-impl/commons-configuration-1.10.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/hbase-common-1.1.2.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/hbase-server-1.1.2.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-annotations-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-core-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-databind-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-jaxrs-base-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-jaxrs-json-provider-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jackson-module-jaxb-annotations-2.9.6.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jersey-json-1.9.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jersey-multipart-1.19.jar;
rm ${hive_hook_lib}/atlas-hive-plugin-impl/jsr311-api-1.1.jar;
"
fi
echo "完成拷贝到远程节点hive hook jar文件"
}
function install_jar()
{
echo "开始安装hive hook jar文件"
cur_host=$1
copy_file "${cur_host}" jar
echo "完成安装hive hook jar文件"
}
function uninstall_jar()
{
echo "开始卸载hive hook jar文件"
cur_host=$1
ssh -tt "${cur_host}" "rm -rvf ${hive_hook_lib}/atlas-hive-plugin-impl;
rm ${hive_hook_lib}/atlas-plugin-classloader-1.1.0.jar;
rm ${hive_hook_lib}/hive-bridge-shim-1.1.0.jar
"
echo "完成卸载hive hook jar文件"
}
cmd=$1
to_host=$2
if [ $cmd = 'install_jar' ] && [ -n "$to_host" ];then
install_jar "$to_host"
exit 0
elif [ $cmd = 'uninstall_jar' ] && [ -n "$to_host" ];then
uninstall_jar "$to_host"
exit 0
fi
map_file="${run_dir}/node-ip"
ips=`grep -o "[0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}[.][0-9]\{1,3\}" ${map_file}`
for ip in ${ips}
do
if [ $cmd = 'install_jar' ] && [ -n "$ip" ];then
echo "================================================================="
echo "start install node(${ip})"
install_jar "$ip"
echo "install node(${ip}) done!"
elif [ $cmd = 'uninstall_jar' ] && [ -n "$ip" ];then
echo "================================================================="
echo "start uninstall node(${ip})"
uninstall_jar "$ip"
echo "uninstall node(${ip}) done!"
fi
done
需要部署jar包的服务器列表文件node-ip
192.168.1.62
192.168.1.63
192.168.1.64
192.168.1.65
192.168.1.66
192.168.1.67
192.168.1.68
通过运行命令部署jar包
sh deploy_atlas_hive_hook.sh install_jar
通过运行命令删除jar包
sh deploy_atlas_hive_hook.sh uninstall_jar
通过CM重新部署所有hive客户端配置,重启HiveServer
2.7.2 Hive元数据导入
只要在初始化的时候导入一次即可,后期的变更hive hook 会自动采集。
import的时候依赖这个配置文件
将atlas-application.properties
复制到 /etc/hive/conf
中,这项配置是对import初始化的时候生效,这个和上一节中将配置文件加载到jar包中的作用是不同的,都需要操作。
cd /etc/hive/conf
ln -s $ATLAS_HOME/conf/atlas-application.properties atlas-application.properties
由于重新部署hive客户端配置会删除/etc/hive/conf
目录,所以需要再次执行导入命令的时候,需要检查该配置文件是否存在。
声明HIVE_HOME执行导入脚本:
export HIVE_HOME="/opt/cloudera/parcels/CDH/lib/hive"
export HIVE_CONF_DIR="/etc/hive/conf"
hive hook目录下的 jersey-json-1.19.jar 这个包太老了,换成1.9的版本
并且还缺少部分jar包文件,将server中的jar建立连接到该目录下
cd hook/hive/atlas-hive-plugin-impl/
rm jersey-json-1.19.jar
ln -s ../../../server/webapp/atlas/WEB-INF/lib/jersey-json-1.9.jar jersey-json-1.9.jar
ln -s ../../../server/webapp/atlas/WEB-INF/lib/jackson-jaxrs-json-provider-2.9.6.jar jackson-jaxrs-json-provider-2.9.6.jar
ln -s ../../../server/webapp/atlas/WEB-INF/lib/jackson-jaxrs-base-2.9.6.jar jackson-jaxrs-base-2.9.6.jar
ln -s ../../../server/webapp/atlas/WEB-INF/lib/jackson-module-jaxb-annotations-2.9.6.jar jackson-module-jaxb-annotations-2.9.6.jar
执行导入
$ATLAS_HOME/bin/import-hive.sh
在交互界面中输入用户名和密码,与ui登录的用户名密码相同
若导入失败可在,可查看日志:$ATALS_HOME/logs/import-hive.log
导入成功
2.8 重新初始化
如果在部署的过程中,出现问题需要重新初始化数据
2.8.1 删除solr内建立的索引数据和zookeeper存储的目录
export SOLR_DIR=/data2/solr-5.5.1
export SOLR_CONF=/data2/apache-atlas-1.1.0/conf/solr
$SOLR_DIR/bin/solr delete -c vertex_index
$SOLR_DIR/bin/solr delete -c edge_index
$SOLR_DIR/bin/solr delete -c fulltext_index
删除zookeeper内的数据
rmr /solr
然后重新创建目录和索引
2.8.2 删除Hbase中的表
Hbase shell
hbase(main)> disable 'apache_atlas_janus'
hbase(main)> drop 'apache_atlas_janus'
hbase(main)> disable 'apache_atlas_entity_audit'
hbase(main)> drop 'apache_atlas_entity_audit'