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 存储库中发布的索引作业示例。

快乐德鲁伊探索!

Comments are closed.