EMR Druid 探索(二)

简介: EMR Druid 探索(二) EMR Druid 上文介绍了 Druid 的特点、使用场景以及性能。EMR 在 3.11.0 引入了 Druid,并专门推出了一种新的集群类型:Druid 集群。在具体使用时,Druid 集群可以与 Hadoop 集群结合,以 HDFS 集群作为 deep storage 的存储,以 YARN 作为批量索引的计算引擎。

EMR Druid 探索(二)

EMR Druid

上文介绍了 Druid 的特点、使用场景以及性能。EMR 在 3.11.0 引入了 Druid,并专门推出了一种新的集群类型:Druid 集群。在具体使用时,Druid 集群可以与 Hadoop 集群结合,以 HDFS 集群作为 deep storage 的存储,以 YARN 作为批量索引的计算引擎。Druid 集群亦可以与 Kafka 集群结合,将 Kafka 作为实时数据的来源。用户亦可用 Druid 摄取来自于 Spark Streaming 或者 Storm 的实时数据。

EMR 在 Druid 基础上也做了一些很有用的扩展,比如,

  • 支持 deep storage 到 OSS(一个很有用的功能,不必担心 HDFS 集群变动带来的数据危险),以及将 OSS 文件作为批量索引的数据来源
  • 支持 metadata 到 RDS,跟上一条结合在一起,Druid 集群升级就会变得非常方便
  • 在用户侧 EMR Druid 集成了 Superset 这一 BI 工具,可以方便地查询 Druid 数据,而不用写复杂的 DSL
  • 方便地扩容、缩容(针对 task 节点)
  • 丰富的指标监控以及告警规则、坏节点迁移,提供了高可靠的运维保障
  • 支持高安全、HA 等

示例

下面的流程展示了如何创建一个 Druid 集群,并进行批量索引。

首先,选择 Druid 集群类型。Druid 集群有几个必选组件,此外 HDFS、YARN 作为可选组件。在这里我们建议将这两个组件选上,一方面,Druid deep storage 到 OSS 的功能是借助于 HDFS 实现的,如果选择了 HDFS 用户不用做任何配置,如果没有选择的话,用户需要自己添加 HDFS 的配置文件,另一方面,选择这两个组件可以方便的在 Druid 集群内部进行批量索引测试,如果不需要,可以选择关闭他们。

1_create

下一步是选择节点类型和机器配置。Druid 本身不是一个纯内存计算系统,但是仍然会使用大量的内存。Druid 对内存的使用有两方面,一是计算过程中的数据,二是索引文件的 mapping。如果您的数据量很大,建议您选择大内存机型。8g 内存机型仅推荐作为测试机型。对于 core 节点,如果您的数据量很大,建议选择 d1 机型,这种机器本身配有多个本地磁盘,容量大,速度快,Druid 可以缓存更多 segments 到本地盘,而且 segments 加载速度会更快。

2_choosevm

选择好机器,点击下一步,填写集群名称,

3_name

再下一步、确认,等待一段时间,集群就创建好了。进入集群管理页面查看一下,

4_druid

下面我们将展示一个批量索引,并将索引的结果存储到 OSS 上。为此,首先在 OSS 上(用同一个账户)创建一个 oss://bucket/path,比如 “oss://emr-druid-cn-hangzhou/segments/”。之后,在 Druid 的配置页面,找到 druid.storage.storageDirectory,修改之。注意由于 OSS 访问是借助了 hdfs 的底层,因此 druid.storage.type 仍然为 “hdfs”,如图。

5_oss

依次点“保存”、“部署配置文件到主机”、“重启所有组件”。

组件重启成功之后,ssh 到 emr-header-1 节点,进入 druid 的安装目录 “/usr/lib/druid-current”,其下带有一份 quickstart 的演示示例。进入该目录,首先解压 “wikiticker-2015-09-12-sampled.json.gz”:

gunzip wikiticker-2015-09-12-sampled.json.gz

之后将该文件上传至 HDFS 的一个路径下面,这里我们选择 “/” 目录:

hdfs dfs -put wikiticker-2015-09-12-sampled.json /

也可以将该文件放置于某一 OSS 路径下面,EMR Druid 也是支持的。编辑 quickstart 下面的 wikiticker-index.json,其内容如下:

{
   
    "type" : "index_hadoop",
    "spec" : {
   
        "ioConfig" : {
   
            "type" : "hadoop",
            "inputSpec" : {
   
                "type" : "static",
                "paths" : "/wikiticker-2015-09-16-sampled.json"
            }
        },
        "dataSchema" : {
   
            "dataSource" : "wikiticker",
            "granularitySpec" : {
   
                "type" : "uniform",
                "segmentGranularity" : "day",
                "queryGranularity" : "none",
                "intervals" : ["2015-09-12/2015-09-13"]
            },
            "parser" : {
   
                "type" : "hadoopyString",
                "parseSpec" : {
   
                    "format" : "json",
                    "dimensionsSpec" : {
   
                        "dimensions" : [
                            "channel",
                            "cityName",
                            "comment",
                            "countryIsoCode",
                            "countryName",
                            "isAnonymous",
                            "isMinor",
                            "isNew",
                            "isRobot",
                            "isUnpatrolled",
                            "metroCode",
                            "namespace",
                            "page",
                            "regionIsoCode",
                            "regionName",
                            "user"
                        ]
                    },
                    "timestampSpec" : {
   
                        "format" : "auto",
                        "column" : "time"
                    }
                }
            },
            "metricsSpec" : [
                {
   
                    "name" : "count",
                    "type" : "count"
                },
                {
   
                    "name" : "added",
                    "type" : "longSum",
                    "fieldName" : "added"
                },
                {
   
                    "name" : "deleted",
                    "type" : "longSum",
                    "fieldName" : "deleted"
                },
                {
   
                    "name" : "delta",
                    "type" : "longSum",
                    "fieldName" : "delta"
                },
                {
   
                    "name" : "user_unique",
                    "type" : "hyperUnique",
                    "fieldName" : "user"
                }
            ]
        },
        "tuningConfig" : {
   
            "type" : "hadoop",
            "partitionsSpec" : {
   
                "type" : "hashed",
                "targetPartitionSize" : 5000000
            },
            "jobProperties" : {
   
                "mapreduce.job.classloader": "true"
            }
        }
    },
    "hadoopDependencyCoordinates": ["org.apache.hadoop:hadoop-client:2.7.2"]
}

注意索引文件路径为 HDFS(或 OSS)相应数据文件的路径,tuningConfig 里添加 "mapreduce.job.classloader": "true" 的 jobProperties,另外最后一行指定 Hadoop 版本为 2.7.2(EMR Hadoop 版本)。

运行如下命令提交索引作业

curl -XPOST -H 'Content-Type:application/json' -d @quickstart/wikiticker-index.json http://emr-header-1:18090/druid/indexer/v1/task

这时作业就被提交到了 Druid 集群,确切地说是 Overlord 节点。Overlord 节点会远程通知 Middlemanager 节点启动索引 task。该 task 依据索引类型做出处理,由于这里索引类型为 “index_hadoop”,该 task 会生成相应的 job 并提交到 YARN 执行。相应的执行情况可以通过页面查看:

首先打通到 emr-header-1 的 ssh 隧道

ssh -N -D 8157 root@<ip_of_emr-header-1>

然后启动设置了 proxy 的浏览器,proxy 指向 8157 端口,以 chrome 为例

open -n /Applications/Google\ Chrome.app --args --proxy-server="socks5://localhost:8157" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost" --user-data-dir=/tmp/

然后在地址栏输入“http://emr-header-1:18090/console.html,就能够看到相应的作业了,

6_overlord

同时打开 http://emr-header-1:8088/cluster/apps 能够看到相应的 Hadoop 作业:

7_hadoop

等待 Overlord 页面上显示索引成功,就能在 OSS 看到生成了相应的索引文件

8_ossdeep

运行一下查询命令(查询语句在 quickstart/wikiticker-top-pages.json)

curl -XPOST -H 'Content-Type:application/json' -d @quickstart/wikiticker-top-pages.json 'http://emr-header-1:18082/druid/v2/?pretty'

返回结果

[ {
   
  "timestamp" : "2015-09-12T00:46:58.771Z",
  "result" : [ {
   
    "edits" : 33,
    "page" : "Wikipedia:Vandalismusmeldung"
  }, {
   
    "edits" : 28,
    "page" : "User:Cyde/List of candidates for speedy deletion/Subpage"
  }, {
   
    "edits" : 27,
    "page" : "Jeremy Corbyn"
  }, {
   
    "edits" : 21,
    "page" : "Wikipedia:Administrators' noticeboard/Incidents"
  }, {
   
    "edits" : 20,
    "page" : "Flavia Pennetta"
  }, {
   
    "edits" : 18,
    "page" : "Total Drama Presents: The Ridonculous Race"
  },...
]

说明

  1. 上述示例中我们用到了 Druid 安装包自带的示例。事实上由于 Druid 接口均为 rest 接口,你可以在任何一台能够连接到 Druid 集群的机器上运行命令;
  2. Druid 的 rest api 使用起来有诸多不便,幸运的是 Druid 有对 SQL 的支持,虽然还不支持全部标准 SQL,但也足以应付多数场景了。EMR Druid 集成了 Superset 工具,可以方便的使用该工具对 Druid 数据进行查询和管理,具体使用方式见这里
  3. 实际应用中,Druid 更多的使用流的方式索引数据,如果要求数据不丢失,且只被消费一次,通常是流+批的形式。流的方式先摄入数据,保存一份批的数据晚上再处理一遍,确保数据不丢。如果数据要求不是很高,批可以不用。具体流的使用方式参见 [EMR 文档]、Druid 官方文档或者 Tranquility 官方文档;
  4. 掌握必要的排错技巧是必要的,druid 索引排错指南见这里
目录
相关文章
|
19天前
|
人工智能 缓存 前端开发
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
13115 84
DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
|
7天前
|
人工智能 自然语言处理 安全
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
|
2天前
|
缓存 人工智能 API
阿里云Qwen3.8‑Flash完整能力解析:模型特性、API调用实操与计费规则深度拆解
在AI应用快速落地的当下,开发者与企业选型大模型API,不再只单纯关注评测榜单分数,推理速度、上下文长度、多模态能力、工具调用稳定性以及实际调用成本,共同决定项目能否平稳上线。Qwen3.8‑Flash作为新一代多模态混合专家模型,主打高性能推理与低成本开销,面向编程开发、智能Agent工作流、超长文档解析、图文混合理解等高频场景,提供托管API服务,权重同时开放可供本地部署,兼容主流接口协议,能够无缝接入各类开发工具链。很多开发者在接入过程中,容易混淆普通按量Token计费、缓存计费、各类订阅计划之间的差异,造成实际账单超出预估。本文从模型底层架构、核心功能能力、适用场景、API调用实操、完
701 0
|
12天前
|
Web App开发 人工智能 API
16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
1736 4
|
13天前
|
人工智能 Java BI
【AI】DeepSeek Harness 安装、运行、管理插件
本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
1920 1
|
人工智能 JavaScript 开发工具
DeepSeek Harness 本地安装与使用指南
DeepSeek Harness(DSH)是DeepSeek AI开源的Agent运行框架,支持本地文件操作、命令执行与工具调用。基于Cordis插件架构,具备高扩展性与强可控性,适合开发者搭建可控Agent环境或开展模型基准测试。当前为开发者预览版,需Node.js环境,推荐先用`npx @deepseek-ai/dsh web`快速体验。
5156 0
|
15天前
|
人工智能 JavaScript 测试技术
保姆级教程:DeepSeek Harness从安装到跑通测试,30分钟上手
DeepSeek Harness是DeepSeek开源的AI Agent运行时,主打“一行命令安装、5分钟跑通”。它让模型真正动手干活——读代码、跑测试、分析失败、生成修复方案。本文手把手教你30分钟从零上手,覆盖安装、配置、实测及避坑指南,助你快速掌握下一代AI编程范式。
|
8天前
|
人工智能 Linux iOS开发
Ollama使用教程:Ollama官网下载、Ollama本地部署大模型(2026最新)
Ollama 是一款免费开源的本地大模型运行工具,支持在 Windows/macOS/Linux 上离线运行 Qwen、DeepSeek、Llama 等主流开源模型,数据不出本机、隐私安全。提供 OpenAI 兼容 API,命令行一键拉取/运行/管理模型,无需联网,无调用限制,是开发者与 AI 爱好者部署本地 AI 助手的理想选择。(239 字)
|
14天前
|
人工智能 JavaScript 测试技术
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!
DeepSeek Harness是DeepSeek推出的开源Agent运行框架,秉持“一切皆插件”理念,支持模型、工具、技能、工作流等全模块自由替换与扩展。其核心Cordis内核实现动态插件管理,赋能Agent自进化。已成GitHub史上增速最快开源项目(15w+ Star),标志着国内大模型从拼价格转向重架构与生态的新拐点。
1351 6
从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!

热门文章

最新文章