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'
