“在过去的几年里生成世界数据的90%。”
由于新技术,设备,和类似的社交网站通信装置的出现,由人类产生的数据的量正在迅速每年都在增长。美国从一开始的时候,直到2003年生产的数据量为5十亿字节。如果堆积在磁盘形式的数据可能填充整个足球场。相同量在每两天创建于2011年,并在每十分钟在2013年该速率仍在增长极大。虽然生产的所有信息是有意义的,在处理时是有用的,它被忽略。
大数据是不能用传统的计算技术来处理大型数据集的集合。它不是一个单一的技术或工具,而它涉及的业务和技术的许多领域。
大数据包括通过不同的设备和应用程序所产生的数据。下面给出的是一些大数据的保护伞下前来字段。
黑匣子数据 :这是直升机,飞机和飞机的,组件等,它抓住了机组人员的声音,麦克风和耳机录音和飞机的性能信息。
社会化媒体数据 :社会化媒体,如Facebook和Twitter保持信息和张贴数百万世界各地的人的意见。
联交所数据 :交易所数据保存有关的“买入”和“卖出”上由客户提出不同的公司的比例作出决策的信息。
电网数据 :电网数据保存由特定节点相对于基站所消耗的信息。
运输数据 :运输数据包括车辆的型号,容量,距离和可用性。
搜索引擎数据 :搜索引擎获取大量来自不同数据库中的数据。
因此,大数据包括体积庞大,高速和可扩展的各种数据。在它的数据将是三种类型。
结构化数据 :关系数据。
半结构化数据 :XML数据。
非结构化数据 :字,PDF,文本,媒体日志。
使用保持Facebook等社交网络中的信息,营销机构了解他们的活动,促销等广告媒介的响应。
在社会化媒体的喜好和他们的消费者的产品认知,产品企业和零售企业利用信息计划生产。
关于使用患者以前的病历资料,医院提供更好的和快速的服务。
大数据的技术是在提供更准确的分析,这可能导致产生更大的操作效率,降低成本,更具体决策重要的,并且减少了为业务风险。
要充分利用大数据的力量,你将需要能够管理和处理实时结构化和非结构化数据的数量巨大,并且可以保护数据隐私和安全的基础设施。
有在市场上的各种技术来自不同的厂商,包括亚马逊,IBM,微软等,以处理大数据。虽然寻找到了处理大数据的技术,我们考察了以下两类技术:
这些包括像的MongoDB系统,提供用于实时运行能力,其中数据主要捕捉和存储互动工作负荷。
NoSQL的大数据系统的设计充分利用已经出现在过去的十年,让大量的计算,以廉价,高效地运行新的云计算架构的优势。这使得运行大数据工作负载,更易于管理,更便宜,更快速地实现。
一些NoSQL系统可以提供深入了解基于与最少的编码和无需数据科学家和增加的基础设施的实时数据模式和趋势。
这些包括像大规模并行处理(MPP)数据库系统和MapReduce提供了可能触及大部分或全部数据的回顾与复杂的分析分析能力的系统。
MapReduce的提供分析数据的基础上的MapReduce可从单个服务器可以按比例放大至数千高端和低端机即由SQL提供的功能,并且一个系统的互补的新方法。
这两类技术是互补的,并经常一起部署。
操作 | 分析 | |
---|---|---|
潜伏 | 1毫秒 - 100毫秒 | 1分钟 - 100分钟 |
并发 | 1000 - 100,000 | 1 - 10 |
访问模式 | 写入和读取 | 读 |
查询 | 选择 | 非选择性 |
数据范围 | 操作 | 回顾 |
最终用户 | 顾客 | 数据科学家 |
技术 | NoSQL的 | MapReduce的,MPP数据库 |
与大数据相关的主要挑战如下:
为了实现上述挑战,企业通常需要企业服务器的帮助。
在这种方法中,一个企业将有一个计算机存储和处理大的数据。对于存储而言,程序员将自己选择的数据库厂商,如Oracle,IBM等的帮助下在这种方法中,用户与应用程序,从而处理数据存储和分析的部分进行互动。
这种方法正常工作与那些处理可以由标准数据库服务器被容纳,或至多被处理数据的处理器的限制少大量数据的应用程序。但是,当涉及到处理大量的可伸缩数据,这是一个忙碌的任务,通过一个单一的数据库瓶颈来处理这些数据。
谷歌使用一种名为MapReduce算法解决了这个问题。这个算法将任务分成小份,并将它们分配到多台计算机,并且收集从他们其结果整合时,形成结果数据集。
使用谷歌提供的解决方案,Doug Cutting开发和他的团队开发的一个开源项目叫做HADOOP。
Hadoop的运行使用的MapReduce算法,其中数据是在与其他并行处理的应用程序。总之,Hadoop是用于开发可以在海量数据进行完整的统计分析应用。
Hadoop是写在允许跨使用简单的编程模型的计算机集群分布的大型数据集的处理Java的Apache的开源框架。 Hadoop框架应用程序可在提供跨计算机集群的分布式存储和计算的环境。 Hadoop是设计用来从单一服务器到上千台机器的扩展,每提供本地计算和存储。
在其核心,Hadoop的即有两个主要层次:
MapReduce的是一个可靠的,容错的方式,以书面的商品硬件在谷歌设计了大量数据的高效处理(多TB数据集)的分布式应用程序,在大型集群(数千个节点)的并行编程模型。 MapReduce的程序在Hadoop是Apache的开源框架运行。
Hadoop分布式文件系统(HDFS)是基于谷歌文件系统(GFS),并提供被设计为在商用硬件上运行分布式文件系统。它与现有的分布式文件系统有许多相似之处。然而,来自其他分布式文件系统的差异显著。它是高度容错并且被设计为部署在低成本的硬件。将其提供给应用程序数据高吞吐量连接,并且适用于具有大数据集的应用程序。
除了上面提到的两个核心组件,Hadoop框架还包括以下两个模块:
Hadoop的常见 :这些是Java库和其他Hadoop的模块所需的工具。
Hadoop的纱 :这是作业调度和集群资源管理的框架。
它是建立与处理大规模加工重配置更大的服务器相当昂贵,但作为一种替代方法,您可以单CPU绑在一起许多商品的电脑,作为一个单一功能的分布式系统,实际上,集群计算机可以读取数据集平行,并提供一个高得多的吞吐量。此外,它是便宜的不止一个高端服务器。因此,这是背后使用Hadoop,它跨越集群和低成本的计算机上运行的第一个激励因素。
Hadoop的运行跨计算机集群代码。该方法包括的Hadoop执行以下核心任务:
Hadoop框架允许用户快速地编写和测试的分布式系统。它是有效的,并在机器和反过来它自动分发数据和工作,利用CPU内核的基本平行度。
Hadoop的不依赖于硬件,以提供容错和高可用性(FTHA),而Hadoop的库本身已被设计成在应用层检测和处理故障。
服务器可以添加或从群集中动态删除和Hadoop继续运行而不中断。
Hadoop的的另一大优势在于,除了是开源的,因为它是基于Java它是在所有的平台兼容。
Hadoop是由GNU / Linux平台和它的味道的支持。因此,我们必须安装Linux操作系统的设置Hadoop的环境。如果你有比Linux等操作系统,你可以在它安装VirtualBox软件,并让Linux VirtualBox的内部。
Hadoop的安装到Linux环境之前,我们需要使用SSH(安全Shell)来设置Linux操作系统。按照有关设置Linux环境下面给出的步骤。
在开始的时候,建议创建一个单独的用户Hadoop的Hadoop的到文件系统从UNIX文件系统隔离开来。按照下面给出创建用户的步骤:
打开Linux终端,然后键入以下命令来创建一个用户。
$ su password: # useradd hadoop # passwd hadoop New passwd: Retype new passwd
SSH设置必须在集群上做不同的操作,如启动,停止,分布式守护shell操作。来验证的Hadoop不同的用户,它需要一个Hadoop的用户提供公共/私有密钥对,并与不同的用户共享。
下面的命令是用于生成使用SSH的键值对。复制公钥形成id_rsa.pub authorized_keys的到,并提供业主与读取和写入权限分别authorized_keys文件。
$ ssh-keygen -t rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
Java是Hadoop的主要先决条件。首先,你应该使用命令“java -version”验证java的存在在你的系统。 Java版本命令的语法如下。
$ java -version
如果一切正常,它会给你下面的输出。
java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b13) Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
如果Java是没有安装在您的系统,然后按照安装Java下面给出的步骤。
下载Java(JDK <最新版本> - X64.tar.gz)通过访问以下链接http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads1880260.html。
随后的jdk-7u71-Linux的x64.tar.gz将被下载到您的系统。
通常你会发现在下载文件夹中下载的Java文件。验证它,并使用以下命令解压的jdk-7u71-Linux的x64.gz文件。
$ cd Downloads/ $ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz $ ls jdk1.7.0_71 jdk-7u71-linux-x64.gz
使Java提供给所有用户,你必须将它移动到的位置“的/ usr /本地/”。打开根目录,键入以下命令。
$ su password: # mv jdk1.7.0_71 /usr/local/ # exit
有关设置PATH和JAVA_HOME变量,添加下面的命令〜/ .bashrc文件。
export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=PATH:$JAVA_HOME/bin
现在从终端验证java -version命令如上述说明。
下载并使用下面的命令,从Apache Software Foundation的Hadoop的提取2.4.1。
$ su password: # cd /usr/local # wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/ hadoop-2.4.1.tar.gz # tar xzf hadoop-2.4.1.tar.gz # mv hadoop-2.4.1
下面的命令用来启动DFS。执行该命令将启动您的Hadoop文件系统。
$ start-dfs.sh
期望的输出如下所示:
10/24/14 21:37:56 Starting namenodes on [localhost] localhost: starting namenode, logging to /home/hadoop/hadoop 2.4.1/logs/hadoop-hadoop-namenode-localhost.out localhost: starting datanode, logging to /home/hadoop/hadoop 2.4.1/logs/hadoop-hadoop-datanode-localhost.out Starting secondary namenodes [0.0.0.0]
下面的命令被用于启动纱线脚本。执行该命令将启动纱守护进程。
$ start-yarn.sh
期望的输出如下:
starting yarn daemons starting resourcemanager, logging to /home/hadoop/hadoop 2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out localhost: starting nodemanager, logging to /home/hadoop/hadoop 2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
访问Hadoop的默认端口号是50070.使用以下网址获得浏览器的Hadoop的服务。
http://localhost:50070/
访问集群中的所有应用程序的默认端口号为8088。使用下列URL访问该服务。
http://localhost:8088/
Hadoop的文件系统使用分布式文件系统的设计开发。它在商用硬件上运行。不像其他的分布式系统,HDFS是高度容错和使用低成本的硬件设计。
HDFS拥有非常庞大的数据量,并提供更容易获得。为了存储这些庞大的数据,这些文件都存储在多台机器。这些文件存储在冗余方式营救从可能的数据损失系统中发生故障的情况下。 HDFS也使得可用于并行处理的应用程序。
给出下面是在Hadoop文件系统的体系结构。
HDFS遵循主从架构,它具有以下元素。
NameNode的是包含GNU / Linux的操作系统和软件名称节点商品硬件。它是一个可以在商用硬件上运行软件。具有名称节点系统作为主服务器,并执行以下任务:
该Datanode的是具有GNU / Linux的操作系统和软件Datanode的商品硬件。对于集群中的每个节点(商品硬件/系统),会有一个Datanode的。这些节点管理其系统的数据的存储。
一般用户数据存储在HDFS的文件。在一个文件系统中的文件将被划分为一个或多个分段和/或存储在个人数据的节点。这些文件段被称为块。换句话说,即HDFS可以读或写数据的最小量被称为块。缺省块大小为64MB,但它可以增加按需要在HDFS配置来改变。
故障检测和恢复 :由于HDFS包括大量的商品硬件,部件故障频繁。因此HDFS应该具有快速和自动故障检测和恢复机制。
庞大的数据集 :HDFS应该有几百个群集节点的管理有着极大的数据集的应用程序。
在硬件数据 :请求的任务,可以有效地进行,当计算需要数据近的地方。特别是在大的数据集都参与,它减少了网络通信量,并增加了吞吐量。
首先,您必须格式化配置的HDFS文件系统,开放式的NameNode(HDFS服务器),然后执行以下命令。
$ hadoop namenode -format
格式化HDFS后,启动分布式文件系统。以下命令将启动名称节点,以及为群集数据节点。
$ start-dfs.sh
装载在服务器中的信息后,我们可以发现文件列表中的目录,文件的状态,使用'ls'的。下面给出的是可以传递给目录或文件名作为参数LS的语法。
$ $HADOOP_HOME/bin/hadoop fs -ls <args>
假设我们有在本地系统,它是所谓file.txt的文件中的数据应当被保存在HDFS文件系统。按照下面给出插入在Hadoop文件系统所需的文件的步骤。
你必须创建一个输入目录。
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input
转让和使用put命令的本地系统,在Hadoop文件系统存储数据文件。
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input
您可以使用ls命令验证文件。
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input
假设我们在HDFS文件名为OUTFILE。下面给出的是从检索在Hadoop文件系统所需的文件,一个简单的演示。
最初,查看使用cat命令从HDFS的数据。
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile
得到HDFS文件使用GET命令在本地文件系统。
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
您可以通过使用以下命令关闭HDFS。
$ stop-dfs.sh
还有在“$ HADOOP_HOME /斌/ Hadoop的FS”,比在这里展示更多的命令,尽管这些基本的操作都将让你开始。没有额外的参数运行./bin/hadoop DFS将列出可与FsShell系统运行的所有命令。此外,$ HADOOP_HOME /斌/ Hadoop的FS -help的CommandName将显示有问题的操作很短的使用摘要,如果你被卡住。
所有的操作的表如下所示。下列约定用于参数:
"<path>" means any file or directory name. "<path>..." means one or more file or directory names. "<file>" means any filename. "<src>" and "<dest>" are path names in a directed operation. "<localSrc>" and "<localDest>" are paths as above, but on the local file system.
所有其他文件和路径名称是指内部HDFS的对象。
命令 | 描述 |
---|---|
-ls <路径> | 列出路径指定的目录中的内容,示出了名称,权限,拥有者,大小和修改日期为每个条目。 |
-lsr <路径> | 行为类似-ls,但递归显示路径的所有子目录项。 |
-du <路径> | 显示磁盘使用情况,以字节为单位,对于所有的文件,这些文件匹配路径;文件名报告与全HDFS协议前缀。 |
-dus <路径> | -du一样,但打印路径中的所有文件/目录的磁盘使用情况的摘要。 |
-mv <来源> <目标> | 移动由src表示的文件或目录 |
到dest,在HDFS。 | |
-cp <来源> <目标> | 副本由src标识的文件或目录什特内HDFS。 |
-rm <路径> | 删除文件或路径标识空目录。 |
-rmr <路径> | 删除路径标识的文件或目录。递归删除所有子条目(例如,文件或路径的子目录)。 |
-put <localSrc> <目标> | 从localSrc标识的本地文件系统中的文件或目录复制到DFS内什特。 |
-copyFromLocal <localSrc> <目标> | 相同-put |
-moveFromLocal <localSrc> <目标> | 从localSrc标识的本地文件系统中的文件或目录复制到HDFS内什特,然后删除成功的本地副本。 |
-get [-CRC] <来源> <localDest> | 份在由src确定由localDest标识的本地文件系统路径HDFS的文件或目录。 |
-getmerge <来源> <localDest> | 检索到由localDest确定的本地文件系统中的单一,合并后的文件的路径SRC在HDFS匹配的所有文件,并复制它们。 |
-cat <filen-AME> | 显示在标准输出文件名的内容。 |
-copyToLocal <来源> <localDest> | 相同-GET |
-moveToLocal <来源> <localDest> | 工程就像-get,但删除HDFS上的成功复制。 |
-mkdir <路径> | 在创建一个HDFS命名的目录路径。 |
创建路径中的任何父目录的缺失(例如,MKDIR -p在Linux中)。 | |
-setrep [-R] [-w]代表<路径> | 设置路径标识来代表文件的目标文件复制因子。 (实际的复制因子会朝着目标随着时间的推移移动) |
-touchz <路径> | 创建在路径包含当前时间作为时间戳的文件。如果失败的文件已经存在路径,除非文件已经是大小为0。 |
- 测试 - [EZD] <路径> | 返回1,如果路径存在;长度为零;或者是一个目录,否则为0。 |
-stat [格式] <路径> | 输出关于路径信息。格式是接受在块文件大小(%b)中,文件名(%N),块大小(‰),复制(%R),和修改日期(%Y,%Y)的字符串。 |
-tail [-f] <file2name> | 显示在标准输出文件的最后1KB。 |
-chmod [-R]模式,模式,... <路径> ... | 更改与路径标识的一个或多个对象相关联的文件权限....与R模式递归执行的变化是一个3位八进制模式,或{} augo +/- {} rwxX。如果没有指定范围,不适用的假设的umask。 |
-chown [-R] [车主] [:[组] <路径> ... | 设置由路径标识的文件或目录所属的用户和/或组....如果指定-R递归集所有者。 |
chgrp命令[-R]组<路径> ... | 设置由路径标识的文件或目录所属组....如果指定-R递归设置组。 |
-help <CMD-名称> | 返回上面列出的命令之一使用信息。在cmd中人物 - 你必须省略开头的''。 |
MapReduce的是使用它我们可以编写应用程序来处理大量的数据,同时,在一个可靠的方式的商品硬件的大型集群的框架。
MapReduce的是一种处理技术和基于Java的分布式计算程序的模型。 MapReduce的算法中包含两个重要的任务,即Map和Reduce。地图采用了一组数据,并将其转换成另一组数据,其中,各个元件被分解成元组(键/值对)的。其次,减少任务,这需要输出从地图作为输入并组合那些数据元组到一个较小的元组的集合。作为MapReduce的暗示的名称的序列中,减少任务总是在地图作业之后进行。
MapReduce的主要优点是,它是在多个计算节点易于大规模数据处理。下MapReduce的模型中,数据处理的原语被称为映射器和减速器。分解数据处理应用到映射器和减速器有时是平凡的。但是,一旦我们谱写的MapReduce形式的应用程序,扩展到运行在几百,几千,或数千台机器甚至几十集群中的应用仅仅是一个配置更改。这个简单的可扩展性是吸引了众多程序员使用的MapReduce模型。
一般来说MapReduce的范例是基于发送计算机数据所在!
MapReduce的程序执行在三个阶段,即映射阶段,洗牌阶段,并降低的阶段。
地图阶段 :地图或映射器的任务是处理输入数据。一般输入数据是在文件或目录的形式,并且被存储在Hadoop的文件系统(HDFS)。输入文件被传递到由线映射器功能线路。映射器处理该数据,并创建数据的几个小块。
减少阶段 :这一阶段是洗牌阶段的组合和减少阶段。减速机的工作是处理来自映射器中的数据。处理之后,它产生一组新的输出,这将被存储在HDFS。
在一个MapReduce工作,Hadoop的发送Map和Reduce任务到集群中的相应的服务器。
框架管理数据传递例如发出任务的节点之间的簇周围的所有细节,验证任务完成,和复制数据。
大部分的计算的需要与对减少网络流量本地磁盘上的数据的节点处。
的给定的任务完成后,将群集收集并降低了数据,以形成一个适当的结果,并且将其发送回Hadoop的服务器。
MapReduce框架上的<键,值>对工作,也就是说,框架的输入看工作作为一组<键,值>对,并产生一组<键,值>对作为作业的输出,可以想象不同的类型。
键和值类应该由框架是序列化的方式,因此,需要实现可写的接口。此外,key类必须实现可写可比接口,方便框架执行排序。输入和输出类型MapReduce的工作:(输入)<K1,V1> - >地图 - > <K2,V2> - >减少 - > <K3,V3>(输出)。
输入 | 产量 | |
---|---|---|
地图 | <K1,V1> | 列表(<K2,V2>) |
减少 | <K2,列表(V2)> | 列表(<K3,V3>) |
有效负载 -应用程序实现地图和减少功能,形成工作的核心。
映射 -映射INPUT键/值对映射到一组中间键/值对。
NamedNode -节点,管理Hadoop分布式文件系统(HDFS)。
DataNode会 -节点,在数据被提前给出任何处理发生之前。
MasterNode -节点,在运行的JobTracker和接受来自客户端作业请求。
SlaveNode -节点,在Map和Reduce程序运行。
JobTracker的 -调度作业并跟踪工作指派给任务跟踪器。
任务追踪 -跟踪任务和报告状态的JobTracker。
招聘 -程序是跨数据集的映射和减速的执行。
任务 -一个映射的执行或数据的切片一个减速。
任务尝试 -试图在SlaveNode执行任务的特定实例。
给出下面是关于一个组织的电力消耗的数据。它包含每月的电力消耗,年均各种年。
一月 | 二月 | 损伤 | 四月 | 可能 | 君 | 七月 | 八月 | 九月 | 十月 | 十一月 | 十二月 | 平均 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1979年 | 23 | 23 | 2 | 43 | 24 | 25 | 26 | 26 | 26 | 26 | 25 | 26 | 25 |
1980年 | 26 | 27 | 28 | 28 | 28 | 三十 | 31 | 31 | 31 | 三十 | 三十 | 三十 | 29 |
1981年 | 31 | 32 | 32 | 32 | 33 | 34 | 35 | 36 | 36 | 34 | 34 | 34 | 34 |
1984年 | 39 | 38 | 39 | 39 | 39 | 41 | 42 | 43 | 40 | 39 | 38 | 38 | 40 |
1985年 | 38 | 39 | 39 | 39 | 39 | 41 | 41 | 41 | 00 | 40 | 39 | 39 | 45 |
如果上述数据作为输入,我们必须编写应用程序来处理它而产生的结果,如发现最大使用量,最低使用年限的一年,依此类推。这对于有限数目的记录程序员轻易获胜。他们会简单地写,以产生所需的输出的逻辑和数据传递给写入的应用程序。
但是,认为代表一个特定国家的一切大规模产业的电力消耗数据,因为它的形成。
当我们编写应用程序来处理这样的大量数据,
要解决这些问题,我们有MapReduce框架。
上述数据保存为sample.txt的和作为输入给出。输入文件看起来如下所示。
1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45
下面给出的是程序使用MapReduce框架样本数据。
package hadoop; import java.util.*; import java.io.IOException; import java.io.IOException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; public class ProcessUnits { //Mapper class public static class E_EMapper extends MapReduceBase implements Mapper<LongWritable , Text, Text, IntWritable> { //Map function public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.toString(); String lasttoken = null; StringTokenizer s = new StringTokenizer(line," "); String year = s.nextToken(); while(s.hasMoreTokens()){lasttoken=s.nextToken();} int avgprice = Integer.parseInt(lasttoken); output.collect(new Text(year), new IntWritable(avgprice)); } } //Reducer class public static class E_EReduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable > { //Reduce function public void reduce( Text key, Iterator <IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int maxavg=30; int val=Integer.MIN_VALUE; while (values.hasNext()) { if((val=values.next().get())>maxavg) { output.collect(key, new IntWritable(val)); } } } } //Main function public static void main(String args[])throws Exception { JobConf conf = new JobConf(Eleunits.class); conf.setJobName("max_eletricityunits"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(E_EMapper.class); conf.setCombinerClass(E_EReduce.class); conf.setReducerClass(E_EReduce.class); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class); FileInputFormat.setInputPaths(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); JobClient.runJob(conf); } }
保存上述程序作为ProcessUnits.java。汇编和程序的执行进行说明。
让我们假设我们是在一个Hadoop的用户(例如/家庭/ Hadoop的)的主目录。
按照下面给出的编译和执行上述程序的步骤。
下面的命令是创建一个目录来存储编译的Java类。
$ mkdir units
下载Hadoop的芯1.2.1.jar,其用于编译和执行的MapReduce程序。访问以下链接http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/1.2.1下载JAR。让我们假设下载的文件夹是/ home / Hadoop的/。
下面的命令用于编译ProcessUnits.java程序,并为该程序创建一个罐子。
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java $ jar -cvf units.jar -C units/ .
下面的命令用于创建HDFS中输入目录。
$HADOOP_HOME/bin/hadoop fs -mkdir input_dir
下面的命令用于复制名为SAMPLE.TXT在HDFS中的输入目录中的输入文件。
$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir
下面的命令被用来验证在输入目录中的文件。
$HADOOP_HOME/bin/hadoop fs -ls input_dir/
下面的命令被用于通过从输入目录取输入文件来运行Eleunit_max应用。
$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir
直到执行文件,稍等片刻。执行之后,如下所示,输出将包含输入分割的,数量,地图的任务数,减速器任务的数量等。
INFO mapreduce.Job: Job job_1414748220717_0002 completed successfully 14/10/31 06:02:52 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=61 FILE: Number of bytes written=279400 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=546 HDFS: Number of bytes written=40 HDFS: Number of read operations=9 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=2 Launched reduce tasks=1 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=146137 Total time spent by all reduces in occupied slots (ms)=441 Total time spent by all map tasks (ms)=14613 Total time spent by all reduce tasks (ms)=44120 Total vcore-seconds taken by all map tasks=146137 Total vcore-seconds taken by all reduce tasks=44120 Total megabyte-seconds taken by all map tasks=149644288 Total megabyte-seconds taken by all reduce tasks=45178880 Map-Reduce Framework Map input records=5 Map output records=5 Map output bytes=45 Map output materialized bytes=67 Input split bytes=208 Combine input records=5 Combine output records=5 Reduce input groups=5 Reduce shuffle bytes=6 Reduce input records=5 Reduce output records=5 Spilled Records=10 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=948 CPU time spent (ms)=5160 Physical memory (bytes) snapshot=47749120 Virtual memory (bytes) snapshot=2899349504 Total committed heap usage (bytes)=277684224 File Output Format Counters Bytes Written=40
下面的命令被用来验证在输出文件夹的结果文件。
$HADOOP_HOME/bin/hadoop fs -ls output_dir/
下面的命令来查看部分-00000的文件输出。此文件由HDFS产生。
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
下面是由MapReduce的程序所产生的输出。
1981 34 1984 40 1985 45
下面的命令用于从HDFS输出文件夹复制到本地文件系统的分析。
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop
所有的Hadoop命令由$ HADOOP_HOME /斌/ Hadoop的命令调用。不带任何参数运行的Hadoop脚本会打印所有命令的描述。
用法 :hadoop的[--config confdir]命令
下表列出了可用的选项及其说明。
选项 | 描述 |
---|---|
NameNode的-format | 格式化DFS文件系统。 |
secondarynamenode | 运行DFS二次名称节点。 |
名称节点 | 运行DFS名称节点。 |
数据节点 | 运行一个DFS的Datanode。 |
dfsadmin | 运行DFS管理客户端。 |
mradmin | 运行地图,减少管理客户端。 |
fsck的 | 运行DFS文件系统检查工具。 |
FS | 运行一个通用的文件系统的用户客户端。 |
平衡器 | 运行的集群平衡工具。 |
OIV | 适用于离线的FsImage观众的的FsImage。 |
fetchdt | 获取来自NameNode的一个代表团令牌。 |
的JobTracker | 运行MapReduce工作跟踪节点。 |
管道 | 运行一个管道的工作。 |
的TaskTracker | 运行MapReduce的任务跟踪节点。 |
historyserver | 运行作业历史记录服务器作为一个独立的守护进程。 |
工作 | 操纵MapReduce工作。 |
队列 | 获取有关JobQueues信息。 |
版 | 打印版本。 |
罐子<瓶> | 运行一个jar文件。 |
DistCp使用<srcurl> <desturl> | 复制文件或目录的递归。 |
distcp2 <srcurl> <desturl> | DistCp使用第2版。 |
归档-archiveName名-p | 创建一个Hadoop的归档。 |
<父路径> <来源> * <目标> | |
类路径 | 打印得到Hadoop的罐子和所需要的库所需的类路径。 |
daemonlog | 获取/设置日志级别,每个守护进程 |
用法:Hadoop的工作[GENERIC_OPTIONS]
以下是在Hadoop作业的可用通用的选项。
GENERIC_OPTIONS | 描述 |
---|---|
-submit <作业文件> | 提交作业。 |
状态<作业ID> | 打印地图和减少完工百分比且所有作业计数器。 |
反<作业ID> <组名> <countername> | 打印的计数器值。 |
-kill <作业ID> | 杀死作业。 |
-events <作业ID> <fromevent - #> <# - 的事件> | 通过打印为JobTracker的给定范围内收到的事件“的详细信息。 |
-history [全部] <jobOutputDir> - 历史<jobOutputDir> | 打印作业的详细信息,没打死尖的细节。有关作业,如每个任务取得成功的任务和任务尝试更多的细节可以通过指定[全部]选项查看。 |
-list [全部] | 显示所有作业。那还-list只显示作业完成。 |
-kill任务<任务ID> | 杀死任务。打死任务不会计入失败的尝试。 |
-fail任务<任务ID> | 失败的任务。失败的任务计入 |
失败的尝试。 | |
设置优先级<作业ID> <优先级> | 改变作业的优先级。允许的优先级值是VERY_HIGH,高,中,低,VERY_LOW |
$ $HADOOP_HOME/bin/hadoop job -status <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -status job_201310191043_0004
$ $HADOOP_HOME/bin/hadoop job -history <DIR-NAME> e.g. $ $HADOOP_HOME/bin/hadoop job -history /user/expert/output
$ $HADOOP_HOME/bin/hadoop job -kill <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -kill job_201310191043_0004
Hadoop的数据流是自带的Hadoop发行的实用程序。此实用程序允许您创建和运行地图/任何可执行文件或脚本映射器和/或减速Reduce作业。
对于Hadoop的数据流,我们所考虑的字计数问题。 Hadoop中的任何作业必须有两个阶段:映射器和减速。我们已经编写代码映射器和python脚本减速到Hadoop的下运行它。一个也可以写在Perl和Ruby相同。
!/usr/bin/python import sys # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Break the line into words words = myline.split() # Iterate the words list for myword in words: # Write the results to standard output print '%s %s' % (myword, 1)
请确保此文件具有执行权限(使用chmod + X /家庭/专家/ Hadoop的1.2.1 / mapper.py)。
#!/usr/bin/python from operator import itemgetter import sys current_word = "" current_count = 0 word = "" # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Split the input we got from mapper.py word, count = myline.split(' ', 1) # Convert count variable to integer try: count = int(count) except ValueError: # Count was not a number, so silently ignore this line continue if current_word == word: current_count += count else: if current_word: # Write result to standard output print '%s %s' % (current_word, current_count) current_count = count current_word = word # Do not forget to output the last word if needed! if current_word == word: print '%s %s' % (current_word, current_count)
保存在Hadoop的主目录mapper.py和reducer.py映射器和减速机代码。确保这些文件具有执行权限(搭配chmod + X mapper.py和chmod + X reducer.py)。由于蟒蛇是压痕敏感,因此相同的代码可以从以下链接下载。
$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1. 2.1.jar -input input_dirs -output output_dir -mapper <path/mapper.py -reducer <path/reducer.py
其中,“”用于续行清晰易读。
./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py
在上面的例子中,无论是映射器和减速是从标准输入读取的输入,并发射输出到标准输出Python脚本。该实用程序将创建一个Map / Reduce作业,作业提交到一个合适的集群,并监视作业的进度,直到它完成。
当映射器指定的脚本,每个映射任务将启动脚本作为一个单独的进程时,映射被初始化。作为mapper任务运行时,它的输入转换成线和进料线,该方法的标准输入(STDIN)。在此期间,映射器收集来自该方法的标准输出(stdout)的面向行的输出和各线转换成键/值对,其被收集作为映射器的输出。默认情况下,行至第一个制表符的前缀是关键,该行(不包括制表符)的其余部分将是价值。如果在该行没有制表符,则整个行被视为键和值为null。然而,这可以被定制,因为每一需求。
当减速指定的脚本,每次减速任务将启动脚本作为一个单独的进程,然后减速被初始化。作为减速器任务运行时,将其转换其输入的键/值对入线和馈送线的过程中的标准输入(STDIN)。在此期间,该减速器收集来自该方法的标准输出(stdout)的面向行的输出,每行转换成键/值对,其被收集作为减速机的输出。默认情况下,行至第一个制表符的前缀是关键,该行(不包括制表符)的其余部分的价值。然而,这可以被定制为每具体要求。
参数 | 选项 | 描述 |
---|---|---|
-input目录/文件名 | 需要 | 输入位置映射器。 |
- 输出目录名 | 需要 | 为减速机的输出位置。 |
-mapper可执行文件或脚本或JavaClassName | 需要 | 映射器可执行文件。 |
-reducer可执行文件或脚本或JavaClassName | 需要 | 减速机可执行文件。 |
-file文件名 | 可选的 | 使得当地现有的计算节点上的映射器,减速器,或组合的可执行文件。 |
-inputformat JavaClassName | 可选的 | 您提供一流的应该返回文本类的键/值对。如果没有指定,是的TextInputFormat用作默认。 |
-outputformat JavaClassName | 可选的 | 您提供一流的应该采取文字类的键/值对。如果没有指定,TextOutputformat用作默认。 |
-partitioner JavaClassName | 可选的 | 类,确定哪个减少一个密钥发送到。 |
-combiner streamingCommand或JavaClassName | 可选的 | 合可执行地图输出。 |
-cmdenv名称=值 | 可选的 | 传递环境变量流的命令。 |
-inputreader | 可选的 | 对于向后兼容性:指定记录读取器类(而不是输入格式类)。 |
-verbose | 可选的 | 详细输出。 |
-lazyOutput | 可选的 | 创建懒洋洋地输出。例如,如果输出格式是基于FileOutputFormat,仅在第一次调用output.collect(或Context.write)创建的输出文件。 |
-numReduceTasks | 可选的 | 指定减速器的数目。 |
-mapdebug | 可选的 | 当map任务失败时调用的脚本。 |
-reducedebug | 可选的 | 脚本调用时降低任务失败。 |
本章介绍了在分布式环境Hadoop的多节点集群的设置。
由于整个群集无法证明,我们解释使用三个系统(一个主站和两个奴隶)的Hadoop集群环境;下面给出的是它们的IP地址。
按照下面给出的Hadoop具有多节点集群设置的步骤。
Java是Hadoop的主要先决条件。首先,您应该验证java的存在使用“Java的版本”您的系统。 Java版本命令的语法如下。
$ java -version
如果一切正常,它会给你下面的输出。
java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b13) Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
如果Java是没有安装在您的系统,然后按照安装Java给定的步骤。
下载Java(JDK - X64.tar.gz)通过访问以下链接http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
随后的jdk-7u71-Linux的x64.tar.gz将被下载到您的系统。
通常你会发现在下载文件夹中下载的Java文件。验证它,并使用以下命令解压的jdk-7u71-Linux的x64.gz文件。
$ cd Downloads/ $ ls jdk-7u71-Linux-x64.gz $ tar zxf jdk-7u71-Linux-x64.gz $ ls jdk1.7.0_71 jdk-7u71-Linux-x64.gz
使Java提供给所有用户,你必须将它移动到的位置“的/ usr /本地/”。打开根目录,键入以下命令。
$ su password: # mv jdk1.7.0_71 /usr/local/ # exit
有关设置PATH和JAVA_HOME变量,添加下面的命令〜/ .bashrc文件。
export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=PATH:$JAVA_HOME/bin
现在从终端验证java -version命令如上述说明。按照上面的过程,并在所有群集节点安装Java。
在主机和从机系统创建一个系统用户帐户使用Hadoop的安装。
# useradd hadoop # passwd hadoop
你必须编辑hosts文件中的所有节点上在/ etc /文件夹,指定每个系统后面的主机名的IP地址。
# vi /etc/hosts enter the following lines in the /etc/hosts file. 192.168.1.109 hadoop-master 192.168.1.145 hadoop-slave-1 192.168.56.1 hadoop-slave-2
设置的ssh中的每个节点,使得它们可在没有任何提示密码彼此通信。
# su hadoop $ ssh-keygen -t rsa $ ssh-copy-id -i ~/.ssh/id_rsa.pub tutorialspoint@hadoop-master $ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp1@hadoop-slave-1 $ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp2@hadoop-slave-2 $ chmod 0600 ~/.ssh/authorized_keys $ exit
在主服务器上,下载并使用以下命令安装Hadoop的。
# mkdir /opt/hadoop # cd /opt/hadoop/ # wget http://apache.mesi.com.ar/hadoop/common/hadoop-1.2.1/hadoop-1.2.0.tar.gz # tar -xzf hadoop-1.2.0.tar.gz # mv hadoop-1.2.0 hadoop # chown -R hadoop /opt/hadoop # cd /opt/hadoop/hadoop/
您可以通过如下给出做以下修改来配置Hadoop的服务器。
打开核心site.xml文件,并进行修改,如下图所示。
<configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop-master:9000/</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
打开HDFS-site.xml文件,并进行修改,如下图所示。
<configuration> <property> <name>dfs.data.dir</name> <value>/opt/hadoop/hadoop/dfs/name/data</value> <final>true</final> </property> <property> <name>dfs.name.dir</name> <value>/opt/hadoop/hadoop/dfs/name</value> <final>true</final> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
打开mapred-site.xml文件,并进行修改,如下图所示。
<configuration> <property> <name>mapred.job.tracker</name> <value>hadoop-master:9001</value> </property> </configuration>
打开hadoop-env.sh文件,如下图所示编辑JAVA_HOME,HADOOP_CONF_DIR和HADOOP_OPTS。
注意:设置JAVA_HOME根据您的系统配置。
export JAVA_HOME=/opt/jdk1.7.0_17 export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true export HADOOP_CONF_DIR=/opt/hadoop/hadoop/conf
按照给定的命令,所有从服务器上安装的Hadoop。
# su hadoop $ cd /opt/hadoop $ scp -r hadoop hadoop-slave-1:/opt/hadoop $ scp -r hadoop hadoop-slave-2:/opt/hadoop
打开主服务器,并按照给定的命令进行配置。
# su hadoop $ cd /opt/hadoop/hadoop
$ vi etc/hadoop/masters hadoop-master
$ vi etc/hadoop/slaves hadoop-slave-1 hadoop-slave-2
# su hadoop $ cd /opt/hadoop/hadoop $ bin/hadoop namenode –format
11/10/14 10:58:07 INFO namenode.NameNode: STARTUP_MSG: 11/10/14 10:58:08 INFO util.GSet: Computing capacity for map BlocksMap editlog=/opt/hadoop/hadoop/dfs/name/current/edits …………………………………………………. …………………………………………………. …………………………………………………. 11/10/14 10:58:08 INFO common.Storage: Storage directory /opt/hadoop/hadoop/dfs/name has been successfully formatted. 11/10/14 10:58:08 INFO namenode.NameNode: SHUTDOWN_MSG:
下面的命令来启动所有的Hadoop的主Hadoop的服务。
$ cd $HADOOP_HOME/sbin $ start-all.sh
下面给出要遵循用于添加新节点Hadoop集群的步骤。
添加新节点用一些适当的网络配置现有的Hadoop集群。假设以下网络配置。
对于新节点配置:
IP address : 192.168.1.103 netmask : 255.255.255.0 hostname : slave3.in
在新的节点上,通过使用以下命令添加要“Hadoop的”用户和Hadoop用户“hadoop123”或任何的设置密码。
useradd hadoop passwd hadoop
设置密码较少连接由主到新的从属。
mkdir -p $HOME/.ssh chmod 700 $HOME/.ssh ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys chmod 644 $HOME/.ssh/authorized_keys Copy the public key to new slave node in hadoop user $HOME directory scp $HOME/.ssh/id_rsa.pub hadoop@192.168.1.103:/home/hadoop/
登录到Hadoop的。如果不是这样,登录到Hadoop的用户。
su hadoop ssh -X hadoop@192.168.1.103
公共密钥的内容复制到文件“$ HOME /的.ssh / authorized_keys文件”,然后通过执行以下命令更改相同的权限。
cd $HOME mkdir -p $HOME/.ssh chmod 700 $HOME/.ssh cat id_rsa.pub >>$HOME/.ssh/authorized_keys chmod 644 $HOME/.ssh/authorized_keys
从主计算机检查ssh登录。现在,请检查您是否可以ssh到新的节点,而从主的密码。
ssh hadoop@192.168.1.103 or hadoop@slave3
您可以在文件/ etc / sysconfig / network中设置的主机名
On new slave3 machine NETWORKING=yes HOSTNAME=slave3.in
为了使更改生效,请重新启动计算机或运行hostname命令到新的计算机与相应的主机名(重启是一个不错的选择)。
在slave3节点机:
主机名slave3.in
更新/ etc /与以下行所有群集机的主机 :
192.168.1.102 slave3.in slave3
现在尝试ping本机与主机名称检查是否解析为IP或没有。
在新的节点机:
ping master.in
使用$ HADOOP_HOME /斌/ hadoop-daemon.sh脚本手动启动的Datanode守护进程。它会自动联系主(NameNode的),并加入集群。我们还应该将新节点添加到主服务器通过conf /奴隶文件。基于脚本的命令将识别新的节点。
su hadoop or ssh -X hadoop@192.168.1.103
./bin/hadoop-daemon.sh start datanode
$ jps 7141 DataNode 10312 Jps
我们可以从动态集群中删除节点,在运行时,不会丢失任何数据。 HDFS提供一个退役特性,从而确保除去一个节点被安全地执行。要使用它,请按照下列步骤给出:
登录掌握。
登录掌握在安装Hadoop的计算机用户。
$ su hadoop
更改群集配置。
排除文件必须在启动群集之前进行配置。一个名为关键dfs.hosts.exclude添加到我们的$ HADOOP_HOME的/ etc / Hadoop的/ HDFS-site.xml文件。与此键关联的值提供的完整路径,其中包含未允许连接到HDFS的机器列表NameNode的本地文件系统上的文件。
例如,添加这些行等/ Hadoop的/ HDFS-site.xml文件。
<property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt</value> <description>DFS exclude</description> </property>
确定主机退役。
要退役每台机器应添加到由每行的hdfs_exclude.txt,一个域名标识的文件。这将阻止他们连接到NameNode的。在“/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt”文件的内容如下所示,如果你想删除DataNode2。
slave2.in
强制配置重装。
运行命令“$ HADOOP_HOME /斌/ Hadoop的dfsadmin -refreshNodes”不带引号。
$ $HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes
这将迫使NameNode会重新读取它的配置,其中包括最近更新的'排除'文件。它将停止使用节点在一段时间,让时间为每个节点的块被复制到其上被调度到保持活跃的机器。
在slave2.in,检查JPS命令的输出。一段时间后,你会看到的DataNode过程是自动关机。
关闭节点。
的退役过程已经完成后,将退役硬件可以安全地关闭以进行维护。运行报告命令dfsadmin检查退役的状态。以下命令将描述退役节点的状态以及群集连接的节点。
$ $HADOOP_HOME/bin/hadoop dfsadmin -report
编辑排除再次文件。
一旦机器已经退役,他们可以从“不包括'文件中删除。运行“$ HADOOP_HOME /斌/ Hadoop的dfsadmin -refreshNodes”再次将读取文件排除放回NameNode的;允许的DataNodes重新加入集群维修已经完成之后,或在集群中再次需要额外容量等
特别注意:如果上述过程之后和向TaskTracker处理的节点上仍在运行,它需要被关闭。一种方法是我们在上面的步骤做断开机器。法师会自动识别过程将宣告为死亡。没有必要遵循相同的过程去除的TaskTracker因为它不是相比的DataNode尽可能多的关键。 DataNode会包含要在不丢失任何数据安全地删除数据。
向TaskTracker可以在任何时间点上运行通过以下命令飞/关机。
$ $HADOOP_HOME/bin/hadoop-daemon.sh stop tasktracker $HADOOP_HOME/bin/hadoop-daemon.sh start tasktracker
HDFS - 可靠性HDFS 的可靠性主要有以下几点:冗余副本策略机架策略心跳机制安全模式效验和回收站元数据保护快照机制1.冗余副本策...
Node节点下的Container管理启动时向ResourceManager注册并定时发送心跳消息,等待ResourceManager的指令监控Container的运行,维...
Object wx.getMenuButtonBoundingClientRect()基础库 2.1.0 开始支持,低版本需做兼容处理。获取菜单按钮(右上角胶囊按钮)的布...
MediaContainerwx.createMediaContainer()基础库 2.9.0 开始支持,低版本需做兼容处理。创建音视频处理容器,最终可将容器中的轨...