动手实现第一个Hadoop程序的扩展

自己动手写爬虫 一:全面剖析网络爬虫URI: web上各种可用的资源,如HTML文档,图像,视频,程序等都由一个通用资源标志符(URI)进行定位。 URI通常三部分组成: 1.访问资源的命令机制 2.存放资源的主机名 3.资源自身的名称,由路径表示 文件的URL: 用URL表示文件时,服务器方式用file表示,后面要有IP地址,文件的存取路径(即目录)和文件名等信息。有时可省略目录和文件名,但“/”符 阅读详情

上篇文章简单总结了一下,在独立模式下实现测试第一个MapReduce程序,下面算是对上篇文章的一个补充吧。

主要 分为  Hadoop横向扩展、combiner函数、Hadoop Streaming 三个部分。

1 Hadoop横向扩展

    前面介绍了 MapReduce针对少量数据是如何工作的,当我们有大量的输入数据流时,为了实现横向扩展,我们需要把数据存储在分布式分拣系统中(典型的是HDFS),通过使用Hadoop资源管理系统YARN,Hadoop可以将MapReduce计算转移到存储有部分数据的各台机器上。

我们可以通过数据流查看具体过程。

    MapReduce作业(job):客户端需要执行的一个工作单元,包括输入数据、MapReduce程序、配置信息。

                                            作业又可分为若干个任务(task)来执行,包括map 任务和reduce任务。

    输入分片(input split):Hadoop将MapReduce的输入数据划分成等长的小数据块。一个分片对应一个map任务。

如何决定输入分片的大小?

一般来说,分片切分的越细,集群的负载平衡的质量会更高。但是,反过来讲,如果分片太小,那么管理分片的总时间和构建map任务的总时间将决定整个执行时间。对于大多数作业来说,一个合理的分片大小趋向于一个HDFS数据块的大小,默认是128M,不过可以调整。

为什么最佳大小应该与块大小相同?

因为它是确保可以存储在单个节点上的最大输入块的大小。如果分片跨越两个数据块,那么对于任何一个HDFS节点,基本上都不太可能同时存储这两个数据块,因此分片中的部分数据可能需要网络传输到map任务运行的节点,这违背了“数据本地化优化”原则(Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为这样无需使用宝贵的集群带宽资源)。

为何map任务将其输出写入本地硬盘而非HDFS?

因为map的输出是中间结果,该结果由reduce任务处理后才产生最终结果,而且一旦作业完成,map的输出结果就可以删除。因此,如果把它存储在HDFS中并实现备份,难免小题大做。如果运行map的任务在将输出纯送给reduce任务之前失败,那么Hadoop经在另一个节点上重新运行map任务以再次获得map任务中间结果。

reduce任务并不具备数据本地化的优势,因为其输入通常来自于所有map任务的输出。排过序的 map输出需要通过网络传输发送到reduce任务的节点。数据在reduce端合并,然后有用户定义的reduce函数处理,reduce的输出通常存储在HDFS以实现可靠存储,对于每个reduce输出的HDFS块,第一个副本存储在本地节点上,其他节点处于可靠性考虑存储在其他机架的节点中。

注意,reduce任务的数量并非输入数据的大小决定,相反是独立指定的。

若果有多个reduce任务,那么map任务会针对输出进行分区(partition),即为每一个reduce任务建一个分区。分区可由用户定义的分区函数控制,但通常用默认的partitioner通过哈希函数分区 ,很高效。

默认的partitioner是HashPartitioner,它对每条记录的键进行哈希操作,以决定该条记录属于哪个分区。每个分区由一个reduce任务处理,所以分区数等于作业的reduce任务数。

public class HashPartitioner<K,V> extends Partitioner<K,V>{
    public int getPartition(K key,V value,int numPartitions){
        return (key.hashCode() & Integer.MAX_VALUE) % numPartitions;
    }
}

可以看出,键的哈希码被转换为一个非负整数,它由键的哈希值与最大的整数值做一次按位与操作获得,然后用分区数进行取模操作,得到记录属于哪个分区。默认情况下,只有一个reducer,因此也只有一个分区。

为一个作业选择多少reducer,由于并行化程度的提高,增加reducer的数量能缩短reduce的过程,然而,如果做过了,小文件将会更多,这又不够优化,一条经验法则是:目标reduce保持在每个运行5分钟左右,且产生至少一个HDFS块的输出比较合适。

下面是 一个reduce任务的MapReduce数据流、多个reduce任务的数据流、无reduce任务的MapReduce数据流

其中,虚线框表示节点,虚线箭头表示节点内部的数据传输,而实线箭头表示不同节点之间的数据传输。



  图1 .一个reduce任务的MapReduce数据流

  

  图2. 多个reduce任务的数据流

  

  图3. 无reduce任务的MapReduce数据流 

2 combiner函数

集群中的可用带宽限制了MapReduce作业的数量,因此应尽量避免map和reduce任务之间的数据传输。Hadoop允许用户针对map任务的输出指定一个combiner,combiner的输出作为reduce函数的输入。

举例说明:(还是之前那个测试程序的例子)

假设第一个map的输出如下:

(1950,0)

(1950,20)

(1950,10)

第二个map的输出如下:

(1950,25)

(1950,15)

reduce函数被调用时,输入如下:

(1950,[0,20,10,25,15])

因为25是输入数据中最大的,所以输出 25

我们可以像使用reduce函数那样,使用combiner函数找到每个map输出的最大值,然后传递给reduce任务,如此,reduce函数将接受如下:

(1950,[20,25])

可以发现,reduce的输出还是和之前一致 25.可以通过以下表达式说明函数调用:

max(0,20,10,25,15) = max(max(0,20,10),max(25,15)) = max(20,25) = 25

注意,并不是所有函数都具有这样的性质。例如。如果求平均气温,就不能用mean函数作为combiner:

mean(0,20,10,25,15) = 14

但是 mean(mean(0,20,10),mean(25,15))  = mean(10,20) = 15

combiner不能取代reduce。因为我们仍需要reduce处理不同map输出的相同键的记录。

指定一个combiner

可以通过job对象的setCombinerClass()方法实现为作业指定combiner,例如,我们上篇的测试程序可以指定reduce函数作为

combiner:

job.setCombinerClass(MaxTemperatureReducer.class);
3 Hadoop Streaming

Hadoop 提供了 MapReduce的API,允许使用非java的其他语言实现自己的map和reduce函数。

Hadoop Streaming 使用 UNIX标准流作为 Hadoop和 应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入输出流来写MapReduce程序。

Streaming 天生适合文本处理,map的输入数据通过标准输入流传递给map函数,并且是一行一行的传输,最后将结果行写到标准输出。map输出的键-值对是以制表符分割的行,reduce函数的输入与之相同。reduce函数通过标准输入流读取数据,注意,该输入已由Hadoop框架根据键拍过序,最终将结果写入标准输出。

下面按Streaming重写按年份查找最高气温的MapReduce程序(输出结果应该和上篇的结果一致)

本人对python比较熟悉,故只展示了Python版(书中另附有Ruby版)

查找最高气温的map函数:(max_temperature_map.py)

#!/usr/bin/python

import sys
import re

for line in sys.stdin:
    val = line.strip()
    (year,temp,q) = (val[15:19],val[87:92],val[92:93])
    if (temp != "+9999" and re.match("[01459]",q)):
        print "%s\t%s" % (year,temp)


查找最高气温的reduce函数:(max_temperature_reduce.py)

#!/usr/bin/python

import sys

(last_key,max_val) = (None,-sys.maxint)
for line in sys.stdin:
	(key,val) = line.strip().split("\t")
	#存储最后一个键以及迄今为止看到的该键的最高气温,MapReduce框架决定了键的有序性,所以当遇到一个不同的键时,就需要开始处理一个新的键组
	if last_key and last_key != key:
		print "%s\t%s" % (last_key,max_val)
		(last_key,max_val) = (key,int(val))
	else:
		(last_key,max_val) = (key,max(max_val,int(val)))
#确保处理完最后一个键组时会有一行输出
if last_key:
	print "%s\t%s" % (last_key,max_val)

测试运行:(sample.txt还是之前那个测试样例,并且和两个Python程序放在同一目录下)

cat sample.txt | ./max_temperature_map.py | sort | ./max_temperature_reduce.py


可以看到结果与上一篇的测试结果相同。

可以看到 ,map和reduce之间与sort处理,这也是MapReduce框架需要保证键的有序性。



参考:《Hadoop权威指南》






告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置) 本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。 阅读详情

相关推荐

别再为Power BI瀑布图发愁了!用这个DAX公式+堆积柱状图,5分钟搞定现金流量表可视化

本文介绍了一种使用DAX公式和堆积柱状图快速实现Power BI现金流量表可视化的高效方法。通过详细的步骤和代码示例,帮助财务分析人员5分钟内完成专业级报表制作,解决传统瀑布图配置复杂、灵活性差的问题,显著提升工作效率。

weixin_28677005的博客 246

Hadoop之HDFS扩容方法

HDFS就是用来存取数据的,那么当数据太多的时候存不下,我们必需扩充硬盘容量,或者换个更大的硬盘。 由于它是分布式文件系统,有两种扩充HDFS集群容量的方法:横向扩容和纵向扩容 横向扩容 横向扩容就是往集群添加一个节点:https://www.cnblogs.com/lyx666/p/12361906.html 纵向扩容 纵向扩容就是往节点增加一块硬盘:步骤如下 1.虚拟机添加一块20G的硬盘 2.查看添加虚拟机的硬盘 这台添加的第二块硬盘 所以硬盘文件是sdc 3.使用fdisk创建分区...

gman344的博客 1241

Android无线调试:adb tcpip连接实战指南

本文详细介绍了Android无线调试的完整流程,重点讲解如何使用adb tcpip命令通过Wi-Fi连接设备,摆脱数据线束缚。涵盖环境配置、连接实战、稳定性优化及常见问题排查,帮助开发者高效实现无线adb调试,提升工作效率。

pink的博客 721

大数据技术之Hadoop(MapReduce)

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。1)什么是序列化序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。2)为什么要序列化。

成长过程 2090

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

水文模型大合集---SWAT模型、VIC模型、HEC-HMS模型、HSPF模型、FVCOM模型、Delft3D模型、HYPE模型.......

1.1 面源污染概要1.2 SWAT模型及应用1.3 SWAT模型原理1.4 SWAT模型输入文件1.5 ArcGIS与SWAT关系。

jwwkyjspt的博客 4359

HDFS容量究竟来自何处?以及在节点内部“横向”扩容

今天在Ambari web界面中注意到警告: 我去,使用了92%,这还得了?还让不让人学习了? 最开始我认为是一前朋友将namenode节点也设置为了datanode节点的原因,导致namenode“压力”大。但是细一看,不对啊,也不可能才52.7GB总容量啊,开玩笑呢。 于是乎怀疑Ambari。。。去50070一看: 纳闷了,怎么这么少?然后查看了各个机器的硬盘信息 发现两个

王某的博客 1326

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4867

关系型数据库横向扩展的三种方法

本文是 Oracle Coherence 3.5一书,第一章: Achieving Performance, Scalability, and Availability Objectives,第二节:Achieving scalability中,数据库横向扩展部分的读书笔记。传统的关系型数据库很难扩展,通常是纵向扩展,但到达一定程度时只能横向扩展。数据库的横向扩展支持三种方法,即主从复制,集群和分片

In-Memory Computing Technology 1万+

AD7768与STM32F439的硬件设计避坑指南:如何优化高精度ADC系统的电源与PCB布局

本文详细解析了AD7768与STM32F439在高精度ADC系统硬件设计中的关键问题与优化方案。从电源系统设计、PCB布局到基准电压选型,提供了实用的避坑指南和实测数据,帮助工程师提升系统性能至110dB动态范围。特别强调了SPI信号布线和电源滤波对ADC精度的重要影响。

sugar的博客 735

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1253

hadoop集群动态扩展

Hadoop集群节点的动态增加与删除 Hadoop集群节点的动态增加 1. 安装配置节点 具体过程参考 《Hadoop集群实践 之 (1) Hadoop(HDFS)搭建》 2. 在配置过程中需要在所有的Hadoop服务器上更新以下三项配置 $ sudo vim /etc/hadoop/conf/slaves hadoop-node-1 hadoop-node-2 hadoop-

neutrojan的专栏 8503

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

hadoop之mapreduce的wordcount程序(10)

目录MapReduce入门1.MapReduce定义2.MapReduce优缺点优点缺点3. MapReduce核心思想4.MapReduce进程5.MapReduce编程规范 开局一把刀,装备全靠打。 我们开局先讲概念,然后执行下hadoop自带的一个wordcount程序,相当于我们java中的hello word。 然后自己动手写个wordcount程序,在win10下看下效果,最后部署到服...

baidu_21349635的专栏 728

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

我是怎么玩hadoop的(一)--运行自己的mapreduce

单拿标题来讲,看来有点装x,但是没有恶意,知识记录自己的学习过程,希望能碰到一些志同道合的人,一起讨论。 首先,我们要理解:什么是hadoop?给人的第一感觉就一个字“云”,似乎带着点神奇的色彩,不可否认hadoop有他独特的地方,但也没那么神乎其神。他是一个开源框架,可以编写和运行分布式应用处理大规模数据,通过建立hadoop集群和运行一些mapred例子,我所感到只有就个字:“方便”、“健壮...

数据库天地 268

Hadoop组成架构

Hadoop组成架构 Hadoop是apache用来“处理海量数据存储和海量数据分析”的分布式系统基础架构,更广义的是指hadoop生态圈。 Hadoop的优势   高可靠性:hadoop底层维护多个数据副本,即使某个计算单元故障,也不会导致数据丢失。   高扩展性:天然支持分布式,可方便的扩展至几千个节点。   高容错性:能够自动将失败的任务重新分配。   高效性:在mapReduce的思想下,hadoop是并行工作处理任务的。 Hadoop1.x和Hadoop2.x的区别 MapReduce架构概述

LL0911的博客 517

python写的hadoop实战_hadoop实战 pdf

hadoop实战手册为3个部分,深入浅出地介绍了Hadoop 框架、编写和运行Hadoop 数据处理程序所需的实践技能及Hadoop之外更大的生态系统。本书适合需要处理大量离线数据的云计算程序员、架构师和项目经理阅读参考。hadoop实战手册目录第1章 Hadoop简介1.1 为什么写《Hadoop 实战》1.2 什么是Hadoop1.3 了解分布式系统和Hadoop1.4 比较SQL 数据库和H...

weixin_39580748的博客 351

惊了!!! 小白零基础学java (月薪过万是你的梦想嘛) 手把手教学 就怕你不动手【一】

1. 如何 从零基础入门学好Java! 可能你心里在想啊 好难啊! 没关系 你跟随我的脚步走。 2. 认识单词很重要 但是你别怕 (我们可以一天学5个 或者10个) 初始Java 1.1 程序是什么? 生活中的程序:为了达成某个目的,所执行的固定的一系列步骤和流程。 例如:银行办卡 医院看病 大象放进冰箱 请假 结婚 … 计算机中的程序: 计算机指令的集合,为了达成某个目的,将一...

dwwen的博客 4775

java hadhoop如门pdf_《Hadoop实战》PDF 下载

《Hadoop实战》PDF 下载转载自:https://download.youkuaiyun.com/download/xieze9994/10860623下载地址:版权归出版社和原作者所有,链接已删除,请购买正版图书简介:作为云计算所青睐的分布式架构,Hadoop 是一个用Java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,是谷歌实现云计算的重要基石。本书分为3个部分,深入浅出...

weixin_42398130的博客 236

[Hadoop in Action] 第1章 Hadoop简介

编写可扩展、分布式的数据密集型程序和基础知识 理解Hadoop和MapReduce 编写和运行一个基本的MapReduce程序 1、什么是Hadoop Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据。 Hadoop与众不同之处在于以下几点: 方便——Hadoop运行在由一般商用机器构成的大型集群上,或者云计算服务之上; 健壮——H...

weixin_33895695的博客 171

揭开Hadoop的面纱

Written by chenxiaochen32 ,SCUTMSTechClub Hadoop Special Interest Group. 一个hadoop集群拥有许多并行的计算机,用以存储和处理大规模数据集,分布式系统是向外扩展的,当客户端计算机发送作业到计算云时,计算云将会把任务划分到多个节点进行计算,然后节点将计算结果返回到主节点进行统计,再把结果输送给客户端。这也同时说明了,h...

weixin_30399055的博客 73

使用Echatrts+Flask实现新能源车辆数据可视化及学习Hadoop的学习心得

基于Flask+Echarts+Mysql制作分析新能源车辆数据可视化这是一个基本的MySQL、Flask和ECharts结合的图表绘制过程。学习Hadoop是一个令人兴奋和富有挑战性的过程。深入理解分布式计算原理:Hadoop是一个分布式计算框架,学习Hadoop需要深入理解分布式计算的基本原理和概念,如数据分片、数据复制、容错处理等。这对于充分发挥Hadoop的能力至关重要。掌握Hadoop核心组件。

TSKxxx的博客 784
上一篇: 动手实现第一个Hadoop程序(VMware)
下一篇: spark 基于分区操作 mapPartitions
ITrue的天空
博客等级 码龄14年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值