Storm Druid Bolt实现

性能优化的本质:从线程模型与数据流拆解系统瓶颈 在分布式系统中,性能问题往往不是由框架本身导致,而是源于对数据流动本质和线程执行机制的误判。理解‘数据如何被抽取、处理、落库’这一基础链路,比熟记Storm参数或RocketMQ配置更为关键;掌握线程生命周期、连接池竞争、IO与CPU密集型任务的调度差异,则是定位阻塞、上下文切换、资源争用等真实瓶颈的核心能力。本文以真实生产案例切入,聚焦Java服务中线程模型重构、连接池解耦、异步缓冲设计等工程实践,揭示如何通过日志三维分析(事件-时间-线程)、物理动作拆解(抽水→过滤→存池)和可追踪线程命名等方法,将模糊 阅读详情

原

Storm Druid Bolt实现:

2018年04月10日 15:00:24

阅读数:135

Storm-Druid源码地址为:https://github.com/apache/storm/tree/master/external/storm-druid 
在Storm与Druid结合; 
需要在pom.xml文件中引入

<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-druid -->
<dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-druid</artifactId>
    <version>1.1.2</version>
</dependency>

举例代码如下: 
SampleDruidBoltTopology创建Topology结构,其中可以直接使用storm-druid扩展模块中的DruidBeamBolt组件,在本代码中通过创建Beam已经完成了启动配置的生成.不需要再加载json启动配置了.

public class SampleDruidBoltTopology {

    public static void main(String[] args) throws Exception {
        if(args.length == 0) {
          throw new IllegalArgumentException("There should be at least one argument. Run as `SampleDruidBoltTopology <zk-url>`");
        }

        TopologyBuilder topologyBuilder = new TopologyBuilder();

        topologyBuilder.setSpout("event-gen", new SimpleSpout(), 5);
        DruidBeamFactory druidBeamFactory = new SampleDruidBeamFactoryImpl(new HashMap<String, Object>());
        DruidConfig.Builder builder = DruidConfig.newBuilder().discardStreamId(DruidConfig.DEFAULT_DISCARD_STREAM_ID);
        ITupleDruidEventMapper<Map<String, Object>> eventMapper = new TupleDruidEventMapper<>(TupleDruidEventMapper.DEFAULT_FIELD_NAME);
        DruidBeamBolt<Map<String, Object>> druidBolt = new DruidBeamBolt<Map<String, Object>>(druidBeamFactory, eventMapper, builder);
        topologyBuilder.setBolt("druid-bolt", druidBolt).shuffleGrouping("event-gen");
        topologyBuilder.setBolt("printer-bolt", new PrinterBolt()).shuffleGrouping("druid-bolt" , DruidConfig.DEFAULT_DISCARD_STREAM_ID);

        Config conf = new Config();
        conf.setDebug(true);
        conf.put("druid.tranquility.zk.connect", args[0]);

        if (args.length > 1) {
            conf.setNumWorkers(3);

            StormSubmitter.submitTopologyWithProgressBar(args[1], conf, topologyBuilder.createTopology());
        } else {
            conf.setMaxTaskParallelism(3);

            try (LocalCluster cluster = new LocalCluster();
                 LocalTopology topo = cluster.submitTopology("druid-test", conf, topologyBuilder.createTopology());) {
                Thread.sleep(30000);
            }
            System.exit(0);
        }
    }

    private static class PrinterBolt extends BaseBasicBolt {

        @Override
        public void execute(Tuple tuple, BasicOutputCollector collector) {
            System.out.println(tuple);
        }

        @Override
        public void declareOutputFields(OutputFieldsDeclarer ofd) {
        }

    }

}

SampleDruidBeamFactoryImpl类需要实现DruidBeamFactory主要实现Druid的底层ApI来灵活配置启动任务的配置

public class SampleDruidBeamFactoryImpl implements DruidBeamFactory<Map<String, Object>> {
    Map<String, Object> factoryConf = null;


    public SampleDruidBeamFactoryImpl(Map<String, Object> factoryConf) {
        this.factoryConf = factoryConf; // This can be used to pass config values
    }

    @Override
    public Beam<Map<String, Object>> makeBeam(Map<?, ?> conf, IMetricsContext metrics) {


        final String indexService = "druid/overlord"; // Your overlord's druid.service
        final String discoveryPath = "/druid/discovery"; // Your overlord's druid.discovery.curator.path
        final String dataSource = "test";
        final List<String> dimensions = ImmutableList.of("publisher", "advertiser");
        List<AggregatorFactory> aggregator = ImmutableList.<AggregatorFactory>of(
                new CountAggregatorFactory(
                        "click"
                )
        );
        // Tranquility needs to be able to extract timestamps from your object type (in this case, Map<String, Object>).
        final Timestamper<Map<String, Object>> timestamper = new Timestamper<Map<String, Object>>()
        {
            @Override
            public DateTime timestamp(Map<String, Object> theMap)
            {
                return new DateTime(theMap.get("timestamp"));
            }
        };

        // Tranquility uses ZooKeeper (through Curator) for coordination.
        final CuratorFramework curator = CuratorFrameworkFactory
                .builder()
                .connectString((String)conf.get("druid.tranquility.zk.connect")) // we can use Storm conf to get config values
                .retryPolicy(new ExponentialBackoffRetry(1000, 20, 30000))
                .build();
        curator.start();

        // The JSON serialization of your object must have a timestamp field in a format that Druid understands. By default,
        // Druid expects the field to be called "timestamp" and to be an ISO8601 timestamp.
        final TimestampSpec timestampSpec = new TimestampSpec("timestamp", "auto", null);

        // Tranquility needs to be able to serialize your object type to JSON for transmission to Druid. By default this is
        // done with Jackson. If you want to provide an alternate serializer, you can provide your own via ```.objectWriter(...)```.
        // In this case, we won't provide one, so we're just using Jackson.
        final Beam<Map<String, Object>> beam = DruidBeams
                .builder(timestamper)
                .curator(curator)
                .discoveryPath(discoveryPath)
                .location(DruidLocation.create(indexService, dataSource))
                .timestampSpec(timestampSpec)
                .rollup(DruidRollup.create(DruidDimensions.specific(dimensions), aggregator, QueryGranularities.MINUTE))
                .tuning(
                        ClusteredBeamTuning
                                .builder()
                                .segmentGranularity(Granularity.HOUR)
                                .windowPeriod(new Period("PT10M"))
                                .partitions(1)
                                .replicants(1)
                                .build()
                )
                .druidBeamConfig(
                        DruidBeamConfig
                                .builder()
                                .indexRetryPeriod(new Period("PT10M"))
                                .build())
                .buildBeam();

        return beam;
    }
}

另外组件Spout可以会根据自己的需求来实现不同数据源的数据获取和发送到下游 
具体例子参考地址为: 
https://github.com/apache/storm/tree/master/external/storm-druid/src/test/java/org/apache/storm/druid

Java实现Druid对SQL的格式化操作 /** * 格式化SQL操作 * @param sql * @return */ public String sqlFormat(String sql){ // 查询的SQL以及对应的SQL类型 String result = SQLUtils.format(sql, JdbcConstants.MYSQL); ... 阅读详情

相关推荐

构建实时分析系统:Storm与Druid整合源码实战

Apache Storm 是一个开源的实时计算系统,它允许你快速并简单地进行大规模的数据流处理。它被设计为一个分布式计算框架,用于处理大量的实时数据,支持实时分析、在线机器学习、连续计算、分布式RPC、ETL等。其主要特点包括水平可扩展性、容错性以及易于集成和操作。Storm保证每条消息至少被处理一次,这使得其在处理大规模、高并发的数据流时,能够提供可靠的数据处理能力。Druid 是一个高性能的分布式分析型数据库,专为OLAP(在线分析处理)场景设计。

weixin_34718952的博客 885

Storm+Druid的事物实现逻辑

Storm-druid源码地址:https://github.com/apache/storm/tree/master/external/storm-druid/src/main/java/org/apache/storm/druid/trident Storm + Druid的事物实现逻辑:首先需要在pom.xml文件中引入storm-druid依赖 &lt;! - https://mvn...

梦想成真那天 1033

Storm整合Druid进行实时分析源码

Storm整合Druid进行实时分析源码,支持多维度分析,学习Storm实时分析必不可少的研究项目

storm mysql druid_Storm Druid 集成

Storm Druid 集成Storm Druid Bolt 和 TridentState该模块提供了将数据写入Druid 数据存储的核心Strom和Trident bolt(螺栓)的实现。 该实现使用Druid's的Tranquility库向druid发送消息。一些实施细节从现有的借用 Tranquility Storm Bolt. 这个新的Bolt(螺栓)增加了支持最新的storm释放,并保持...

weixin_35980267的博客 161

W5500+STM32F103C8T6进行TCP通信(modbus)

一路生花一、w5500资料二、modbus通信三、从机代码四、总结五、参考 一、w5500资料 w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程 https://www.aliyundrive.com/s/enPnnZgNtpE 二、modbus通信 Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议 这里是Modbus TCP数据帧 公共功能码定义 三、从机代码

junseven164的博客 5780

IDM更改下载路径的详细指南

Internet Download Manager(IDM)是一款功能全面的下载加速工具,它支持多种浏览器和协议,能够显著提升下载速度,同时提供断点续传、多线程下载等实用功能。IDM的用户界面简洁明了,操作便捷,使得用户能够轻松管理下载任务。此外,IDM还支持自动分类下载文件、定时下载等高级功能,进一步提升了用户的下载体验。通过本文的介绍,相信用户已经掌握了如何在IDM中更改下载路径的方法。这一功能不仅提升了下载效率和文件管理便捷性,还满足了用户的个性化需求。

nntxthml的博客 1763

storm mysql druid_Druid 集成

title: Storm Druid 集成 layout: documentation documentation: trueStorm Druid Bolt 和 TridentState该模块提供了将数据写入Druid 数据存储的核心Strom和Trident bolt(螺栓)的实现。 该实现使用Druid's的Tranquility库向druid发送消息。一些实施细节从现有的借用 Tranqu...

weixin_34082213的博客 218

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

快速学习-Druid数据摄入之Tranquility

第7章 Druid数据摄入之Tranquility 在上面的内容中,我们学习了如何通过索引服务器摄取数据,然而索引服务器的API太过底层,运用起来比较麻烦。Tranquility对索引服务的API进行了封装,可以方便创建任务,处理分片,复制、服务器发现以及无缝的数据结构调整。 向Druid发送数据,需将Tranquility库依赖到程序中。 地址:https://github.com/druid-...

逍遥云恋 1125

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5952

【Audio driver】深入解析mixer_paths.xml中的音频通路配置

本文深入解析了Android音频驱动开发中的核心配置文件mixer_paths.xml。文章以高通平台为例,详细阐述了音频通路(FE、BE、DSP、Device)的概念与连接逻辑,并通过实战案例拆解了扬声器与麦克风通路的配置方法、关键控件作用及调试技巧,是理解与定制Android音频系统的实用指南。

ik6789012的博客 359

Storm Druid Bolt实现:

Storm-Druid源码地址为:https://github.com/apache/storm/tree/master/external/storm-druid 在Storm与Druid结合; 需要在pom.xml文件中引入<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-druid --> <dependency>

梦想成真那天 879

对10G/40Gphy中auto-negotiation功能调试

在近期有一个项目,是一台设备中发现mac与phy之间的信号质量有一些差,报文会出现很多的crc错误码。希望可以将mac与phy之间的工作模式改为10GBASE-KR/40GBASE-KR4,从而提高信号质量,减少crc错误码。要实现10GBASE-KR/40GBASE-KR4,需要打开auto-negotiation,所以,文章主要内容是如何开启自协商,以及相关参数的解释。 需要的文档: 1、802.3协议手册 2、所调试phy的芯片手册(我自己使用的是bcm的万兆phy) 万兆phy情况摘要 PHY寄存

MTzhang_22的博客 5829

https://github.com/apache/storm/commit/b6cab8dca97e2238aef8e45118f6946fc2d35049#diff-6ab5421905cac64

apache/storm   https://github.com/apache/storm https://github.com/apache/storm/commit/b6cab8dca97e2238aef8e45118f6946fc2d35049#diff-6ab5421905cac645cbd7a32848764760  Code Pull requests 161 Project...

大JAVA解决方案 1745

HTPA 32x32d热成像传感器数据读取与校准全流程解析

本文详细解析了HTPA 32x32d热成像传感器的数据读取与校准全流程。从寄存器配置、原始数据采集,到核心的五大校准步骤(包括热量、电子偏移、电压、灵敏度补偿及温度转换),并涵盖像素重组、坏点修复及图像后处理,为开发者替代或升级MLX90640提供了完整、实用的操作指南。

weixin_29190169的博客 612

Debezium系列之:深入理解 Debezium Topic的设置要求

Debezium系列之:配置 Debezium Topic

zhengzaifeidelushang的博客 1009

使用Storm实现实时大数据分析

使用Storm实现实时大数据分析 标签: hadoopstorm 2012-12-31 10:12 56162人阅读 评论(11) 收藏 举报 分类: 大数据处理(11) 数据结构与算法(28) 版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+] 摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战。Shruthi Kumar和Siddharth

梦想成真那天 1895

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

实时大数据处理之storm与zeroMQ

消息队列现在是模块之间通信的非常通用的解决方案了。消息队列使得进程间的通信可以跨越物理机,这对于分布式系统尤为重要,毕竟我们不能假定进程究竟是部署在同一台物理机上还是部署到不同的物理机上。RabbitMQ是应用比较广泛的MQ 提到MQ,不得不提的是ZeroMQ。ZeroMQ封装了Socket,引用官方的说法: “ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的

gobravery的专栏 4205

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Storm流之多个Bolt聚合到一个Bolt

Storm流之多个Bolt聚合到一个Bolt 一、       案例Demo             基于分发案例,将MinBolt、MidBolt、MaxBolt聚合到TotalBolt 二、       FenFaTopology代码 package com.test.csdn; import org.apache.storm.Config; import org.apache...

Simon的博客 3247

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Druid 大数据分析之概况

一、概述     随着互联网快速发展,数据量增长快,达到TB、PB,以交通车流量为例,如湖南省每月的车辆流量至少达到4亿,这个数据量远不止如此。数据量如此大,如何满足后期分析,传统面向OLTP型数据库(ORACLE、MYSQL等)无法要求,渐渐开始转向OLAP,如GreenPlum等,虽然很多OLAP数据库吸收分布式计算思想,数据达到20亿以上后,进行Count、聚合等操作性能仍然达不到客户...

yangyangmyself的专栏 547

Druid (大数据实时统计分析数据存储)

原文见此 : Druid White PaperDruid 是一个为在大数据集之上做实时统计分析而设计的开源数据存储。这个系统集合了一个面向列存储的层,一个分布式、shared-nothing的架构,和一个高级的索引结构,来达成在秒级以内对十亿行级别的表进行任意的探索分析。在这篇论文里面,我们会描述Druid的架构,和怎样支持快速聚合、灵活的过滤、和低延迟数据导入的一些细节。1. 介绍在最近几年,

白乔专栏 2万+

Storm程序的mysql连接问题及可行的处理方式

最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下。这是最后一篇。 Storm程序因为有他本身框架的组合方式,只有再要输出的bolt创建jdbc对象(看起来和redis和hbase没什么区别)。但实际上却有不少的坑(有些坑我现在都没明白,只能说根据经验规避),最后两点体会: 尽量不要再storm程序中用mysql。 尽量减少storm程序中创建jdbc连接的bolt。

jyj019的博客 1296

数据库连接池之Druid连接池(mysql)

数据库连接池之Druid连接池(mysql) 本仙鱼又更博了,我是勤劳的小蜜蜂嗡嗡嗡~~ 1 Druid简介 Druid 是目前比较流行的高性能的(阿里的),分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点: 一. 亚秒级查询 druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。 二.实时数据注入 druid支持流数据的注入,...

女神的博客 1万+

Druid.io系列(三): Druid集群节点

Druid集群节点

njpjsoftdev的博客 1万+

Druid:一个用于大数据实时处理的开源分布式系统

Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。创建Druid的最初意图主要是为了解决查询延迟问题,当时试图使用Hadoop来实现交互式查询分析,但是很难满足实时分析的需要。而Druid提供了以交互方式访问数据的能力,并权...

weixin_34310785的博客 418
上一篇: superset 安装及其深度汉化
下一篇: Druid 大数据分析之快速应用(单机模式)
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值