apache druid是一个高性能的实时分析数据库。druid 是一种独特类型的数据库, 它结合了来自 olap·分析数据库、时间序列数据库和搜索系统的想法, 可在实时体系结构中实现新的用例。为了建立一个时间序列趋势分析、预测模型和异常检测的框架, 我决定使用德鲁伊。根据要求, 除了实时数据接收外, 德鲁伊还需要基于批处理的数据接收。在阅读了几个博客和文章有关德鲁伊集群的生产环境设置处理 pb 级的数据, 我决定遵循以下体系结构:
- 两个节点作为德鲁伊大师, 运行德鲁伊协调员和霸王的过程。两个节点用于高可用性。
- 两个节点作为德鲁伊查询服务器, 运行德鲁伊经纪人的进程。两个节点用于高可用性和定义两层查询, 即 “热” 和 “_ default _ tier”。此外,路由器在一个节点上处理一个唯一的入口到所有德鲁伊 api 访问。
- 三个节点作为德鲁伊数据服务器, 运行德鲁伊历史和中间件管理器进程。此外,还利用动物园管理员的三个节点来运行德鲁伊历史进程。咖啡因用于查询结果缓存。
- 用于管理德鲁伊电流集群状态的三个动物园管理员节点。
- 用于运行 postgres 以及gravana的德鲁伊元数据数据库节点, 用于可视化德鲁伊集群指标。
- s3 作为德鲁伊深部存储, 也用于作业日志存储。
为什么德鲁伊需要一个可工作的 s3a hadoop 连接器?
- 首先, s3a 连接器是使用 hadoop 的最新连接器。根据amazons3 hadoop wiki,以前的连接器, 即 s3 和 s3n, 现在已弃用。使用 s3a 连接器, 无需显式提供aws _ access _ key 和 aws _ 秘密 _ key.s3a 连接器从 “ec2 iam” 配置文件中确定凭据和角色, 这使得 druid 的公共运行时属性文件更加简单和通用。
- 其次, 即使您不打算在 hadoop 集群上运行druid索引作业, 以便将实木复合地板格式的数据引入德鲁伊, 索引作业也
type: index_hadoop
应该是, 因此需要一个可行的 s3a 连接器
“rel =” nofollow = “_ black” > 实木复合地板扩展名。因为, 就我而言, 数据是实木复合地板格式的, 我需要使它可行。
德鲁伊使用 s3a hadoop 连接器的当前状态
我写这篇文章使用德鲁伊版本 0.12.3。最近, 德鲁伊发布了一个新版本, 但我还没有对它进行评估。
- 如果您尝试使用德鲁伊指数作业规格运行 “index _ hadoop” 作业, 如下所示:
"tuningConfig": {
"type": "hadoop",
"jobProperties": {
"fs.s3a.endpoint": "s3.ca-central-1.amazonaws.com",
"fs.s3.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
"fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem",
"io.compression.codecs": "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec"
}
}
堆栈跟踪 (如下所示) 将出现异常:
Caused by: java.lang.NoSuchMethodError: com.amazonaws.services.s3.transfer.TransferManager.<init>(Lcom/amazonaws/services/s3/AmazonS3;Ljava/util/concurrent/ThreadPoolExecutor;)V
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:287) ~[?:?]
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) ~[?:?]
at org.apache.hadoop.fs.FileSystem.access00(FileSystem.java:94) ~[?:?]
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) ~[?:?]
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) ~[?:?]
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) ~[?:?]
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) ~[?:?]
这是因为在 druid 代码中使用了不兼容版本的hadoop 客户端库和aws-sdk库。可以通过将 hadoop hadoop.compile.version
变量从 “2.7.3” 中2.8.3 值, 或者将 maven pom.xml 文件中的 “aws.sdk.version” 从 “1.10.77” 降级到 “” 的 “值” 来解决此问题。我决定按照第一个选项, 并在碰撞版本后, 重建德鲁伊发行版。
在修复了库的不兼容问题后, 我遇到了与段文件的存储路径相关的另一个问题。由于 druid 遵循 s3n 连接器, 默认情况下, 该 segmentOutputPath
值基于 s3n://
uri而不是 s3a://
。下面是为索引作业生成的示例作业规范。
"ioConfig" : {
"type" : "hadoop",
"inputSpec" : {
"type" : "static",
"paths" : "s3a://experiment-druid/input_data/wikiticker-2015-09-12-sampled.json.gz"
},
"metadataUpdateSpec" : null,
"segmentOutputPath" : "s3n://daas-experiment-druid/deepstorage"
},
根据hadoop索引文档, 我们可以 segmentOutputPath
在 ioconfig
索引作业规范的文件中提供。但是, 我在提供段路径时收到了一个错误。为了解决此问题, 我在 useS3aSchema
druid 的源代码中找到了类S3DataSegmentPusherConfig 集中配置中的属性
druid.storage.useS3aSchema=true
我在使其可行方面面临的一个重要问题是运行时异常, 同时将段推送到 s3 深度存储。下面是执行器的堆栈跟踪:
java.io.IOException: Output Stream closed
at org.apache.hadoop.fs.s3a.S3AOutputStream.checkOpen(S3AOutputStream.java:83) ~[hadoop-aws-2.8.3.jar:?]
at org.apache.hadoop.fs.s3a.S3AOutputStream.flush(S3AOutputStream.java:89) ~[hadoop-aws-2.8.3.jar:?]
at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) ~[?:1.8.0_191]
at java.io.DataOutputStream.flush(DataOutputStream.java:123) ~[?:1.8.0_191]
由于德鲁伊用户的讨论和这个伟大的拉请求, 我能够通过评论声明来解决这个问题 flush
。
使 s3a hadoop 连接器在应用程序中工作
编译上述所有问题的修补程序, 使 s3a hadoop 连接器与德鲁伊可行, 请按照下列步骤操作:
- 在将
hadoop.compile.version
属性值更改为 “2.8.3” 并flush
JobHelper
使用该命令注释出类中的语句后, 重新生成 druid 0.12.3 源代码mvn clean package -DskipTests
分支. druid-hdfs-storage
替换为德鲁伊的 “扩展” 文件夹中新建的工件。hadoop-client
将库复制到德鲁伊的 “hadoop 依赖关系” 文件夹中的 “2.8.3”。
最后, 为了进行测试, 您可以使用在我的 github 存储库中发布的索引作业示例。
快乐德鲁伊探索!