Hadoop 概述
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop 的框架最核心的设计就是:HDFS 和 MapReduce。HDFS 分布式文件系统为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。
网方网站:http://hadoop.apache.org/
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。
官方网站下载:http://hadoop.apache.org/releases.html
hadoop 基于 java 开的。
Hadoop 包括两大核心,分布式存储系统和分布式计算系统。
1、分布式存储
互动:为什么数据需要存储在分布式的系统中,难道单一的计算机存储不了吗?难道现在的几个 TB的硬盘装不下这些数据吗?
事实上,确实装不下。比如,很多的电信通话记录就存储在很多台服务器的很多硬盘中。那么,要处理这么多数据,必须从一台一台服务器分别读取数据和写入数据,太麻烦了!
我们希望有一种文件系统,可以管辖很多服务器用于存储数据。通过这个文件系统存储数据时,感觉不到是存储到不同的服务器上的。当读取数据时,感觉不到是从不同的服务器上读取。
如图:这就是分布式文件系统
分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。
命名空间(namespace):在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间(namespace)。命名空间管理着整个服务器集群中的所有文件。命名空间的职责与存储真实数据的职责是不一样的。
负责命名空间职责的节点称为主节点(master node 或 name node),负责存储真实数据职责的节点称为从节点(slave node 或 data node)。
主/从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,称为主从式结构(master-slaves)。用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
block:在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。
容灾: 数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication [ˌ ˌreplɪ ɪ'ke ɪʃn])机制,把数据同时备份到多台服务器中,这样数据就安全了,数据丢失或者访问失败的概率就小了。
工作流程图:
hadoop 运行架构:
名词解释
(1)Hadoop:Apache 开源的分布式框架。
(2)HDSF:Hadoop 的分布式文件系统。
(3)NameNode:Hadoop HDFS 元数据主节点服务器,负责保存 DataNode 文件存储元数据信息,这个服务器是单点的。 Namenode 记录着每个文件中各个块所在的数据节点的位置信息
(4)DataNode:Hadoop 数据节点,负责存储数据。
(5)JobTracker:Hadoop 的 Map/Reduce 调度器,负责与 TaskTracker 通信分配计算任务并跟踪任务进度,这个服务器也是单点的。 Tracker [ˈ ˈtrækə ə(r)] 跟踪器
(6)TaskTracker:Hadoop 调度程序,负责 Map,Reduce 任务的启动和执行。 [tɑ:sk] 作业任务
Hadoop1 的组件依赖关系图
SecondaryNameNode 就是来帮助解决上述问题的,它的职责是合并 NameNode 的 edit logs 到fsimage 文件中。SecondaryNameNode 为 HDFS 中提供一个检查点。它只是 NameNode 的一个助手节点。它不是要取代掉 NameNode 也不是 NameNode 的备份。
在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,因为非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多。
分布式计算:
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据进行处理,比如数据大小是 100GB,我们要统计文件中一共有多少个单词。要想把数据都加载到内存中几乎是不可能的,称为移动数据。
那么是否可以把程序代码放到存放数据的服务器上哪?因为程序代码与原始数据相比,一般很小,几乎可以忽略的,所以省下了原始数据传输的时间了。现在,数据是存放在分布式文件系统中,100GB 的数据可能存放在很多的服务器上,那么就可以把程序代码分发到这些服务器上,在这些服务器上同时执行,也就是并行计算,也是分布式计算。这就大大缩短了程序的执行时间。我们把程序代码移动到数据节点的机器上执行的计算方式称为移动计算。
分布式计算需要的是最终的结果,程序代码在很多机器上并行执行后会产生很多的结果,因此需要有一段代码对这些中间结果进行汇总。Hadoop 中的分布式计算一般是由两阶段完成的。第一阶段负责读取各数据节点中的原始数据,进行初步处理,对各个节点中的数据求单词数。然后把处理结果传输到第二个阶段,对中间结果进行汇总,产生最终结果,求出 100GB 文件总共有多少个单词,如图所示:
在 hadoop 中,分布式计算部分称为 MapReduce。
MapReduce 是一种编程模型,用于大规模数据集(大于 1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个 Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的 Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
主节点称为作业节点(jobtracker),
从节点称为任务节点(tasktracker)。
在任务节点中,运行第一阶段的代码称为 map 任务(map task),运行第二阶段的代码称为reduce 任务(reduce task)。
下载 jdk1.8 for Linux 压缩包,hadoop3.0.0 压缩包。下载链接分别如下:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
hadoop-3.0.0.tar.gz 程序包下载:
链接:https://pan.baidu.com/s/1p8kmOe7ZyhQ_Ma6l1UYiqA
提取码:1234
实战 1:部署 Hadoop3.0 高性能集群
实验拓扑:
实验环境:
安装前,3 台虚拟机 IP 及机器名称如下:
主机名 IP 地址 角色
centos60 192.168.0.60 NameNode
centos70 192.168.0.70 DataNode1
centos80 192.168.0.80 DataNode2实验环境准备
三台机器上配置 hosts 文件
vim /etc/hosts
192.168.0.60 centos60
192.168.0.70 centos70
192.168.0.80 centos80
192.168.0.90 centos90
[root@centos60 ~]# scp /etc/hosts root@centos70:/etc/
[root@centos60 ~]# scp /etc/hosts root@centos80:/etc/
创建运行 hadoop 用户账号和 Hadoop 目录。 尽量不用 root 帐号运行
[root@centos60 ~]# useradd -u 8000 hadoop;echo 123456| passwd --stdin hadoop
[root@centos70 ~]# useradd -u 8000 hadoop;echo 123456| passwd --stdin hadoop
[root@centos80 ~]# useradd -u 8000 hadoop;echo 123456| passwd --stdin hadoop
#为了保障,在其它服务器上创建的 hadoop 用户 ID 保持一致,创建时,尽量把 UID 调大,创建用户 hadoop 时,不能使用参数-s /sbin/nologin ,因为稍后我们要 su - hadoop 切换用户
[root@centos60 ~]# su - hadoop
[hadoop@centos60 ~]$ ssh-keygen
导入公钥到其他 datanode 节点认证文件
[hadoop@centos60 ~]$ ssh-copy-id hadoop@centos60
[hadoop@centos60 ~]$ ssh-copy-id hadoop@centos70
[hadoop@centos60 ~]$ ssh-copy-id hadoop@centos80
配置 Hadoop 环境,安装 Java 环境 JDK:三台机器上都要配置
[hadoop@centos60 ~]$ exit
上传 jdk-8u161-linux-x64.rpm 软件包到 centos60
[root@centos60 ~]# rpm -ivh jdk-8u191-linux-x64.rpm
[root@centos60 ~]# rpm -pql /root/jdk-8u191-linux-x64.rpm
将 jdk 部署到其它两台机器上:
[root@centos60 ~]# scp jdk-8u191-linux-x64.rpm root@centos70:/root
[root@centos60 ~]# scp jdk-8u191-linux-x64.rpm root@centos80:/root[root@centos70 ~]# rpm -ivh jdk-8u191-linux-x64.rpm
[root@centos80 ~]# rpm -ivh jdk-8u191-linux-x64.rpm三台机器关闭防火墙:
systemctl stop firewalld.service ;systemctl disable firewalld.service在 centos60安装 Hadoop 并配置成 namenode 主节点:
使用 xshell 的 root 帐号将 hadoop-3.0.0.tar.gz 上传到服务器
[root@centos60 ~]# mv hadoop-3.0.0.tar.gz /home/hadoop/初始化 hadoop 安装环境,以下步骤使用 hadoop 账号操作
[root@centos60 ~]# su - hadoop
[hadoop@centos60 ~]$ tar xf hadoop-3.0.0.tar.gz
[hadoop@centos60 ~]$ mkdir -p /home/hadoop/dfs/name /home/hadoop/dfs/data /home/hadoop/tmp
配置 Hadoop:需要修改 7 个配置文件
文件位置:/home/hadoop/hadoop-3.0.0/etc/hadoop/
文件名称:hadoop-env.sh、yarn-evn.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers
1、配置文件 hadoop-env.sh,指定 hadoop 的 java 运行环境
[hadoop@centos60 hadoop]$ ls /usr/java/jdk1.8.0_191-amd64/
[hadoop@centos60 hadoop]$ vim hadoop-env.sh
2、配置文件 yarn-env.sh,保存 yarn 框架的运行环境
[hadoop@centos60 hadoop]$ vim yarn-env.sh
读取顺序
3、配置文件 core-site.xml,指定访问 hadoop web 界面访问路径
这个是 hadoop 的核心配置文件,这里需要配置的就这两个属性,fs.default.name 配置了hadoop 的 HDFS 系统的命名,位置为主机的 6000 端口;
hadoop.tmp.dir 配置了 hadoop 的 tmp 目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用 mkdir 命令新建一下。
[hadoop@centos60 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://centos60:6000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>13107</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description>Abase for other temporary derectories.</description>
</property>
</configuration>
io.file.buffer.size 的默认值 4066 。这是读写 sequence file 的 buffer size, 可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536
4、配置文件 hdfs-site.xml
这个是 hdfs 的配置文件,dfs.http.address 配置了 hdfs 的 http 的访问位置;
dfs.replication 配置了文件块的副本数,一般不大于从机的个数。
[hadoop@centos60 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>centos60:6001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
<name>dfs.replication</name>
<value>2</value> #每个 Block 有 2 个备份。
5、配置文件 mapred-site.xml
这个是 mapreduce 任务的配置
[hadoop@centos60 hadoop]$ vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:16888</value>
</property>
</configuration>
由于 hadoop2.x 使用了 yarn 框架,所以要实现分布式部署,必须在mapreduce.framework.name 属性下配置为 yarn
同时指定:Hadoop 的历史服务器 historyserver
Hadoop 自带了一个历史服务器,可以通过历史服务器查看已经运行完的 Mapreduce 作业记录,比如用了多少个 Map、用了多少个 Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop 历史服务器是没有启动的,我们可以通过下面的命令来启动 Hadoop 历史服务器
6、配置节点 yarn-site.xml
该文件为 yarn 框架的配置,主要是一些任务的启动位置
[hadoop@centos60 hadoop]$ vim yarn-site.xml
<configuration>
<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>centos60:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>centos60:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>centos60:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>centos60:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>centos60:8088</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/home/hadoop/hadoop-3.0.0/etc/hadoop:/home/hadoop/hadoop-3.0.0/share/hadoop/common/lib/*:/home/hadoop/hadoop-3.0.0/share/hadoop/common/*:/home/hadoop/hadoop-3.0.0/share/hadoop/hdfs:/home/hadoop/hadoop-3.0.0/share/hadoop/hdfs/lib/*:/home/hadoop/hadoop-3.0.0/share/hadoop/hdfs/*:/home/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/*:/home/hadoop/hadoop-3.0.0/share/hadoop/yarn:/home/hadoop/hadoop-3.0.0/share/hadoop/yarn/lib/*:/home/hadoop/hadoop-3.0.0/share/hadoop/yarn/*</value>
</property>
</configuration>
7、在 workers 配置文件中指定 datanode 节点的主机名,方便后期 namenode 节点调用
[hadoop@centos60 hadoop]$ vim workers
centos70
centos80
把 hadoop 安装软件,复制到其他 datanode 节点: centos70和 centos80
拷贝前我们直接修改一下权限
[hadoop@centos60 ~]$ chown hadoop:hadoop -R /home/hadoop/hadoop-3.0.0
[hadoop@centos60 ~]$ scp -r /home/hadoop/hadoop-3.0.0 hadoop@centos70:~/
[hadoop@centos60 ~]$ scp -r /home/hadoop/hadoop-3.0.0 hadoop@centos80:~/[root@centos70 ~]# ll /home/hadoop/hadoop-3.0.0/etc/hadoop/ #检查下权限
[root@centos80 ~]# id hadoop
uid=8000(hadoop) gid=8000(hadoop) 组=8000(hadoop)
namenode 和 datanode 配置的区别是:datanode 上不需要运行 yarn 集群资源管理服务。所以 datanode 不需要修改 yarn-site.xml 配置文件。
安装并初始化 Hadoop 集群
在 centos60上启动 Hadoop
1. 切换到 hadoop 用户并格式化文件系统
hadoop namenode 的初始化,只需要第一次的时候初始化,之后就不需要了。 因为你 namenode上的文件系统是 HDFS 的,所以要格式化。
[hadoop@centos60 hadoop]$ /home/hadoop/hadoop-3.0.0/bin/hdfs namenode -format
查看格式化后,生成的文件:
2. 启动 hdfs: ./sbin/start-dfs.sh,即启动 HDFS 分布式存储
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/start-dfs.sh
3. 查看进程,此时 namenoade 有进程:namenode 和 secondarynamenode 进程:
[hadoop@centos60 ~]$ ps aux | grep namenode
[root@centos70 hadoop]# ps aux | grep datanode
[root@centos80 hadoop]# ps -aux | grep datanode
4. 启动分布式计算
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/start-yarn.sh
查看进程:
[hadoop@centos60 ~]$ ps aux | grep resourcemanager
start-dfs.sh 和 start-yarn.sh 这两个脚本可用 start-all.sh 代替
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/stop-all.sh
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/start-all.sh5. 启动 jobhistory 服务,查看 mapreduce 运行状态
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/mr-jobhistory-daemon.sh start historyserver
在主节点上启动存储服务和资源管理主服务。使用命令:
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/hadoop-daemon.sh start datanode
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/sbin/yarn-daemon.sh start nodemanager集群状态监控
1. 查看 HDFS 分布式文件系统状态
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/bin/hdfs dfsadmin -report
2. 通过 web 界面来查看 HDFS 状态和查看文件块组成部分:
[hadoop@centos60 ~]$ /home/hadoop/hadoop-3.0.0/bin/hdfs fsck / -files -blocks
http://192.168.0.60:9870/dfshealth.html#tab-datanode
通过Web查看hadoop集群状态
查看 JobHistory 的内容:
http://192.168.0.60:19888/jobhistory
排错:
报错 1:
centos70: Host key verification failed.
解决:
[hadoop@centos60 ~]$ ssh-copy-id centos70
[hadoop@centos60 ~]$ ssh centos70 #确认可以不输入密码直接连接上 centos70。
注:如果前面有配置 ssh-copy-id 这里还是提示
关闭后再重启:
[hadoop@centos60 ~]$ cd hadoop-3.0.0/
[root@centos60 hadoop-3.0.0]# /home/hadoop/hadoop-3.0.0/sbin/stop-dfs.sh
[root@centos60 hadoop-3.0.0]# /home/hadoop/hadoop-3.0.0/sbin/start-dfs.sh
报错 2: log 文件权限不够,解决方法:
[hadoop@centos60 hadoop-3.0.0]$ exit
报错3:
实战-通过 Hadoop 执行计算任务
1. 设置 HADOOP_HOME 环境变量,方便后期调用命令。
切换到 root 用户下:
[hadoop@centos60 ~]$ su - root
[root@centos60 ~]# vim /etc/profile
export HADOOP_HOME=/home/hadoop/hadoop-3.0.0
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
[root@centos60 ~]# su - hadoop
[hadoop@centos60 ~]$ start-
按两下 tab 键,测试命令补齐
测试:运行 Hadoop 计算任务,Word Count 字数统计
[hadoop@centos60 ~]$ source /etc/profile
[hadoop@centos60 ~]$ pwd
/home/hadoop[hadoop@centos60 ~]$ vim file01.txt
man
kong
man
Hello World
mk
[hadoop@centos60 ~]$ vim file02.txt
mk
www.centos.cn
cd
cat
man
2. 将这两个文件放入 hadoop 的 HDFS 中
[hadoop@centos60 ~]$ hadoop fs -ls / #查看 hdfs 目录情况
Found 1 items
drwxrwx--- - hadoop supergroup 0 2020-11-06 12:26 /tmp[hadoop@centos60 ~]$ hadoop fs -mkdir -p /input #在hdpf的根目录下,创建input目录
[hadoop@centos60 ~]$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2020-11-06 12:48 /input
drwxrwx--- - hadoop supergroup 0 2020-11-06 12:26 /tmp[hadoop@centos60 ~]$ hadoop fs -put /home/hadoop/file*.txt /input #把file*.txt文件放到hdfs的input目录下
[hadoop@centos60 ~]$ hadoop fs -cat /input/file01.txt #查看命令
man
kong
man
Hello World
mk
3. 计执行 wordCount单词统计汇总并查看结果
[hadoop@centos60 ~]$ hadoop jar /home/hadoop/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar wordcount /input /output
查看运行之后产生的文件
[hadoop@centos60 ~]$ hadoop fs -ls /output
查看运行结果
[hadoop@centos60 ~]$ hadoop fs -cat /output/part-r-00000
总之,遇到错误不要慌,多看看$HADOOP_HOME/logs 下面的日志,就能找到问题。
/home/hadoop/hadoop-3.0.0/logs