Hadoop 概述
Hadoop是什么
Hadoop是Lucene创始人Doug Cutting,根据Google的相关内容山寨出来的分布式文件系统和对海量数据进行分析计算的基础框架系统,其中包含MapReduce程序,hdfs系统等。
网方网站:http://hadoop.apache.org/
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
Hadoop包括两大核心,分布式存储系统和分布式计算系统。
分布式存储
为什么数据需要存储在分布式的系统中哪,难道单一的计算机存储不了吗,难道现在的几个TB的硬盘装不下这些数据吗?事实上,确实装不下。比如,很多的电信通话记录就存储在很多台服务器的很多硬盘中。那么,要处理这么多数据,必须从一台一台服务器分别读取数据和写入数据,太麻烦了!
我们希望有一种文件系统,可以管辖很多服务器用于存储数据。通过这个文件系统存储数据时,感觉不到是存储到不同的服务器上的。当读取数据时,感觉不到是从不同的服务器上读取。
如图:这就是分布式文件系统。
分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。
命名空间(namespace):在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间(namespace)。命名空间管理着整个服务器集群中的所有文件。命名空间的职责与存储真实数据的职责是不一样的。
负责命名空间职责的节点称为主节点(master node),负责存储真实数据职责的节点称为从节点(slave node)。
主/从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,称为主从式结构(master-slaves)。
用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
工作流程图:
分布式计算:
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据进行处理,比如数据大小是100GB,我们要统计文件中一共有多少个单词。要想把数据都加载到内存中几乎是不可能的,称为移动数据。
那么是否可以把程序代码放到存放数据的服务器上哪?因为程序代码与原始数据相比,一般很小,几乎可以忽略的,所以省下了原始数据传输的时间了。现在,数据是存放在分布式文件系统中,100GB的数据可能存放在很多的服务器上,那么就可以把程序代码分发到这些服务器上,在这些服务器上同时执行,也就是并行计算,也是分布式计算。这就大大缩短了程序的执行时间。我们把程序代码移动到数据节点的机器上执行的计算方式称为移动计算。
分布式计算需要的是最终的结果,程序代码在很多机器上并行执行后会产生很多的结果,因此需要有一段代码对这些中间结果进行汇总。Hadoop中的分布式计算一般是由两阶段完成的。第一阶段负责读取各数据节点中的原始数据,进行初步处理,对各个节点中的数据求单词数。然后把处理结果传输到第二个阶段,对中间结果进行汇总,产生最终结果,求出100GB文件总共有多少个单词,如图所示:
在hadoop中,分布式计算部分称为MapReduce。
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
在分布式计算过程中有以下角色:
主节点称为作业节点(jobtracker),
从节点称为任务节点(tasktracker)。
在任务节点中,运行第一阶段的代码称为map任务(map task),运行第二阶段的代码称为reduce任务(reduce task)。
task : 任务 , tracker ,跟踪器
关于hadoop的名词解释
(1)Hadoop:Apache开源的分布式框架。
(2)HDFS:Hadoop的分布式文件系统。
(3)NameNode:Hadoop HDFS元数据主节点服务器,负责保存DataNode 文件存储元数据信息,这个服务器是单点的。
(4)JobTracker:Hadoop的Map/Reduce调度器,负责与TaskTracker通信分配计算任务并跟踪任务进度,这个服务器也是单点的。
(5)DataNode:Hadoop数据节点,负责存储数据。
(6)TaskTracker:Hadoop调度程序,负责Map,Reduce任务的启动和执行。
注:Namenode记录着每个文件中各个块所在的数据节点的位置信息
搭建Hadoop集群:
实验环境
安装前,3台虚拟机IP及机器名称如下:
主机名 IP地址 角色
yunzu63.cn 192.168.1.63 NameNode
yunzu64.cn 192.168.1.64 DataNode1
yunzu62.cn 192.168.1.62 DataNode2
实验前期环境准备:
三台机器上配置hosts文件,如下:
[root@yunzu63 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 yunzu63.cn
192.168.1.64 yunzu64.cn
192.168.1.62 yunzu62.cn
复制hosts到其它两机器:
[root@yunzu63 ~]# scp /etc/hosts root@192.168.1.64:/etc/
[root@yunzu63 ~]# scp /etc/hosts root@192.168.1.62:/etc/
注意:在/etc/hosts中,不要把机器名字,同时对应到127.0.0.1这个地址,否则会导致数据节点连接不上namenode,报错如下:
org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.1.10:9000
创建运行hadoop用户账号和Hadoop目录。 尽量不用root帐号运行
yunzu63:
[root@yunzu63 ~]# useradd -u 8000 hadoop #为了保障,在其它服务器上创建的hadoop用户ID保持一致,创建时,尽量把UID调大
[root@yunzu63 ~]# echo 123456 | passwd --stdin hadoop
[root@yunzu64 ~]# useradd -u 8000 hadoop
[root@yunzu64 ~]# echo 123456 | passwd --stdin hadoop
[root@yunzu62 ~]# useradd -u 8000 hadoop
[root@yunzu62 ~]# echo 123456 | passwd --stdin hadoop
注:创建用户hadoop时,不能使用参数-s /sbin/nologin ,因为稍后我们要su - hadoop 切换用户
配置在yunzu63上,可以ssh无密码登录机器yunzu63,yunzu64,yunzu62 ,方便后期复制文件和启动服务。因为namenode启动时,会连接到datanode上启动对应的服务。
生成公钥和私钥
[root@yunzu63 ~]# su - hadoop
[hadoop @yunzu63 ~]# ssh-keygen
导入公钥到其他datanode节点认证文件
[hadoop @yunzu63 ~]# ssh-copy-id 192.168.1.62
[hadoop @yunzu63 ~]# ssh-copy-id 192.168.1.64
配置Hadoop环境,安装Java环境JDK:三台机器上都要配置
yunzu63安装jdk
上传jdk软件包到yunzu63
[root@yunzu63 ~]# rpm -ivh jdk-7u71-linux-x64.rpm
1、安装及配置Java运行环境—jdk。升级了jdk的版本
[root@yunzu63 ~]# rpm -ivh jdk-7u71-linux-x64.rpm
[root@yunzu63 ~]#rpm -pql /root/jdk-7u71-linux-x64.rpm #通过查看jdk的信息可以知道jdk的安装目录在/usr/java
[root@yunzu63 ~]#vim /etc/profile #在文件的最后添加以下内容:
export JAVA_HOME=/usr/java/jdk1.7.0_71
export JAVA_BIN=/usr/java/jdk1.7.0_71/bin
export PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
{JAVA_HOME}/bin:
JAVAHOME/bin:PATH
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
{JAVA_HOME}/lib/dt.jar:
JAVAHOME/lib/dt.jar:{JAVA_HOME}/lib/tools.jar
[root@yunzu63 ~]#source /etc/profile #使配置文件生效
验证java运行环境是否安装成功:
[root@yunzu63 ~]# java -version
java version “1.7.0_71”
Java™ SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot™ 64-Bit Server VM (build 24.71-b01, mixed mode)
如果出现安装的对应版本,说明java运行环境已经安装成功。
将jdk部署到其它两台机器上:
[root@yunzu63 ~]# scp jdk-7u71-linux-x64.rpm root@192.168.1.62:/root
[root@yunzu63 ~]# scp jdk-7u71-linux-x64.rpm root@192.168.1.64:/root
oot@yunzu63 ~]# scp /etc/profile 192.168.1.62:/etc/profile
[root@yunzu63 ~]# scp /etc/profile 192.168.1.64:/etc/profile
安装:
[root@yunzu64 ~]# rpm -ivh jdk-7u71-linux-x64.rpm
[root@yunzu62 ~]# rpm -ivh jdk-7u71-linux-x64.rpm
重新参加java运行环境:
[root@yunzu64 ~]# source /etc/profile
[root@yunzu62 ~]# source /etc/profile
测试:
[root@yunzu64 ~]# java -version
java version “1.7.0_71”
Java™ SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot™ 64-Bit Server VM (build 24.71-b01, mixed mode)
[root@yunzu62 ~]# java -version
java version “1.7.0_71”
Java™ SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot™ 64-Bit Server VM (build 24.71-b01, mixed mode)
在yunzu63安装Hadoop 并配置成namenode主节点
Hadoop安装目录:/home/hadoop/hadoop-2.2.0
使用root帐号将hadoop-2.2.0.tar.gz 上传到服务器
创建hadoop相关的工作目录
[hadoop@yunzu63 ~]$ mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
[hadoop@yunzu63 ~]$ ls
dfs hadoop-2.2.0 hadoop-2.2.0.tar.gz tmp
配置Hadoop:需要修改7个配置文件。
文件位置:/home/hadoop/hadoop-2.2.0/etc/hadoop/
文件名称:hadoop-env.sh、yarn-evn.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
1、配置文件hadoop-env.sh,指定hadoop的java运行环境
该文件是hadoop运行基本环境的配置,需要修改的为java虚拟机的位置。
[hadoop@yunzu63 hadoop-2.2.0]$ vim
/home/hadoop/hadoop-2.2.0/etc/hadoop/hadoop-env.sh
2、配置文件yarn-env.sh,指定yarn框架的java运行环境
该文件是yarn框架运行环境的配置,同样需要修改java虚拟机的位置。
yarn :Hadoop 的新 MapReduce 框架Yarn是Hadoop 自 0.23.0 版本后新的 map-reduce 框架(Yarn)
原理。
[hadoop@yunzu63 hadoop-2.2.0]$ vim /home/hadoop/hadoop-2.2.0/etc/hadoop/yarn-env.sh
改:26 JAVA_HOME=
J
A
V
A
H
O
M
E
为
:
26
J
A
V
A
H
O
M
E
=
/
u
s
r
/
j
a
v
a
/
j
d
k
1.7.
0
7
13
、
配
置
文
件
s
l
a
v
e
s
,
指
定
d
a
t
a
n
o
d
e
数
据
存
储
服
务
器
将
所
有
D
a
t
a
N
o
d
e
的
机
器
名
字
写
入
此
文
件
中
,
每
个
主
机
名
一
行
,
配
置
如
下
:
[
h
a
d
o
o
p
@
y
u
n
z
u
63
h
a
d
o
o
p
−
2.2.0
]
JAVA_HOME 为:26 JAVA_HOME=/usr/java/jdk1.7.0_71 3、配置文件slaves ,指定datanode 数据存储服务器 将所有DataNode的机器名字写入此文件中,每个主机名一行,配置如下: [hadoop@yunzu63 hadoop-2.2.0]
JAVAHOME为:26JAVAHOME=/usr/java/jdk1.7.0713、配置文件slaves,指定datanode数据存储服务器将所有DataNode的机器名字写入此文件中,每个主机名一行,配置如下:[hadoop@yunzu63hadoop−2.2.0] vim /home/hadoop/hadoop-2.2.0/etc/hadoop/slaves
改:localhost
为:
yunzu64.cn
yunzu62.cn
4、配置文件core-site.xml,指定访问hadoop web界面访问路径,这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下。
[hadoop@yunzu63 hadoop-2.2.0]$ vim
/home/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml
改:
19
20
注: 在和中间插入以一下红色和蓝色标记内容:
为:
fs.defaultFS
hdfs://yunzu63.cn:9000
io.file.buffer.size
131072
hadoop.tmp.dir
file:/home/hadoop/tmp
Abase for other temporary directories.
5、配置文件hdfs-site.xml
这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;
dfs.replication配置了文件块的副本数,一般不大于从机的个数。
[root@yunzu63 ~]# vim /home/hadoop/hadoop-2.2.0/etc/hadoop/hdfs-site.xml
改:19
20
21
注: 在和中间插入以一下红色和蓝色标记内容:
为:
dfs.namenode.secondary.http-address
yunzu63.cn:9001 # 通过web界面来查看HDFS状态
dfs.namenode.name.dir
file:/home/hadoop/dfs/name
dfs.datanode.data.dir
file:/home/hadoop/dfs/data
dfs.replication
2 #每个Block有2个备份。
dfs.webhdfs.enabled
true
6、配置文件mapred-site.xml,
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数
同时指定:Hadoop的历史服务器historyserver
Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器
$ sbin/mr-jobhistory-daemon.sh start historyserver
生成mapred-site.xml
[hadoop@yunzu63 hadoop-2.2.0]$ cp
/home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml.template
/home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml
[hadoop@yunzu63 hadoop-2.2.0]$ vim
/home/hadoop/hadoop-2.2.0/etc/hadoop/mapred-site.xml
改:19
20
21
为:
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
yunzu63.cn:10020
mapreduce.jobhistory.webapp.address
yunzu63:19888
7、配置节点yarn-site.xml
该文件为yarn框架的配置,主要是一些任务的启动位置
[hadoop@yunzu63 hadoop-2.2.0]$ vim
/home/hadoop/hadoop-2.2.0/etc/hadoop/yarn-site.xml
#修改configuration内容如下:
改:
复制到其他datanode节点: yunzu64和yunzu62
[hadoop@yunzu63 hadoop-2.2.0]$ scp -r /home/hadoop/hadoop-2.2.0 hadoop@yunzu62.cn:~/
[hadoop@yunzu63 hadoop-2.2.0]$ scp -r /home/hadoop/hadoop-2.2.0 hadoop@yunzu64.cn:~/
在yunzu63上启动Hadoop
切换到hadoop用户
格式化
hadoop namenode的初始化,只需要第一次的时候初始化,之后就不需要了
[hadoop@yunzu63 hadoop-2.2.0]$ /home/hadoop/hadoop-2.2.0/bin/hdfs namenode -format
[root@yunzu63 hadoop-2.2.0]# echo KaTeX parse error: Expected 'EOF', got '#' at position 40: …yunzu63 hadoop]#̲ rpm -ivh /mnt/… tree /home/hadoop/dfs/
生成基于hadoop用户的不输入密码登录:因为后期使用hadoop用户启动datanode节点使用需要直接登录到对应的服务器上启动datanode相关服务。
[hadoop@yunzu63 hadoop-2.2.0]$ ssh-keygen
[hadoop@yunzu63 hadoop-2.2.0]$ ssh-copy-id 192.168.1.64
[hadoop@yunzu63 hadoop-2.2.0]$ ssh-copy-id 192.168.1.62
[hadoop@yunzu63 hadoop-2.2.0]$ ssh-copy-id 192.168.1.63
启动hdfs: ./sbin/start-dfs.sh,即启动HDFS分布式存储
[root@yunzu63 hadoop-2.2.0]# /home/hadoop/hadoop-2.2.0/sbin/start-dfs.sh
查看进程,此时master有进程:namenode和 secondarynamenode进程:
[root@yunzu63 ~]# ps -axu | grep namenode --color
yunzu64和yunzu62上有进程:DataNode
[root@yunzu64 ~]# ps -axu | grep datanode --color
在yunzu63上启动yarn: ./sbin/start-yarn.sh 即,启动分布式计算
[root@yunzu63 hadoop-2.2.0]# /home/hadoop/hadoop-2.2.0/sbin/start-yarn.sh
查看进程:
查看yunzu63上的ResourceManager进程,yunzu62和yunzu64上的进程:DataNode NodeManager
[root@yunzu63 ~]# ps -axu | grep resourcemanager --color
[root@yunzu62 ~]# ps -axu | grep nodemanager --color
[root@yunzu64 ~]# ps -axu | grep nodemanager --color
注:start-dfs.sh 和 start-yarn.sh 这两个脚本可用start-all.sh代替。
[hadoop@yunzu63 ~]$ /home/hadoop/hadoop-2.2.0/sbin/start-all.sh
关闭:
[hadoop@yunzu63 ~]$ /home/hadoop/hadoop-2.2.0/sbin/stop-all.sh
启动:/apreduce运行状态
[root@yunzu63 hadoop-2.2.0]# /home/hadoop/hadoop-2.2.0/sbin/mr-jobhistory-daemon.sh
start historyserver
查看HDFS分布式文件系统状态:
[hadoop@yunzu63 hadoop-2.2.0]$ /home/hadoop/hadoop-2.2.0/bin/hdfs dfsadmin -report
查看文件块组成: 一个文件由哪些块组成
[hadoop@yunzu63 ~]$ /home/hadoop/hadoop-2.2.0/bin/hdfs fsck / -files -blocks
Web查看HDFS: http://192.168.1.63:50070
附:hadoop中文文档http://hadoop.apache.org/docs/r1.0.4/cn/