软件包下载
http://mirrors.hust.edu.cn/apache/hadoop/common/
Hadoop是什么
Hadoop是Lucene创始人Doug Cutting,根据Google的相关内容山寨出来的分布式文件系统和对海量数据进行分析计算的基础框架系统,其中包含MapReduce程序,hdfs系统等。
网方网站:http://hadoop.apache.org/
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
各版本下载:
http://hadoop.apache.org/releases.html
hadoop基于java开发的。
Hadoop包括两大核心,分布式存储系统和分布式计算系统。
Map/Reduce: 分布式计算”框架”
HDFS: 分布式文件系统
分布式存储
为什么数据需要存储在分布式的系统中哪,难道单一的计算机存储不了吗,难道现在的几个TB的硬盘装不下这些数据吗?事实上,确实装不下。比如,很多的电信通话记录就存储在很多台服务器的很多硬盘中。那么,要处理这么多数据,必须从一台一台服务器分别读取数据和写入数据,太麻烦了!
我们希望有一种文件系统,可以管辖很多服务器用于存储数据。通过这个文件系统存储数据时,感觉不到是存储到不同的服务器上的。当读取数据时,感觉不到是从不同的服务器上读取。
如图:这就是分布式文件系统。
分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。
命名空间(namespace):在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间(namespace)。命名空间管理着整个服务器集群中的所有文件。命名空间的职责与存储真实数据的职责是不一样的。
负责命名空间职责的节点称为主节点(master node),负责存储真实数据职责的节点称为从节点(slave node)。
主/从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,称为主从式结构(master-slaves)。
用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
block:在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。
容灾:数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication)机制,把数据同时备份到多台服务器中,这样数据就安全了,数据丢失或者访问失败的概率就小了。
工作流程图:
总结:
在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,因为非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多。
在hadoop中,分布式存储系统称为HDFS(hadoop distributed file system)。其中,主节点称为名字节点(namenode),从节点称为数据节点(datanode)。
分布式计算:
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据进行处理,比如数据大小是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地址 角色
Docker-01 172.17.120.50 NameNode
Docker-02 172.17.120.51 DataNode1
Docker-03 172.17.120.52 DataNode2
实验前期环境准备:
三台机器上配置hosts文件,如下:
[root@docker-01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.17.120.50 docker-01
172.17.120.51 docker-02
172.17.120.52 docker-03
复制hosts到其它两机器:
[root@docker-01 ~]# scp /etc/hosts root@172.17.120.51:/etc/hosts
[root@docker-01 ~]# scp /etc/hosts root@172.17.120.52:/etc/hosts
三台机器都要创建运行hadoop用户账号和Hadoop目录。 尽量不用root帐号运行
[root@docker-01 ~]# useradd -u 8000 hadoop #为了保障,在其它服务器上创建的hadoop用户ID保持一致,创建时,尽量把UID调大
[root@docker-01 ~]# echo 123456 | passwd --stdin hadoop
配置在docker-01上,可以ssh无密码登录机器docker-01,docker-02,docker-03 ,方便后期复制文件和启动服务。因为namenode启动时,会连接到datanode上启动对应的服务。
[root@docker-01 ~]# su - hadoop
上一次登录:四 8月 29 21:40:58 CST 2019pts/0 上
[hadoop@docker-01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
导入公钥到其他datanode节点认证文件
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.51
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.52
配置Hadoop环境,安装Java环境JDK:三台机器上都要配置
[root@docker-01 opt]# tar -xzvf jdk-8u91-linux-x64.tar.gz
[root@docker-01 opt]# mv jdk1.8.0_91/ jdk
[root@docker-01 local]# mv /opt/jdk /usr/local/
[root@docker-01 local]# vim /etc/profile #在文件的最后添加以下内容:
exportJAVA_HOME=/usr/local/jdk
exportJRE_HOME=/usr/local/jdk/jre
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[root@docker-01 local]# source /etc/profile #使配置文件生效
验证java运行环境是否安装成功:
[root@docker-01 local]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
将jdk部署到其它两台机器上:
[root@docker-01 local]# scp jdk/ root@172.17.120.51:/usr/local/
[root@docker-01 local]# scp jdk/ root@172.17.120.52:/usr/local/
[root@docker-01 local]# scp /etc/profile 172.17.120.51:/etc/profile
[root@docker-01 local]# scp /etc/profile 172.17.120.52:/etc/profile
三台都执行重新参加java运行环境:
[root@docker-01 local]# source /etc/profile
[root@docker-02 ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
在docker-01安装Hadoop 并配置成namenode主节点
Hadoop安装目录:/home/hadoop/hadoop-2.6.0
使用root帐号将hadoop-2.6.0.tar.gz 上传到服务器
三台机器都执行创建hadoop相关的工作目录
[root@docker-02 ~]# mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
配置Hadoop:需要修改7个配置文件。
文件位置:/home/hadoop/hadoop-2.6.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运行环境
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/hadoop-env.sh
改:27 export JAVA_HOME=${JAVA_HOME}
为:export JAVA_HOME=/usr/java/jdk
注:指定java运行环境变量
2、配置文件yarn-env.sh,指定yarn框架的java运行环境
该文件是yarn框架运行环境的配置,同样需要修改java虚拟机的位置。
yarn :Hadoop 的新MapReduce 框架Yarn是Hadoop 自0.23.0 版本后新的map-reduce 框架(Yarn) 原理。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/yarn-env.sh
改:26 JAVA_HOME=$JAVA_HOME
为:26 JAVA_HOME=/usr/java/jdk
3、配置文件slaves ,指定datanode 数据存储服务器
将所有DataNode的机器名字写入此文件中,每个主机名一行,配置如下:
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/slaves
docker-02
docker-03
4、配置文件core-site.xml,指定访问hadoop web界面访问路径
这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;
hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/core-site.xml
改:
19 <configuration>
20 </configuration>
注:在<configuration>和</configuration>中间插入以一下红色和蓝色标记内容:
为:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://docker-01:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
注:property 财产
5、配置文件hdfs-site.xml
这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;
dfs.replication配置了文件块的副本数,一般不大于从机的个数。
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/hdfs-site.xml
改:19 <configuration>
20
21 </configuration>
注:在<configuration>和</configuration>中间插入以一下红色和蓝色标记内容:
为:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>docker-01:9001</value> # 通过web界面来查看HDFS状态
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value> #每个Block有2个备份。
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
注:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>docker-01:9001</value> # 通过web界面来查看HDFS状态
</property>
<property>
<name>dfs.replication</name>
<value>2</value> #每个Block有2个备份。
</property>
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
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。
生成mapred-site.xml
[root@docker-01 local]# cp /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml.template /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/mapred-site.xml
改:19 <configuration>
20
21 </configuration>
注:在<configuration>和</configuration>中间插入以一下红色和蓝色标记内容:
为:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>docker-01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>docker-01:19888</value>
</property>
</configuration>
7、配置节点yarn-site.xml
该文件为yarn框架的配置,主要是一些任务的启动位置
[root@docker-01 local]# vim /home/hadoop/hadoop-2.6.5/etc/hadoop/yarn-site.xml
# 修改configuration内容如下:
改:
<configuration>
<!-- Site specific YARN configuration properties -->
</configuration>
注:在<configuration>和</configuration>中间插入以一下红色和蓝色标记内容:
为:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>docker-01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>docker-01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>docker-01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>docker-01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>docker-01:8088</value>
</property>
</configuration>
复制到其他datanode节点: docker-02和docker-03
[root@docker-01 local]# scp -r /home/hadoop/hadoop-2.2.0 hadoop@docker01:~/
[root@docker-01 local]# scp -r /home/hadoop/hadoop-2.2.0 hadoop@docker02:~/
三台机器修改权限,切换用户
[hadoop@docker-01 ~]$ chown -R hadoop:hadoop /home/hadoop/*
[hadoop@docker-01 ~]$ su - hadoop
在docker-01上启动Hadoop
切换到hadoop用户
(3)格式化
hadoop namenode的初始化,只需要第一次的时候初始化,之后就不需要了
[hadoop@docker-01 ~]$ /home/hadoop/hadoop-2.6.5/bin/hdfs namenode -format
[hadoop@docker-01 ~]$ echo $?
0
查看格式化后,生成的文件:
[hadoop@docker-01 ~]$ tree /home/hadoop/dfs/
/home/hadoop/dfs/
├── data
└── name
├── current
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock
3 directories, 5 files
生成基于hadoop用户的不输入密码登录:因为后期使用hadoop用户启动datanode节点使用需要直接登录到对应的服务器上启动datanode相关服务。
[hadoop@docker-01 ~]$ ssh-keygen
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.50
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.51
[hadoop@docker-01 ~]$ ssh-copy-id 172.17.120.52
(4)启动hdfs: ./sbin/start-dfs.sh,即启动HDFS分布式存储
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-dfs.sh
注:如果报错,如:
docker-02: Host key verification failed.
解决:
[hadoop@docker-01 sbin]$ ssh 172.17.120.52 #确认可以不输入密码直接连接上docker-02
关闭后再重启:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/stop-dfs.sh
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-dfs.sh
(5)查看进程,此时master有进程:namenode和secondarynamenode进程:
[hadoop@docker-01 sbin]$ ps -axu | grep namenode —color
Docker-02和docker-03上有进程:DataNode
[root@docker-02 sbin]# ps -axu | grep datanode —color
(6)在xuegod63上启动yarn: ./sbin/start-yarn.sh 即,启动分布式计算
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-yarn.sh starting yarn daemons
(7)查看进程:
查看docker-01上的ResourceManager进程,docker-02和docker-03上的进程:DataNode NodeManager
[hadoop@docker-01 sbin]$ ps -axu | grep resourcemanager —color
[hadoop@docker-02 ~]$ ps -axu | grep nodemanager —color
[hadoop@docker-03 ~]$ ps -axu | grep nodemanager --color
注:start-dfs.sh 和start-yarn.sh这两个脚本可用start-all.sh代替。
关闭:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/stop-all.sh
启动
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/start-all.sh
启动:/apreduce运行状态
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/sbin/mr-jobhistory-daemon.sh start historyserver
(8)查看HDFS分布式文件系统状态:
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/bin/hdfs dfsadmin -report
(9)查看文件块组成: 一个文件由哪些块组成
[hadoop@docker-01 sbin]$ /home/hadoop/hadoop-2.6.5/bin/hdfs fsck / -files -blocks
(10)Web查看HDFS: http://172.17.120.50:50070
(11)通过Web查看hadoop集群状态: http://172.17.120.50:8088
附:hadoop中文文档http://hadoop.apache.org/docs/r1.0.4/cn/