大数据014——Storm 简介及入门案例

2023-05-16

分布式实时数据处理框架——Storm

1. Storm简介与核心概念

1.1 Storm 简介

全称为 Apache Storm,是一个分布式实时大数据处理系统。它是一个流数据框架,具有最高的获取率。它比较简单,可以并行地对实时数据执行各种操作。它通过Apache ZooKeeper 集群管理分布式环境和集群状态。Apache Storm 继续成为实时数据分析的领导者。Storm 易于设置和操作,并且它保证每个消息将通过拓扑至少处理一次。

Storm区别于Hadoop,但又被业界称为实时版的Hadoop,源于越来越多的场景对Hadoop的MapReduce高延迟无法容忍,比如网站统计、推荐系统、预警系统、金融系统(高频交易、股票)等等,大数据实时处理解决方案(流计算)的应用日趋广泛,目前已是分布式技术领域最新爆发点,而Storm更是流计算技术中的佼佼者和主流。

1.2 Storm 核心概念(组件)

  • Nimbus:Storm 集群主节点(master),负责资源分配和任务调度。我们提交任务和截止任务都是在 Nimbus 上操作的。一个 Storm 集群只有一个 Nimbus 节点;
  • Supervisor:Storm 集群工作节点(slave),负责接收Nimbus分配的任务,管理所有Worker,一个Supervisor节点中包含多个Worker进程;
  • Worker:工作进程,每个工作进程中都有多个 Task;
  • Task:任务,每个 Spout 和 Bolt 都是一个任务,每个任务都是一个线程;
  • Topology:计算拓扑,是对实时计算应用逻辑的封装,它的作用与 MapReduce 的任务(Job)很相似,区别在于 MapReduce 的一个 Job 在得到结果之后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它。拓扑还可以理解成由一系列通过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构;
  • Stream:消息流,是拓扑中数据流的来源,关键抽象概念,是没有边界的 Tuple 序列;
  • Spout:消息流的源头,Topology 的消息生产者,一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中,这些数据源可以来自数据库、文件、消息队列;
  • Bolt:消息处理单元,可以完成过滤、聚合、联结、查询数据库等几乎所有的数据处理需求;
  • Stream grouping:消息分发策略,一共 8 种,定义每个 Bolt 接受何种输入;
  • Reliability:可靠性,Storm 保证每个 Tuple 都会被处理。

在这里插入图片描述

1.3 Storm 架构原理

1.3.1 Storm 集群架构

在这里插入图片描述

Zookeeper 集群负责Nimbus 节点和 Supervior 节点之间的通信,监控各个节点之间的状态,它在 Storm 集群中逻辑上是独立的,但在实际部署的时候,一般会将 zk节点部署在 Nimbus 节点或 Supervisor 节点上。

1.3.2 Storm 数据处理流程

Storm 处理数据的特点:适合管理实时数据,数据源源不断,不断处理:

在这里插入图片描述

  • Spout:消息流的源头,Topology 的消息生产者;
  • Bolt:消息处理单元,可以过滤、聚合、查询数据库;
  • tuple:就是一个值列表,是 storm 主要数据结构,是 storm 中使用的最基本单元、数据模型和元组。

1.3.3 Storm 拓扑图(spouts 和 bolts 组成的图)

storm 中是没有数据存储结构的,本身是不存储数据,需要我们自己设计数据落地接口,指明数据存储到哪一部分中:

在这里插入图片描述

  • 第一种简单类型:由一个Spout获取数据,然后交给一个Bolt进行处理;
  • 第二种稍复杂类型:由一个Spout获取数据,然后交给一个Bolt进行处理一部分,然后在交给下一个Bolt进行处理其他部分。
  • 第三种复杂类型一个Spout可以同时发送数据到多个Bolt,而一个Bolt也可以接受多个Spout或多个Bolt,最终形成多个数据流。但是这种数据流必须是有方向的,有起点和终点,不然会造成死循环,数据永远也处理不完。就是Spout发给Bolt1,Bolt1发给Bolt2,Bolt2又发给了Bolt1,最终形成了一个环状。

1.4 Storm 的主要应用

1.4.1 数据流处理( stream processing)

Storm 可用来实时处理新数据和更新数据库,兼具容错性和可扩展性,即 Storm 可以用来处理源源不断流进来的消息,处理之后将结果写入某个存储中。如:

  • 条件过滤:这是Storm最基本的处理方式,对符合条件的数据进行实时过滤,将符合条件的数据保存下来,这种实时查询的业务需求再实际应用中很常见。
  • 中间计算:我们需要改变数据中某一个字段(例如是数值),我们需要利用一个中间值经过计算(值比较、求和、求平均等等)后改变该值,然后将数据重新输出。
  • 求TopN:相信大家对TopN类的业务需求也比较熟悉,在规定时间窗口内,统计数据出现的TopN,该类处理在购物及电商业务需求中,比较常见。

1.4.2 持续计算( continuous computation)

Storm 可进行连续查询并把结果即时反馈给客户端,如把 Twitter 上的热门话题发送到浏览器中 ,Storm能保证计算可以永久运行,直到用户结束计算进程为止。如:

  • 推荐系统:有时候在实时处理时会从mysql及hadoop中获取数据库中的信息,例如在电影推荐系统中,传入数据为:用户当前点播电影信息,从数据库中获取的是该用户之前的一些点播电影信息统计,例如点播最多的电影类型、最近点播的电影类型,及其社交关系中点播信息,结合本次点击及从数据库中获取的信息,生成推荐数据,推荐给该用户。并且该次点击记录将会更新其数据库中的参考信息,这样就是实现了简单的智能推荐。
  • 批处理:所谓批处理就是数据积攒到一定触发条件,就批量输出,所谓的触发条件类似事件窗口到了,统计数量够了即检测到某种数据传入等等。
  • 热度统计:热度统计实现依赖于Storm提供的TimeCacheMap数据结构,现在可能推荐用RotatingMap,该结构能够在内存中保存近期活跃的对象。我们可以使用它来实现例如论坛中热帖排行计算等。

1.4.3 分布式远程程序调用( distributed RPC)

轻松地并行化CPU密集型操作。如:

  • 分布式RPC:Storm有对RPC进行专门的设计,分布式RPC用于对Storm上大量的函数进行并行计算,最后将结果返回给客户端。

2. Storm 入门案例

通过Strom API 编写入门案例,在非集群的本地环境下运行体验 Storm 实时处理数据的底层实现,有助于更好的理解 Storm 实时数据处理的开发流程。

2.1 数字累加操作

业务对1,2,3,4....这种递增数字进行累加求和
topologyspout负责产生从1开始的递增数据,每次加1
bolt负责对spout发送出来的数据进行累加求和
  1. eclipse 开发工具借助 Maven 环境新建项目;
  2. 添加 Storm 依赖:
<dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>1.2.2</version>
</dependency>
  1. 编写代码:
public class LocalTopology {
	
	/**
	 * 自定义的spout需要继承BaseRichSpout
	 */
	public static class MySpout extends BaseRichSpout{
		
		private Map conf;
		private TopologyContext context;
		private SpoutOutputCollector collector;
		/**
		 * 初始化方法,在spout组件初始化的时候只执行一次;执行初始化操作,如:如果需要实现对mysql的操		  * 作,需要使用连接池,那么连接池初始化的代码就需要放在open方法里面。
		 * 		Map conf:其实是storm的配置类,这里面可以保存一个配置信息在storm中进行传递。
		 * 		TopologyContext context:topology的上下文对象
		 *		SpoutOutputCollector collector:发射器,负责发射数据
		 */
		@Override
		public void open(Map conf, TopologyContext context,
				SpoutOutputCollector collector) {
			this.conf = conf;
			this.context = context;
			this.collector = collector;
		}

		/**
		 * 这个方法会被框架一直调用,死循环的调用
		 * spout负责在nextTuple中向外发射数据
		 * 这个方法每执行一次,都会向外发射一条数据。
		 */
		int num=0;
		@Override
		public void nextTuple() {
			num++;//这样就可以产生递增的数字
			this.collector.emit(new Values(num));
			System.out.println("spout:"+num);
			Utils.sleep(1000);//线程休眠1000sm,防止耗尽资源
		}

		/**
		 * 声明输出字段
		 * 这个方法也是在开始执行一次
		 */
		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			//注意:Fields中封装的字段和values中封装的数据是一一对应的
			declarer.declare(new Fields("num"));
		}
		
	}
	
	/**
	 * 自定义的bolt需要继承baserichbolt
	 */
	public static class SumBolt extends BaseRichBolt{
		
		private Map stormConf;
		private TopologyContext context;
		private OutputCollector collector;
		/**
		 * 是一个初始化方法,也是只会执行一次
		 */
		@Override
		public void prepare(Map stormConf, TopologyContext context,
				OutputCollector collector) {
			this.stormConf = stormConf;
			this.context = context;
			this.collector = collector;
		}

		/**
		 * 这个方法也会执行很多次,只要上一个组件发射一条数据,那么这个bolt就收到这个条数据,然后调用		   * execute方法去处理数据
		 */
		int sum = 0;
		@Override
		public void execute(Tuple input) {
			Integer num = input.getIntegerByField("num");
			//因为tuple其实就是一个list,list有角标,所以也可以通过脚本获取数据
			//Integer num = input.getInteger(0);
			sum+=num;
			System.out.println("和为:"+sum);
			//注意:这个bolt已经是最后一个bolt了,所以就不需要向外面发射数据了,也就不用调用emit方法了。
		}
		
		/**
		 * 注意:如果这个组件没有调用emit向外发射数据,那么这个方法就不需要实现。
		 * 如果这个组件向外发射了数据,那么在这个方法内部必须要声明输出字段。
		 */
		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			
		}
		
	}
	
	public static void main(String[] args) {
		//把spout和bolt组装成一个topology去执行
		TopologyBuilder topologyBuilder = new TopologyBuilder();
		topologyBuilder.setSpout("spoutid", new MySpout());
		topologyBuilder.setBolt("boltid", new SumBolt()).shuffleGrouping("spoutid");		
		//创建本地集群,即模拟集群
		LocalCluster localCluster = new LocalCluster();
		//拓扑的名称
		String simpleName = LocalTopology.class.getSimpleName();
		//配置类
		Config config = new Config();
		localCluster.submitTopology(simpleName, config, topologyBuilder.createTopology());
	}
	
}
  1. 结果:
spout:1
和为:1
spout:2
和为:3
spout:3
和为:6
spout:4
和为:10
.....

2.2 实时累计成交订单金额

业务模拟解析天猫用户订单数据,对用户下单总金额进行实时汇总
topologytmalldataspout负责读取文件中的一行行内容
parsebolt负责对订单信息进行解析
sumbolt负责对订单金额进行汇总
  1. 项目根目录下传入tmalldata.txt文件:
100010	会飞的鱼_123	13210982233	2016/12/1 10:11	89.9	请发顺丰快递
100011	别来我回忆里微笑	18712317876	2016/12/1 12:21	199	无
100012	真心不如红钞票	18623450989	2016/12/1 12:43	39.9	无
100013	qingfeng7109	18901292615	2016/12/1 13:11	167	无
100014	梦醒de泪痕	13910002697	2016/12/1 13:49	132	请开具纸质发票
100015	wuah1314	17911112836	2016/12/1 14:07	248	无
100016	黑白色	15611595966	2016/12/1 14:18	178	无
100017	仰望天猪	13311295111	2016/12/1 14:29	86.9	无
100018	天涯浪子	18511512315	2016/12/1 15:20	78.2	无
100019	dingdang	17210963299	2016/12/1 15:39	156	无
100020	堕落的永恒	15610615388	2016/12/1 15:54	124	无
  1. 编写代码:
public class LocalTmallTopology {
	
	public static class TmallDataSpout extends BaseRichSpout{
		
		private Map conf; 
		private TopologyContext context;
		private SpoutOutputCollector collector;
		private BufferedReader bufferedReader;
		@Override
		public void open(Map conf, TopologyContext context,
				SpoutOutputCollector collector) {
			this.conf = conf;
			this.context  =context;
			this.collector = collector;
			try {
                //读取项目根目录下的tmalldata.txt文件
				bufferedReader = new BufferedReader(new FileReader("tmalldata.txt"));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		}
		String line = null;
		@Override
		public void nextTuple() {
			try {
				line = bufferedReader.readLine();//每次读取一行
				if(line!=null){
					this.collector.emit(new Values(line));//若该行为非空数据,提交这一行数据
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			declarer.declare(new Fields("line"));
		}
	}
	
	/**
	 * 解析数据的bolt
	 */
	public static class ParseBolt extends BaseRichBolt{
		
		private Map stormConf; 
		private TopologyContext context;
		private OutputCollector collector;
		@Override
		public void prepare(Map stormConf, TopologyContext context,
				OutputCollector collector) {
			this.stormConf = stormConf;
			this.context = context;
			this.collector = collector;
		}

		@Override
		public void execute(Tuple input) {
			String line = input.getStringByField("line");
            //按制表符切分每一行数据
			String[] splits = line.split("\t");
			//可能会存储数据异常的情况,在这对数据进行过滤
			if(splits.length==6){
				//把订单id和订单金额发送出去
				this.collector.emit(new Values(splits[0],splits[4]));
			}
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			declarer.declare(new Fields("id","actualFee"));
		}
	}
	
	/**
	 * 汇总订单总金额
	 */
	public static class SumBolt extends BaseRichBolt{

		private Map stormConf; 
		private TopologyContext context;
		private OutputCollector collector;
		@Override
		public void prepare(Map stormConf, TopologyContext context,
				OutputCollector collector) {
			this.stormConf = stormConf;
			this.context = context;
			this.collector = collector;
		}
		
		double sum = 0;
		@Override
		public void execute(Tuple input) {
			String price = input.getStringByField("actualFee");
			sum+=Double.parseDouble(price);
			System.out.println("订单总金额:"+sum);
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			
		}
	}	
	
	public static void main(String[] args) {
		//注意:同一个topology内部,组件id不能相同,并且id不能以__开头,因为这个是系统保留id
		TopologyBuilder topologyBuilder = new TopologyBuilder();
		topologyBuilder.setSpout("spoutid", new TmallDataSpout());
		topologyBuilder.setBolt("boltid1", new ParseBolt()).shuffleGrouping("spoutid");
		topologyBuilder.setBolt("boltid2", new SumBolt()).shuffleGrouping("boltid1");
		
		LocalCluster localCluster = new LocalCluster();
		String simpleName = LocalTmallTopology.class.getSimpleName();
		Config config = new Config();
		localCluster.submitTopology(simpleName, config, topologyBuilder.createTopology());
	}	

}
  1. 结果:
订单总金额:89.9
订单总金额:288.9
订单总金额:328.79999999999995
订单总金额:495.79999999999995
订单总金额:627.8
订单总金额:875.8
订单总金额:1053.8
订单总金额:1140.7
订单总金额:1218.9
订单总金额:1374.9
订单总金额:1498.9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据014——Storm 简介及入门案例 的相关文章

  • tomcat启动报错:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.Lifec

    tomcat启动报错 xff1a java lang IllegalStateException ContainerBase addChild start org apache catalina Lifec 百度的结果一般都是让修改web
  • UE4 音乐的播放与停止--基于蓝图

    要实现的功能非常简单 xff1a 点击按钮 xff0c 播放音乐 这个功能非常基础 xff0c 就两步 xff1a 1 将音乐源文件拖到context文件夹中 注意 xff0c 这里的音乐文件必须是 wav格式的 2 在按钮的onclick
  • UnityEditor.BuildPlayerWindow+BuildMethodException

    unity3D安卓打包报错 xff1a UnityEditor BuildPlayerWindow 43 BuildMethodException 61 errors at UnityEditor BuildPlayerWindow 43
  • AI 入门怎么学?这份学习指南请收好!

    万事开头难 xff01 AI 入门对很多初学 AI 的同学来说是一大难题 搜集了一大堆入门资料 xff0c Python 数学 深度学习应有尽有 xff0c 但就是无从下手 xff0c 总是在第一章与放弃之间徘徊 那么 xff0c AI 应
  • 为什么越厉害的大厂,校招越不看重考试成绩?

    前几天赵同学告诉我 xff0c 他没有通过那家心仪的公司笔试 赵同学成绩不错 xff0c 每次都是专业前五 xff0c 但笔试中有一道 银行家算法实现 题 xff0c 他一点也没写出来 这就是大厂招聘不看重成绩单的原因 xff1a 招人是为
  • 我的2011——毕业之年的总结与彷徨

    题记 眼看2011即将成为过去 xff0c 难得在这最后的时刻 xff0c 抽点时间 xff0c 倒上一杯热茶 xff0c 回忆这一年的浮浮沉沉 这一年 xff0c 我和所有毕业生一样 xff0c 离开了呆了四年的大学校园 呆腻了校园的生活
  • centos安装anaconda教程

    1 更新yum 命令 xff1a sudo yum update 2 安装anaconda 2 1 查看anaconda对应python版本 我选的3 8版 Old package lists Anaconda documentation
  • Android布局 -- Navigation实现底部导航栏

    底部导航栏加页卡的切换 xff0c 很多App采用这种布局设计 xff0c 在以前的开发中 xff0c 需要自定义底部导航栏以及使用FragmentTransaction来管理Fragment的切换 xff0c 代码量较大 xff0c 而使
  • ViewModelProviders is deprecated

    原有的创建ViewModel的方法 xff1a viewModel 61 ViewModelProviders of this get ViewModel class 提示ViewModelProviders过时 改为 xff1a view
  • Android Fragment退出 返回上一个Fragment与直接退出

    例如应用底部有两个导航按钮A与B xff0c 刚进入的时候显示为第一个AFragment xff0c 点击B切换到BFragment 如果需求是在BFragment点击返回键回到AFragment xff0c 需要配置 app defaul
  • Android基础 -- 子线程可以修改UI吗?

    子线程可以修改UI吗 xff1f 为什么会产生这样的问题 xff0c 可能是因为在开发过程中遇到了 34 Only the original thread that created a view hierarchy can touch it
  • leetcode 417. 太平洋大西洋水流问题

    https leetcode cn com problems pacific atlantic water flow 思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域 DFS public List lt
  • Android模拟器检测常用方法

    在Android开发过程中 xff0c 防作弊一直是老生常谈的问题 xff0c 而模拟器的检测往往是防作弊中的重要一环 xff0c 接下来有关于模拟器的检测方法 xff0c 和大家进行一个简单的分享 1 传统的检测方法 传统的检测方法主要是
  • RecyclerView 隐藏部分分割线

    在项目中遇到复杂点的RecyclerView xff0c 可能会有隐藏部分分割线的需求 xff0c 例如item1和item3之间的分割线隐藏 xff0c item4和item5之间的分割线隐藏等 在看了文档里的ItemDecoration
  • 浅谈去中心化应用

    1 中心化应用 现在我们所使用的应用基本上都是中心化的应用 xff0c 什么是中心化应用呢 xff0c 举个栗子 xff0c 我们在天猫买东西的时候 xff0c 需要先付款给支付宝 xff0c 然后卖家发货 xff0c 我们确认收货之后 x
  • Java二分搜索树及其添加删除遍历

    对于树这种结构 xff0c 相信大家一定耳熟能详 xff0c 二叉树 二分搜索树 AVL树 红黑树 线段树 Trie等等 xff0c 但是对于树的应用以及编写一棵解决特定问题的树 xff0c 不少同学都会觉得不是一件简单的事情 xff0c
  • 游戏平台SDK设计和开发之旅——XSDK功能点梳理

    做游戏开发或者相关工作的同学 xff0c 可能都知道 xff0c 在游戏上线之前 xff0c 需要将游戏分发到各大渠道平台 xff0c 比如九游 xff0c 百度 xff0c 360 xff0c 华为等等 其中和技术相关的事情 xff0c
  • 谈谈 GitHub 开放私有仓库一事的影响

    GitHub 此次宣布免费开放私有仓库 xff0c 在我看来有以下几点影响 xff1a 缓和与同类产品间的竞争压力小部分个人项目由开源转闭源微软在技术社区中的企业形象进一步强化为未来的企业服务预热 下面根据以上几点 xff0c 我来简单谈下
  • 每天坚持刷 LeetCode 的人,究竟会变得有多强... 学习技巧都藏在这几个公众号里面了......

    信息爆炸时代 xff0c 与其每天被各种看过就忘的内容占据时间 xff0c 不如看点真正对你有价值的信息 xff0c 下面小编为你推荐几个高价值的公众号 xff0c 它们提供的信息能真正提高你生活的质量 人工智能爱好者社区 专注人工智能 机
  • 超酷炫!智能无人机中文教程重磅上线!

    前 言 对于大多数无人机爱好者来说 xff0c 能自己从头开始组装一台无人机 xff0c 之后加入 AI 算法 xff0c 能够航拍 xff0c 可以目标跟踪 xff0c 是心中的梦想 并且 xff0c 亲自从零开始完成复杂系统 xff0c

随机推荐

  • B 站硬件大佬又在 GitHub 上开源了一款神器...

    公众号关注 GitHubDaily 设为 星标 xff0c 每天带你逛 GitHub xff01 转自量子位 这次 xff0c 野生钢铁侠稚晖君带着他的硬核项目又来了 上次自制纯手工打造 AI 小电视 xff0c 播放量就超过 300 万
  • 用 C 语言来刷 LeetCode,网友直呼:那是真的牛批...

    公众号关注 GitHubDaily 设为 星标 xff0c 每天带你逛 GitHub xff01 大家好 xff0c 我是小 G 如果你是计算机科班出身 xff0c 那么 C 语言 xff0c 估计是你在初入编程时 xff0c 最早接触的编
  • 【pytorch torchvision源码解读系列—3】Inception V3

    框架中有一个非常重要且好用的包 xff1a torchvision xff0c 顾名思义这个包主要是关于计算机视觉cv的 这个包主要由3个子包组成 xff0c 分别是 xff1a torchvision datasets torchvisi
  • 【pytorch torchvision源码解读系列—5】DenseNet

    pytorch框架中有一个非常重要且好用的包 xff1a torchvision xff0c 顾名思义这个包主要是关于计算机视觉cv的 这个包主要由3个子包组成 xff0c 分别是 xff1a torchvision datasets to
  • Eclipse使用JDBC方式连接SQLServer2016

    Eclipse使用JDBC方式连接SQLServer2016 今天下午在查找很多JDBC连接SQL时发现大多数都是2012甚至更久以前的版本 xff0c 所以就此把步骤记录下来 xff0c 以免自己下次使用又忘记了 在连接的时候 xff0c
  • 魔改《自动化学报》Latex模板

    想用latex写一个中文文档 xff0c 看上了 自动化学报 的模板 xff0c 感觉不错 xff0c 下载下来在本地的tex live上编译 xff0c 报了一大串错 xff1b 上传到overleaf xff0c 还是报错 xff1b
  • TX2安装jetpack

    目前官网支持的下载为JetPack L4T 3 2 1 linux x64 b23和JetPack L4T 3 3 linux x64 b39 首先使用具有Ubuntu16 04的host主机 xff08 我使用的是个人笔记本 xff0c
  • TF-IDF算法

    TF IDF算法 TF IDF term frequency inverse document frequency 是一种用于信息检索与数据挖掘的常用加权技术 xff0c 常用于挖掘文章中的关键词 xff0c 而且算法简单高效 xff0c
  • 大数据009——MapReduce

    分布式离线计算框架MapReduce MapReduce是一种编程模型 Hadoop MapReduce采用Master slave 结构 只要按照其编程规范 xff0c 只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序
  • MapReduce实例——wordcount(单词统计)

    1 MR实例开发整体流程 最简单的MapReduce应用程序至少包含 3 个部分 xff1a 一个 Map 函数 一个 Reduce 函数和一个 main 函数 在运行一个mapreduce计算任务时候 xff0c 任务过程被分为两个阶段
  • MapReduce实例——好友推荐

    1 实例介绍 好友推荐算法在实际的社交环境中应用较多 xff0c 比如qq软件中的 你可能认识的好友 或者是Facebook中的好友推介 好友推荐功能简单的说是这样一个需求 xff0c 预测某两个人是否认识 xff0c 并推荐为好友 xff
  • Hadoop源码分析——JobClient

    1 MapReduce作业处理过程概述 当用户使用Hadoop的Mapreduce计算模型来进行处理问题时 xff0c 用户只需要定义所需的Mapper和Reduce处理函数 xff0c 还有可能包括的Combiner Comparator
  • 大数据010——Hive

    1 Hive 概述 Hive 是建立在 Hadoop 上的数据仓库基础构架 它提供了一系列的工具 xff0c 可以用来进行数据提取转化加载 xff08 ETL xff09 xff0c 这是一种可以存储 查询和分析存储在 Hadoop 中的大
  • 大数据011——Sqoop

    1 Sqoop 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具 它是用来从关系数据库如 xff1a MySQL xff0c Oracle到Hadoop的HDFS xff0c 并从Hadoop的文件系统导出数据到关系数
  • 大数据012——HBase

    1 HBase 简介 HBase Hadoop Database xff0c 是一个高可靠性 高性能 面向列 可伸缩 实时读写的分布式数据库 xff1b 在Hadoop生态圈中 xff0c 它是其中一部分且利用Hadoop HDFS作为其文
  • Hadoop源码分析——MapReduce输入和输出

    Hadoop中的MapReduce库支持集中不同的格式的输入数据 例如 xff0c 文本模式的输入数据的每一行被视为一个key value键值对 key是文件的偏移量 xff0c value是那一行的内容 另一种常见的格式是以key进行排序
  • 大数据013——Flume

    1 Flume 简介 Flume是由Cloudera软件公司提供的一个高可用的 xff0c 高可靠的 xff0c 分布式的海量日志采集 聚合和传输的系统 xff0c 后与2009年被捐赠了apache软件基金会 xff0c 为hadoop相
  • Hadoop源码分析——计算模型MapReduce

    MapReduce 是一个计算模型 xff0c 也是一个处理和生成超大数据集的算法模型的相关实现 用户首先创建一个Map函数处理一个基于key value pair的数据集合 xff0c 输出中间的基于 key value pair 的数据
  • 从SDLC到DevSecOps的转变

    OSSTMM 根据开源安全测试方法手册OSSTMM Open Source Security Testing Methodology Manual 的表述 安全测试包括但不限于以下几种做法 漏洞扫描 安全扫描 渗透测试 风险评估 安全审核
  • 大数据014——Storm 简介及入门案例

    分布式实时数据处理框架 Storm 1 Storm简介与核心概念 1 1 Storm 简介 全称为 Apache Storm xff0c 是一个分布式实时大数据处理系统 它是一个流数据框架 xff0c 具有最高的获取率 它比较简单 xff0