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” 并flushJobHelper使用该命令注释出类中的语句后, 重新生成 druid 0.12.3 源代码mvn clean package -DskipTests分支.
- druid-hdfs-storage替换为德鲁伊的 “扩展” 文件夹中新建的工件。
- hadoop-client将库复制到德鲁伊的 “hadoop 依赖关系” 文件夹中的 “2.8.3”。
最后, 为了进行测试, 您可以使用在我的 github 存储库中发布的索引作业示例。
快乐德鲁伊探索!
