hadoop
hadoop
制作人:全心全意
Hadoop简介
Hadoop是一种开源的适合大数据的分布式存储和处理的平台。作为一种大规模分布式数据处理平台,Hadoop已成为许多程序员的一项重要技能。
Hadoop本身就是一个并行处理系统
Hadoop是Apache基金会旗下的一个开源的分布式计算平台,是基于Java语言开发的,有很好的跨平台特性,并且可以部署在廉价的计算机集群中。用户无需了解分布式底层细节,就可以开发分布式程序,充分利用集群的威力进行高速运算和存储。
最初,Hadoop的核心技术是HDFS和MapReduce。
HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的简称,它具有较高的读写速度,很好的容错性和可伸缩性,为海量的数据提供了分布式存储,其冗余数据存储的方式很好的保证了数据的安全性。
MapReduce是一种用于并行处理大数据集的软件框架(编程模型)。用户可在无需了解底层细节的情况下,编写MapReduce程序进行分析和处理分布式文件系统上的数据,MapReduce保证了分析和处理数据的高效性。
因其在分布式环境下提供了高效的,海量的数据的优秀处理能力,Hadoop被公认为大数据行业中的标准开源软件。几乎所有主流的厂商如谷歌,雅虎,微软,淘宝等等这样的大公司都是围绕Hadoop进行提供开发工具,开源软件,商业化工具或技术服务的。
在Hadoop2.0以后,又引入了另一个核心技术:YARN(Yet Another Resource Negotiator)。它是一个任务调度和集群资源管理系统,主要有两类长期运行的守护线程来提供自己的核心服务:一类是用于管理集群上资源使用的资源管理器(Resouce Manager),另一类是运行在集群中各个节点上且能够启动和监控容器(container)的节点管理器(Node Manager)。
Hadoop Common:由原来的Hadoop core更名而来。以前的版本中core包含HDFS、MapReduce及其其他公共部分。后来HDFS和MapReuce被分离出来作为独立的子项目,剩下的公共部分更名为Common。主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。它们为在通用硬件上搭建云计算环境提供基本的服务,并为运行在该平台上的软件开发提供了所需的API。
Hadoop HDFS:Hadoop的核心技术之一,分布式文件系统
Hadoop YARN:Hadoop2.0以后新增的一个核心技术,资源管理系统
Hadoop MapReduce:Hadoop的核心技术之一,编程模型,用于大规模数据集的并行计算。
Hadoop Ozone:HDFS的一个扩展方向,对象存储技术。
Hadoop的作用
1)搜索引擎:这也正是Doug Cutting设计Hadoop的初衷,为了针对大规模的网页快速建立索引;
2)大数据存储:利用Hadoop的分布式存储能力,例如数据备份、数据仓库等;
3)大数据处理:利用Hadoop的分布式处理能力,例如数据挖掘、数据分析等;
4)科学研究:Hadoop是一种分布式的开源框架,对于分布式系统有很大程度地参考价值。
Hadoop的特点
Hadoop因为是基于Java语言开发的,因此最理想的运行平台就是Linux系统了。它也支持多种编程语言,如C++,PHP等等。
高可靠型:Hadoop按位存储和处理数据的能力值得人们信赖。
高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快,可以处理PB级数据。
高可扩展性:Hadoop的设计目标是可以高效的稳定的运行在廉价的计算机集群上,可以扩展到数以千计的计算机节点。
高容错性:采用冗余数据存储方式,自动保存数据的多个复本,并且能够自动将失败的任务进行重新分配
成本低:Hadoop采用廉价的计算机集群,成本比较低,普通用户也可以使用自己的电脑来搭建Hadoop环境
Hadoop的生态系统
Ambari:用于供应,管理和监控Apache Hadoop集群的基于Web的工具。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。Ambari还提供了一个用于查看集群健康状况的仪表板,例如热图以及可视化查看MapReduce,Pig和Hive应用程序的功能以及用于诊断其性能特征的功能,以方便用户使用。
Avro:数据序列化系统。可以将数据结构或者对象转换成便于存储和传输的格式,其设计目标是用于支持数据密集型应用,适合大规模数据的存储与交换。Avro提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用RPC和简单动态语言集成等功能。
Cassandra:可扩展的多主数据库,没有单点故障。是一套开源分布式NoSQL数据库系统
Chukwa:于管理大型分布式系统的数据收集系统(2000+以上的节点, 系统每天产生的监控数据量在T级别)。它构建在Hadoop的HDFS和MapReduce基础之上,继承了Hadoop的可伸缩性和鲁棒性。Chukwa包含一个强大和灵活的工具集,提供了数据的生成、收集、排序、去重、分析和展示等一系列功能,是Hadoop使用者、集群运营人员和管理人员的必备工具。
Hbase:是一个可扩展的分布式数据库,支持大型表格的结构化数据存储。 HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。Hbase可以也可以不工作的HDFS上,但一般主要设计就是工作在HDFS中的。
Hive:数据仓库基础架构,提供数据汇总和临时查询,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive提供的是一种结构化数据的机制,定义了类似于传统关系数据库中的类SQL语言:Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。
Mahout:Apache旗下的一个开源项目,可扩展的机器学习和数据挖掘库
Pig:用于并行计算的高级数据流语言和执行框架。它简化了使用Hadoop进行数据分析的要求,提供了一个高层次的、面向领域的抽象语言:Pig Latin。
Spark:Hadoop数据的快速和通用计算引擎。 Spark提供了一个简单而富有表现力的编程模型,支持广泛的应用程序,包括ETL,机器学习,流处理和图计算。
Tez:一个基于Hadoop YARN的通用数据流编程框架,它提供了一个强大而灵活的引擎,可执行任意DAG任务来处理批处理和交互式用例的数据Hado™生态系统中的Hive™,Pig™和其他框架以及其他商业软件(例如ETL工具)正在采用Tez,以替代Hadoop™MapReduce作为底层执行引擎。
ZooKeeper:一个面向分布式应用程序的高性能协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Oozie(工作流调度器):一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。
Pig(ad-hoc脚本):由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具,通常用于进行离线分析。它定义了一种数据流语言—Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。
Sqoop(数据ETL/同步工具):Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。
Flume(日志收集工具):Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。
Kafka(分布式消息队列):Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。
Hadoop的MapReduce
MapReduce是一种编程框架
详细内容参考:Hadoop系列之四:MapReduce进阶 Hadoop系列之五:MapReduce进阶(2)
Hadoop的HDFS文件系统
HDFS设计用来存储大文件,对于海量小文件的存储不太适用
用户空间的文件系统
HDFS不支持修改,较新的版本支持追加
HDFS文件系统不支持挂载,并通过系统调用进行访问(只能使用专用访问接口,如专用的命令行工具、API)
了解流程
安装配置HDFS
安装配置MapReduce
HBase
Hive
sqoon
flume/scribe/chukwa
HDFS:(集群最少4个节点,1个控制端,3个数据存储的副本)
本地模式:直接利用本地系统
伪分布式:使用1个节点
完全分布式:4个以上的节点
Hadoop的版本
hadoop每个版本之间的区别是非常大的,其中0.20之前的版本使用的MapReduce框架是旧版本的,之后的版本及1都是新版本的。
Hadoop的进程说明
Hodoop配置文件
core-site.xml:核心配置文件
配置项:
hadoop.tmp.dir:定义Hadoop的临时目录,默认为/tmp/hadoop-${username}
fs.default.name:HDFS的名称节点和其默认的文件系统,其值是一个URI。(HDFS默认的名称节点路径)
mapred-site.xml:MapReduce配置文件
fs.trash.interval:定义HDFS的回收站功能,默认情况下禁用,定义删除文件的保留时长,单位为分钟,0位禁用回收站
配置项:
mapred.job.tracker:定义JobTracker监听的地址(或主机名)和端口(默认为8021)。可以接受多个以逗号分隔路径列表作为值,并会以轮流的方式将数据分散存储到这些文件系统上。
mapred.local.dir:定义保存中间数据的临时目录,其默认值为${hadoop.tmp.dir}/mapred/local
mapred.system.dir:定义为TaskTracker保存元数据的目录,其默认值为${hadoop.tmp.dir}/mapred/system
hdfs-site.xml:HDFS配置文件
配置项:
dfs.name.dir:定义HDFS元数据持久存储路径,默认为${hadoop.tmp.dir}/dfs/name
dfs.data.dir:定义DataNode用于存储数据块的目录路径,默认为${hadoop.tmp.dir}/dfs/data
fs.checkpoint.dir:定义SecondaryNameNode用于存储检查点文件的目录,默认为${hadoop.tmp.dir}/dfs/namesecondary
dfs.replication:定义HDFS在几个几点上保存同一个数据块的副本,默认为3个。(伪分布式使用1个)
配置内容保存在<configuration></configuration>中
格式为:
<property>
<name></name> #配置项
<value></value> #配置值
</property>
hadoop-env.sh:启动前的环境配置文件
默认情况下,Hadoop为每个进程分配1000MB的内存空间,可以在hadoop-env.sh文件中通过HADOOP_HEAPSIZE环境变量进行调整。也可以使用HADOOP_NAMENODE_OPTS、HADOOP_SECONDARYNAMENODE_OPTS、HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量别为对应的5类进程设定运行参数。
TaskTracker会为worker主机上的每个map或reduce任务分别启动一个JVM,这些JVM都需要在进程的HEAP中申请用到的内存空间,每个TaskTracker可同时运行的map任务总数和reduce任务总数分别由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximun这两个属性进行指定,它们的默认值都为2。用于运行map或reduce任务的JVM可用内存大小可由mapred.child.java.opts属性指定,其默认设置为-Xmx200m,意指每个任务可以使用最多200MB的内存空间。由此算来,每个worker主机默认使用2800MB的内存空间,除了使用mapred.child.java.opts为每个JVM的map和reduce任务设定相同可用内存属性之外,还可以使用mapreduce.map.java.opts和mapreduce.reduce.java.opts分别设定map任务和reduce任务的JVM可用内存。
Hodoop的部署
本地模式
准备JDK和Hadoop的安装包,上传到服务器中
#安装jdk,并配置环境变量 [root@localhost ~]# cd /home/zq/ [root@localhost zq]# tar xf jdk-8u181-linux-x64.tar.gz [root@localhost zq]# vi /etc/profile export JAVA_HOME=/home/zq/jdk1.8.0_181 export PATH=$PATH:$JAVA_HOME/bin [root@localhost zq]# source /etc/profile [root@localhost zq]# java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode) [root@localhost zq]# tar xf hadoop-0.20.203.0rc1.tar.gz [root@localhost zq]# vi /etc/profile export HADOOP_HOME=/home/zq/hadoop-0.20.203.0 export PATH=$HADOOP_HOME/bin:$PATH [root@localhost zq]# useradd hduser [root@localhost zq]# passwd hduser [root@localhost zq]# chown -R hduser.hduser hadoop-0.20.203.0/
伪分布式
需要指定NameNode节点,对MapReduce来讲,谁是JobTracker
#完成本地模式部署,进行下面的操作 [root@localhost ~]# mkdir /hadoop/tmp -p [root@localhost ~]# chown -R hduser.hduser /hadoop/tmp/ #配置核心配置文件 [hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/tmp</value> </property> <property> <name>fs.default.name</name> <value>hdfs://localhost:8020</value> </property> </configuration> #配置MapReduce配置文件 [hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/mapred-site.xml <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:8021</value> </property> </configuration> #配置hdfs配置文件 [hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
启动hadoop
#创建ssh秘钥认证 [hduser@localhost ~]$ ssh-keygen -t rsa -P '' [hduser@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@localhost #格式HDFS文件系统 [hduser@localhost bin]$ hadoop namenode -format #启动 [hduser@localhost bin]$ start-all.sh #确认节点 [hduser@localhost bin]$ jps 57680 JobTracker 57792 TaskTracker 57889 Jps 57368 NameNode 57595 SecondaryNameNode 57469 DataNode
HDFS文件系统的使用
#hadoop fs -put:将本地文件上传到hdfs中 -get:将hdfs中的文件下载到本地 -rmr:删除目录 -rm:删除文件 -cp:hdfs中从源到目标
Hadoop的作业
作业:提交给MapReduce的任务
#hadoop job -status:查看作业的状态 -list:查看作业列表
#查看jar包说明 [hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar #查看jar包功能用法 [hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar wordcount #运行mapreduce任务(out必须是以前没有的目录) [hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar wordcount /test /testout
Hadoop进程监听的地址及端口
Hadoop启动时,会运行两个服务进程,一个用于Hadoop各进程之间进行通信的RPC服务器,另一个提供了便于管理员查看Hadoop集群各进程相关信息页面的HTTP服务
用于定义各RPC服务器所监听的地址和端口的属性如下:
fs.default.name:定义HDFS的NameNode用于提供URI所监听的地址和端口,默认端口为8020
dfs.detanode.ipc.address:DataNode上RPC服务器监听的地址和端口,默认为0.0.0.0:50020
mapred.job.tracker:JobTracker的RPC服务器所监听的地址和端口,默认端口为8021
mapred.task.tracker.report.address:TaskTracker的RPC服务器监听的地址和端口;TaskTracker的子JVM使用此端口与TaskTracker进行通信,它仅需要监听在本地回环地址127.0.0.1上,因此可以使用任何端口;只有在当本地没有回环接口时才需要修改此属性的值
除了RPC服务器之外,DataNode还会运行一个TCP/IP服务器用于数据块传输,其监听的地址和端口可以通过dfs.datanode.address属性来定义,默认为0.0.0.0:50010
可用于定义各HTTP服务器的属性有如下几个:
mapred.job.tracker.http.address:JobTracker的HTTP服务器地址和端口,默认为0.0.0.0:50030
mapred.task.tracker.http.address:TaskTracker的HTTP服务器地址和端口,默认为0.0.0.0:50060
dfs.http.address:NameNode的HTTP服务器地址和端口,默认为0.0.0.0:50070
dfs.datanode.http.address:DataNode的HTTP服务器地址和端口,默认为0.0.0.0:50075
dfs.secondary.http.address:SecondaryNameNode的HTTP服务器地址和端口,默认为0.0.0.0:50090
完全分布式
master:
JobTracker
NameNode
snn:
SecondaryNameNode
slave:
TaskTracker
DataNode
#主节点配置 #配置主节点 [root@localhost conf]# vi masters snn.zq.com #配置从节点 [root@localhost conf]# vi slaves slave.zq.com #配置核心配置文件,拷贝到所有节点中 [root@localhost conf]# vi core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/tmp</value> #此目录所有节点都需要创建,并修改权限 </property> <property> <name>fs.default.name</name> <value>hdfs://master.zq.com:8020</value> </property> </configuration> #配置mapreduce配置文件,拷贝到所有节点中 [root@localhost conf]# vi mapred-site.xml <configuration> <property> <name>mapred.job.tracker</name> <value>master.zq.com:8021</value> </property> </configuration> #配置HDFS配置文件,拷贝到所有节点中 [root@localhost conf]# vi hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> #格式化HDFS文件系统 [root@localhost conf]# hadoop namenode -format
Hadoop日志
Hadoop的系统日志默认存放于其安装目录中的logs子目录,如需自定义,可以在hadoop-env.sh中设定HADOOP_LOG_DIR环境变量来指定新位置。Hadoop的每个进程都会生成两个日志文件,一个是由log4j生成的以.log为后缀的日志文件,另一个是以.out为后缀的日志文件,负责记录发往标准输出和错误输出的信息。
大多数应用的日志均发往.log类的文件中,因此在故障排查时其也是最需要关注的日志文件。hadoop为log4j提供的默认配置中,其每天会自动做一次日志滚动,并且永远不会删除日志文件,因此,管理员需要手动归档并删除老旧的日志文件。.out类的日志文件中很少出现信息,而且,Hadoop的每次重启都会导致日志自动滚动,并只会保存最近5次的滚动日志版本。