Atlas集成详见:
Atlas的血缘关系描述属于Atlas实体,血缘关系属性实体类型为AtlasBaseTypeDef.ATLAS_TYPE_PROCESS:Process。
创建时指定input,output属性即可。
1、创建血缘
/**
* 元数据客户端实现--同步Atlas元数据
* 主要功能:同步元数据
*/
@Component
public class MetaClient {
......
public AtlasEntity queryAtlasEntity(String guid) {
try {
AtlasEntity.AtlasEntityWithExtInfo entityWithExtInfo = atlasClientV2.getEntityByGuid(guid, true, false);
return entityWithExtInfo.getEntity();
}catch (AtlasServiceException e) {
e.printStackTrace();
}
return null;
}
/**
* 依据DTO创建血缘
* @param lineAgeCreateDTO
*/
public void createLineAge(LineAgeCreateDTO lineAgeCreateDTO) {
MetadataDatabase srcMetadataDatabase = metadataDatabaseService.getByTableEntityId(lineAgeCreateDTO.getSourceGuid());
MetadataDatabase dstMetadataDatabase = metadataDatabaseService.getByTableEntityId(lineAgeCreateDTO.getSourceGuid());
if(srcMetadataDatabase==null || dstMetadataDatabase == null) {
throw new ServiceException("找不到源表所在库和目标表所在库");
}
createLineAge(srcMetadataDatabase.getCatalogName(), lineAgeCreateDTO.getSourceGuid(),lineAgeCreateDTO.getSourceTable(),dstMetadataDatabase.getCatalogName(), lineAgeCreateDTO.getTaregetGuid(),lineAgeCreateDTO.getTargetTable());
}
/**
* 原始参数创建血缘
* @param sourceGuidId
* @param sourceQualifier
* @param targetGuid
* @param targetQualifier
*/
public void createLineAge(String sourceDb,String sourceGuidId,String sourceQualifier,String targetDb,String targetGuid,String targetQualifier) {
if(StringUtils.isEmpty(sourceGuidId)) {
return;
}
if(StringUtils.isEmpty(targetGuid)) {
return;
}
AtlasEntity sourceEntity = queryAtlasEntity(sourceGuidId);
AtlasEntity targetEntity = queryAtlasEntity(targetGuid);
if(sourceEntity==null || targetEntity==null) {
throw new ServiceException("创建血缘关系失败:"+"源或目标不存在");
}
AtlasEntity lineage = new AtlasEntity();
//设置为process类型构建血缘
lineage.setTypeName(AtlasBaseTypeDef.ATLAS_TYPE_PROCESS);
Map<String, Object> attributes = new HashMap<>();
//获取数据源信息,组成qualifiedName
String qualifiedName = sourceDb+"."+sourceQualifier+"-"+targetDb+"."+targetQualifier;
attributes.put("qualifiedName", qualifiedName);
attributes.put("name", sourceQualifier+"-"+targetQualifier);
attributes.put("description", sourceDb+"."+targetQualifier+" 的数据来自 "+ targetDb+"."+sourceQualifier);
attributes.put("inputs", getLineAgeInfo(sourceEntity));
attributes.put("outputs", getLineAgeInfo(targetEntity));
lineage.setAttributes(attributes);
Map<String, String> queryAttributes = new HashMap<>();
queryAttributes.put("qualifiedName", qualifiedName);
try {
//查询是否存在
atlasClientV2.getEntityByAttribute(AtlasBaseTypeDef.ATLAS_TYPE_PROCESS, queryAttributes);
} catch (AtlasServiceException e) {
if(e.getStatus().getStatusCode()==404 || "Not Found".equals(e.getStatus().getReasonPhrase()) ) {
//创建
AtlasEntity.AtlasEntityWithExtInfo extInfo = new AtlasEntity.AtlasEntityWithExtInfo(lineage);
try {
atlasClientV2.createEntity(extInfo);
}catch (AtlasServiceException e2) {
e.printStackTrace();
throw new ServiceException("未知错误:"+e2.getMessage());
}
}else {
e.printStackTrace();
throw new ServiceException("未知错误:"+e.getMessage());
}
}
}
//构建inputs和outputs
private static List<Map<String, String>> getLineAgeInfo(AtlasEntity entity) {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();
map.put("guid", entity.getGuid());
map.put("typeName", entity.getTypeName());
list.add(map);
return list;
}
}
2、接口调用
@Operation( summary = "生成atlas血缘元数据" )
@PostMapping({"/createLineAge"})
public ResponseJson createLineAge(@RequestBody LineAgeCreateDTO lineAgeCreateDTO) {
try {
metaClient.createLineAge(lineAgeCreateDTO);
return ResponseJson.success("同步成功");
}catch (Exception e) {
e.printStackTrace();
return ResponseJson.success("同步失败!");
}
}