自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

John,hao的专栏

John,hao的专栏、IT知识分享、技术实战和经验总结

  • 博客(82)
  • 资源 (4)
  • 收藏
  • 关注

原创 Storm 从入门到精通 第二十六讲 Storm 批处理事务 - 多PartitionedTransaction(Base) 【实战运行】《Getting Started With Storm》

上一讲 我们讲过了 BaseTransactionalSpout 如何实现 Tweet Transactional Topology, 这讲使用多Partition redis。对一个spout来说,从一个分区集合中读取批次是很普通的。接着这个例子,你可能有很多redis数据库,而tweets可能会分别保存在这些redis数据库里。通过实现IPartitionedTransactionalSpou...

2018-04-23 21:29:09 372

原创 Storm 从入门到精通 第二十五讲 Storm 批处理事务 - TweetsTransactionalSpout (Base) 【实战运行】《Getting Started With Storm》

问题: 创建一个Twitter分析工具, 要求从一个Redis数据库读取tweets,通过几个bolt处理它们,最后把结果保存在另一个Redis数据库的列表中。处理结果就是所有话题和它们的在tweets中出现的次数列表,所有用户和他们在tweets中出现的次数列表,还有一个包含发起话题和频率的用户列表。1. 题目解释:测试用例Tweet 如下: @John @alex 3. Apache #Sto...

2018-04-09 10:30:43 404

原创 Storm 从入门到精通 第二十四讲 Storm 批处理事务 - Storm自带的例子TransactionalGlobalCount

TransactionalGlobalCount :统计多个分区的单词数总和。此处3个分区,共计19个单词。分区的概念:学习MQ,kafka分区等等,主要用于提高消息read吞吐量。MemoryTransactionalSpout MemoryTransactionalSpout spout = new MemoryTransactionalSpout(DATA, new Fields("word...

2018-04-07 14:43:28 573

原创 Storm 从入门到精通 第二十三讲 Storm 批处理事务 - 事务API

1. 事务APISpout (难点)ITransactionalSpout<T>,同BaseTransactionalSpout<T>,普通事务SpoutIPartitionedTransactionalSpout<T> --分区事务,增加消息队列吞吐量,同BasePartitionedTransactionalSpout<T>,分区事务SpoutI...

2018-04-07 12:59:48 690

原创 Storm 从入门到精通 第二十二讲 Storm 批处理事务-原理详解

1.  批处理对于容错机制,Storm通过一个系统级别的组件acker,结合xor校验机制判断一个tuple是否发送成功,进而spout可以重发该tuple ,保证一个tuple在出错的情况下至少被重发一次。但是在需要精确统计tuple的数量如销售金额场景时,希望每个tuple”被且仅被处理一次” 。Storm 0.7.0引入了Transnational Topology, 它可以保证每个tupl...

2018-04-07 11:06:32 574

原创 Storm 从入门到精通 第二十一讲 Storm DRPC 之 官方复杂示例 TiwtterReachTopology

1. 示例需求解决在微博、论坛进行转发帖子的时候, 是对URL进行转发,分析给粉丝(关注我的人),那么每一个人的粉丝(关注者可能会有重复的情况),需求就是统计一下帖子(URL)的转发人数2. 解决方案实现步骤如下:   第一:获取当前转发帖子的人。 GetTweetersBolt   第二:获取当前人的粉丝(关注者)。GetFollowersBolt   第三:进行粉丝去重。PartialUniq...

2018-04-06 21:46:45 701

原创 Storm 从入门到精通 第二十讲 Storm DRPC 简单示例

这里简单Echo程序:1. BasicDRPCTopologypackage com.john.learn.storm.drpc.basic;import java.util.Arrays;import java.util.Scanner;import org.apache.storm.Config;import org.apache.storm.LocalCluster;impor...

2018-04-06 21:24:34 1001

原创 Storm 从入门到精通 第十九讲 Storm DRPC 简介及设计思想

1. DRPC 简介分布式RPC( distributed RPC,DRPC)Storm里面引入DRPC主要是利用 Storm的实时计算能力来并行化CPU密集型( CPU Intensive)的计算任务。DRPC的 Storm Topology以函数的参数流作为输入,而把这些函数调用的返回值作为 Topology的输出流。DRPC其实不能算是Storm本身的一个特性,它是通过组合Storm的Str...

2018-04-06 21:19:04 2293

原创 Storm 从入门到精通 第十八讲 Storm 可靠性 - 机制讲解

一个tuple被”完全处理”是什么意思?就如同蝴蝶效应一样,从spout发射的一个tuple可以引起其它成千上万个tuple因它而产生, 想想那个计算一篇文章中每个单词出现次数的topology.TopologyBuilder builder = new TopologyBuilder();builder.setSpout(1, new KestrelSpout("kestrel.backtyp...

2018-04-05 16:27:41 564

原创 Storm 从入门到精通 第十七讲 Storm 可靠性 - ack 与 fail 及 事务一致性

上一章,讲解ack 与 fail的使用, 到由于数据拆分到多个Bolt 导致数据事务不一致性问题,如何解决呢?1. 使用Batch 处理,比较简单,但无法享受分布式计算带来的好处,高性能。2. 手工记录 成功数据 (Message Id + Data ID) 避免重复。程序代码:DatabaseSimulatorDataStoragepackage com.john.learn.storm.rel...

2018-04-04 13:49:04 510

原创 Storm 从入门到精通 第十六讲 Storm 可靠性 - ack 与 fail 及 数据拆分(多Bolt处理),事务不一致

Spout是 Storm数据流的入口,在设计拓扑时,一件很重要的事情就是需要考虑消息的可靠性,如果消息不能被处理而丢失是很严重的问题。以一个传递消息并且实时处理的例子,来说明这个问题。Message Spout: 发送一批数据, 格式使用逗号分隔, 共计4条Subject,每个Subject 包含两个单词。private static final String[] Subjects = new S...

2018-04-04 13:42:29 1063 1

原创 Storm 从入门到精通 第十五讲 Storm Word Count 示例代码

1. CountWordTopologypackage com.john.learn.storm.countword;import org.apache.storm.Config;import org.apache.storm.LocalCluster;import org.apache.storm.topology.TopologyBuilder;import org.apache.s...

2018-04-03 18:35:10 618

原创 Storm 从入门到精通 第十四讲 Storm Word Count 示例讲解

统计的问题1. 解决统计单词在文章中出现的频率问题? 例如:Apache Storm is a free and open source distributed realtime computation system.  Storm makes it easy to reliably process unbounded streams of data, doing for realtime pro...

2018-04-03 18:26:55 539

原创 Storm 从入门到精通 第十三讲 Stream Grouping-Custom Grouping

除了以上几种分组方式之外,我们还可以自己自定义分组,自己DIY去控制哪些Blot来接收Tuple;实现自定义分组需要继承backtype.storm.grouping.CustomStreamGrouping 接口我们现在业务中遇到一个问题想让用户的uid按照分段的规则grouping到对应的task上面,于是采用uid%k的方法将相同模值的记录在一个task进行业务处理,自己实现了ModStre...

2018-04-03 14:55:15 445

原创 Storm 从入门到精通 第十二讲 Stream Grouping-None Grouping、Direct Grouping 和LocalOrShuffle Grouping

 None Grouping、Direct Grouping 和LocalOrShuffle Grouping 最不常用三种分组None Grouping: 不关注并行处理负载均衡策略时使用该方式,目前等同于Shuffle Grouping,另外Storm将会把bolt任务和他的上游提供数据的任务安排在同一个线程下。Direct Grouping:由Tuple的发射单元直接决定Tuple将发射给那...

2018-04-03 14:53:41 1981

原创 Storm 从入门到精通 第十一讲 Stream Grouping - Global Grouping

Global Grouping全局分组:这个Tuple被分配到Storm中的一个Bolt的其中一个Task, 再具体一点就是分配给task_id值最低的那个TaskPrintWriterToplogyOnGlobalGroupConfig 示例运行结果:有且仅有1个WriterBolt文件(尽管 WriterBolt 8个Executors)...

2018-04-03 14:50:32 506

原创 Storm 从入门到精通 第十讲 Stream Grouping - Fields Grouping

Fields Grouping按字段分组:比如按 UserId来分组,具有同样UserId来分组的Tuple会被发送到到相同的Bolts,而不同的UserId则会被分配到不同的Bolts。应用场景:用于数据分组统计,非常类似于 SQL Group By 关键字, 主要用于分组求和、统计、Avg、Min、Max等等。例如: 求一个学生的总分(Storm 实现)?Student:  ID Name  ...

2018-04-03 09:46:43 762

原创 Storm 从入门到精通 第九讲 Stream Grouping -Shuffle Grouping

随机分组(Shuffle Grouping)是最常用的流分组方式,它随机地分发元组到Bolt上的任务,这样能保证每个任务得到相同数量的元组。将流分组定义为混排。这种混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的任务。shuffle grouping对各个task的tuple分配的比较均匀。随机分组执行原子操作,这是非常有用的,例如数学运算。但是,如果操作不能被随机分发的话,应...

2018-04-03 09:35:06 2671

原创 Storm 从入门到精通 第八讲 Storm Stream Grouping 7 种策略

Topology:一个实时计算应用程序逻辑上被封装在Topology对象中,类似Hadoop中的作业与作业不同的是, Topology会一直运行直到显式地杀死它Storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构。一个 Topology是Spouts和Bolts组成的流程图,通过Stream Groupings将图中的 Spouts和Bolts连接起来,完成实时流业...

2018-04-03 09:11:09 597

原创 Storm 从入门到精通 第七讲 Storm 示例 之 Storm Topology配置说明 -工作进程、平行度、任务数(重要)

工作进程、平行度就、任务数解释1. 第一种情况如上使用默认模式,Node 中运行情况:  1个 JVM 每个Spout、Bolt 一个Executors 一个Task2. 第二种情况说明如下:1. 独立JVM Worker:2 printWriterTopologyBuilder.setNumWorkers(2); public void setN...

2018-04-03 09:02:43 652

原创 Storm 从入门到精通 第六讲 Storm 示例 之 第一个简单实例

1. 第一个简单例子: Spout 将随机发送目前流行的编程语言, Console 输出 及 使用 File 保存出现的语言日志。2. Topology 流程图3. 程序结构4. 程序示例1. PrintWriterSpout: fieldsDeclarer.declare(new Fields("PrintWord"));package com.john.learn.storm.ch01.spo...

2018-04-03 09:01:49 1285

原创 Storm 从入门到精通 第五讲 Storm 示例 之 Storm API

1. Storm 组件回顾2. Storm API1. 首先编写数据源类: Spout。    a. 继承 BaseRichSpout类    b. 实现 IRichSpout接口    c. 重点需要几个方法进行重写或实现:open、nextTuple 和 DeclareOutputFields 方法2. 继续编写数据处理类:Bolt    a. 继承 BaseBasicBolt类    b. ...

2018-04-02 17:02:06 1303 1

原创 Storm 从入门到精通 第四讲 Storm环境搭建 - Storm 安装

1. 环境信息2. 安装Zookeeper集群参考上一节3. 安装Storm集群log1、log2和log3部署storm集群,log1作为Nimbus节点,log2和log3作为surpervisor节点。(1)下载安装软件并解压 [root@log1 local]# wget https://www.apache.org/dyn/closer.lua/storm/apache-...

2018-04-02 16:48:25 746

原创 Storm 从入门到精通 第三讲 Storm环境搭建 - Zookeeper 安装

介绍Zookeeper的安装部署。安装部署分三种模式:单机模式、伪分布式模式和分布式模式。单机模式和为分布式比较简单,多用于本地测试调试,下面介绍分布式模式安装部署。注意:3台机器都需要安装zk。对于Zookeeper集群的话,官方推荐的最小节点数为3个。1. 环境信息2. 安装jdk1.73台机器都需要安装jdk1.7[root@log1 local]# mkdir /usr/java[roo...

2018-04-02 16:26:38 743

原创 Storm 从入门到精通 第二讲 Storm体系结构

1. Storm Vs HadoopHadoop上运行的是MapReduce的作业(Job),而在Storm上运行的是TopologyStorm和 Hadoop 关键的区别是:Hadoop的MapReduce作业最终会结束,而Storm的Topology会一直运行(除非显式地杀掉它)如果说批处理的 Hadoop需要一桶桶地搬走水,那么 Storm就好比自来水水管,只要预先接好水管,然后打开水龙头,...

2018-04-02 16:10:03 1015

原创 Storm 从入门到精通 第一讲 Storm 简介

1. Storm是Twitter开源的一个分布式的实时计算系统,用于数据的实时分析,持续计算,分布式RPC等等官网地址: http://storm.apache.org/index.html2.实时计算用于解决哪些问题a. 最显而易见的就是实时推荐系统,比如我们在淘宝等电商购物网站去买东西我们会在网页旁边或者底端看到与自己所需要商品相关的系列产品。这就是使用类似 Storm实时计算去做的,我们非常...

2018-04-02 15:15:43 2492

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第三十四讲)无锁 - LockFreeVector

LockFreeVector: 无锁Vector1. Descriptorstatic class Descriptor<E> {      public int size;      volatile WriteDescriptor<E> writeop;      public Descriptor(int size, WriteDescriptor<E&g...

2018-04-02 10:41:31 1160 1

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第三十三讲)无锁 - 无锁类的使用

1. AtomicIntegerAPIpublic final int get() //取得当前值public final void set(int newValue) //设置当前值public final int getAndSet(int newValue) //设置新值,并返回旧值public final boolean compareAndSet(int expect, int upda...

2018-04-02 10:31:38 198

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第三十二讲)无锁

1. 无锁类原理详解CAS:CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,...

2018-04-02 10:19:05 173

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第三十一讲)ThreadLocal

1. 名词概念为每一个线程分配不同的对象,需要在应用层面保证。 ThreadLocal只是起到了简单的容器作用。2.简单使用SimpleDateFormat 线程不安全   ThreadLocal 保护 SimpleDateFormat (每一个线程分配一个实例) 3. 实现原理...

2018-04-02 10:17:10 208

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第三十讲)虚拟机内的锁优化

1.偏向锁锁偏向是一种针对加锁操作的优化手段。它的核心思想是:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较好的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同...

2018-04-02 10:12:58 124

原创 Java高并发程序-Chapter5 锁的优化及注意事项(第二十九讲)锁优化思路和建议

1. 减少锁的持有时间减少锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力Good Example:2. 减少锁粒度所谓减少锁粒度,就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。 将大对象,拆成小对象,大大增加并行度,降低锁竞争 偏向锁,轻量级锁成功率提高 HashMap的同步实现    –Collections.synchronizedMap(Map&lt...

2018-03-29 09:52:37 128

原创 Java高并发程序-Chapter4 并行模式与算法(第二十八讲)并行搜索

1. 模式概念搜索是几乎每一个软件都必不可少的功能。对于有序数据,通常可以采用二分查找法。对于无序数据,则只能挨个查找。在本节中,我们将讨论有关并行的无序数组的搜索实现。给定一个数组,我们要查找满足条件的元素。对于串行程序来说,只要遍历一下数组就可以得到结果。但如果要使用并行方式,则需要额外增加一些线程间的通信机制,使各个线程可以有效地运行。2.程序代码01//切分数据多线程package c...

2018-03-29 09:40:16 288

原创 Java高并发程序-Chapter4 并行模式与算法(第二十七讲)并行流行线

1. 模式概念现在要生产一批小玩偶。小玩偶的制作分为四个步骤,第一要组装身体,第二要在身体上安装四肢和头部,第三,给组装完成的玩偶穿上一件漂亮的衣服,第四,就可以包装出货了。为了加快制作玩具的进度,我们不可能叫四个人同时加工一个玩具,因为这四个步骤有着严重的依赖关系。如果没有身体,就没有地方安装四肢,如果没有组装完成,就不能穿衣服,如果没有穿上衣服,就不能包装发货。因此,找四个人来做一个玩偶是毫无...

2018-03-29 09:37:50 407 1

原创 Java高并发程序-Chapter4 并行模式与算法(第二十六讲)Future 模式

1. 模式定义Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个函数方法时,如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需要的数据Future模式有点类似在网上买东西。如果我们在网上下单...

2018-03-29 09:32:58 369

原创 Java高并发程序-Chapter4 并行模式与算法(第二十五讲)生产者-消费者模式

1.模式定义生产者-消费者模式是一个经典的多线程设计模式。它为多线程间的协作提供了良好的解决方案。在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。图5.1 展示了生产者-消费者模式的基本结构。三个生产者线程将任务提交到共享内存缓冲区,消费者线程并不直接...

2018-03-29 09:18:22 191

原创 Java高并发程序-Chapter4 并行模式与算法(第二十四讲)不变模式

不变模式一个类的内部状态创建后,在整个生命期间都不会发生变化时,就是不变类 不变模式不需要同步注意:不变模式通过回避问题而不是解决问题的态度来处理多线程并发访问控制。不变对象是不需要进行同步操作的。由于并发同步会对性能产生不良的影响,因此,在需求允许的情况下,不变模式可以提高系统的并发性能和并发量JDK 不变模式:  java.lang.String   java.lang.Boolean   j...

2018-03-29 09:13:11 201

原创 Java高并发程序-Chapter4 并行模式与算法(第二十三讲)单利模式

1.饿汉模式package com.john.learn.high.concurent.ch04.singleton;public class StarvationSingleton { public StarvationSingleton() { System.out.println("Starvation Singleton is created..."); } publi...

2018-03-29 09:11:47 157

原创 Java高并发程序-Chapter4 并行模式与算法(第二十二讲)设计模式

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。 Richard Helm, Ralph Johnson ,John Vlissides (Gof) 《设计模式:可复用面向对象软件的基础》收录23种模式 –观察者模式 –策略模式...

2018-03-29 09:04:57 170

原创 Java高并发程序-Chapter3 JDK并发包(第二十一讲)JDK 并发容器

1. 集合包装HashMapCollectoins.synchronizedMap(new HashMap())而其他所有相关的Map操作都会使用这个 mutex进行同步。从而实现线程安全。这个包装的Map可以满足线程安全的要求。但是,它在多线程环境中的性能表现并不算太好。无论是对Map的读取或者写入,都需要获得 mutex的锁,这会导致所有对Map的操作全部进入等待状态,直到 mutex锁可用。...

2018-03-29 08:59:43 239

Netty3.x 源码

Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty3.x 源码,便于大家学习

2018-03-26

Netty 快速入门系列-源码

Netty快速入门系列源码, 参考 https://blog.csdn.net/netcobol Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个NIO客户端、服务端框架。允许快速简单的开发网络应用程序。例如:服务端和客户端之间的协议。它最牛逼的地方在于简化了网络编程规范。例如:TCP和UDP的Socket服务

2018-03-26

Java 二叉树 & Huffman coding

Java 二叉树 & Huffman coding

2015-11-15

基于Java的 iOS 推送通知

基于Java的 iOS 推送通知 1.iOS 推荐原理 2.Java & iOS code

2013-06-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除