Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
Hadoop的框架最核心的设计就是:HDFS和MapReduce
HDFS为海量的数据提供了存储。
MapReduce为海量的数据提供了计算。
Hadoop框架包括以下四个模块:
Hadoop Common: 这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的Java文件和脚本。
Hadoop YARN: 这是一个用于作业调度和集群资源管理的框架。
Hadoop Distributed File System (HDFS): 分布式文件系统,提供对应用程序数据的高吞吐量访问。
Hadoop MapReduce:这是基于YARN的用于并行处理大数据集的系统。
优点
Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理 。
Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理 。
Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度 。
Hadoop 还是可伸缩的,能够处理 PB 级数据 。
此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用 。
Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。
HDFS属于Master与Slave结构。一个集群中只有一个NameNode,可以有多个DataNode。
HDFS存储机制保存了多个副本,当写入1T文件时,我们需要3T的存储,3T的网络流量带宽;系统提供容错机制,副本丢失或宕机可自动恢复,保证系统高可用性。
HDFS默认会将文件分割成block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,会导致内存的负担很重。
HDFS采用的是一次写入多次读取的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
HDFS存储理念是以最少的钱买最烂的机器并实现最安全、难度高的分布式文件系统(高容错性低成本),HDFS认为机器故障是种常态,所以在设计时充分考虑到单个机器故障,单个磁盘故障,单个文件丢失等情况。
HDFS容错机制:
节点失败监测机制:DN每隔3秒向NN发送心跳信号,10分钟收不到,认为DN宕机。
通信故障监测机制:只要发送了数据,接收方就会返回确认码。
数据错误监测机制:在传输数据时,同时会发送总和校验码。
官网 https://hadoop.apache.org/
此处下载的是 3.2.1 的版本;
(1)创建用户 hadoop ,给创建的用户设定密码;
[root@server5 ~]# useradd hadoop
##新建用户,以普通用户的身份去搭建 hadoop 平台
[root@server5 ~]# echo westos | passwd --stdin hadoop
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
(2)搭建平台
解压 jdk 的包,并做一个软链接,方便后面做升级;
[root@server5 ~]# su - hadoop
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ln -s jdk1.8.0_181 java ##软连接,以后升级做更改软连接即可
[hadoop@server5 ~]$ ls
hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ll
total 532076
-rw-r--r-- 1 root root 359196911 Apr 24 10:02 hadoop-3.2.1.tar.gz
lrwxrwxrwx 1 hadoop hadoop 12 Apr 24 10:02 java -> jdk1.8.0_181
drwxr-xr-x 7 hadoop hadoop 245 Jul 7 2018 jdk1.8.0_181
-rw-r--r-- 1 root root 185646832 Apr 24 10:02 jdk-8u181-linux-x64.tar.gz
解压 hadoop
的包,并做一个软链接,方便后面做升级;
[hadoop@server5 ~]$ tar zxf hadoop-3.2.1.tar.gz
[hadoop@server5 ~]$ ls
hadoop-3.2.1 hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server5 ~]$ ln -s hadoop-3.2.1 hadoop
[hadoop@server5 ~]$ ls
hadoop hadoop-3.2.1 hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
修改配置文件
[hadoop@server5 ~]$ cd hadoop
[hadoop@server5 hadoop]$ ls
bin etc include lib libexec LICENSE.txt NOTICE.txt README.txt sbin share
[hadoop@server5 hadoop]$ cd etc/hadoop/
[hadoop@server5 hadoop]$ vim hadoop-env.sh ##编辑环境脚本
配置 hadoop-env.sh
文件内容如图所示:
安装单机模式的Hadoop无需配置,在这种方式下,Hadoop被认为是一个单独的Java进程,这种方式经常被用来调试
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hadoop
##检验环境,写入文件中的路径是否正确
[hadoop@server5 hadoop]$ mkdir input ##新建目录
[hadoop@server5 hadoop]$ cp etc/hadoop/*.xml input/ ##导入测试文件
[hadoop@server5 hadoop]$ ls input/
capacity-scheduler.xml hadoop-policy.xml httpfs-site.xml kms-site.xml yarn-site.xml
core-site.xml hdfs-site.xml kms-acls.xml mapred-site.xml
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar ##查看可以做那些计算
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
##运算,此时 output 目录不能存在,如果存在就会报错
此时很快,因为数据比较小,小数据量不建议用 hadoop ,小数据会浪费时间在网络等因素上。
[hadoop@server5 hadoop]$ cd output/
##完成之后会生成该目录
[hadoop@server5 output]$ ls
part-r-00000 _SUCCESS
[hadoop@server5 output]$ cat * ##查看文件内容
1 dfsadmin
运行 Hadoop 自带算法 grep ,运行结束后匹配统计结果已经被写入了HDFS 的 output 目录下,output目录会被自动建立。
伪分布式 Hadoop 配置可以把伪分布式的 Hadoop 视为只有一个节点的集群;在这个集群中,这个节点既是 Master,又是 Slave;既是NameNode,又是DataNode;既是JobTracker,又是TaskTracker。
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server5 hadoop]$ vim core-site.xml
[hadoop@server5 hadoop]$ vim hdfs-site.xml
修改配置文件 core-site.xml
内容如下图所示:
修改配置文件 hdfs-site.xml
内容如下图所示:
[hadoop@server5 ~]$ ssh-keygen
[hadoop@server5 ~]$ ssh-copy-id localhost
[hadoop@server5 ~]$ cd hadoop/etc/hadoop/
[hadoop@server5 hadoop]$ ll workers ##这个里面默认定义的是存储结点(node)
-rw-r--r-- 1 hadoop hadoop 10 Sep 10 2019 workers
[hadoop@server5 hadoop]$ cat workers
localhost
[hadoop@server5 hadoop]$ ssh localhost ##测试面密是否成功
Last login: Sat Apr 24 10:40:22 2021
[hadoop@server5 ~]$ exit
logout
Connection to localhost closed.
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs namenode -format ##格式化,默认的数据目录在/tmp
[hadoop@server5 hadoop]$ id
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[hadoop@server5 hadoop]$ ls /tmp/
hadoop hadoop-hadoop hadoop-hadoop-namenode.pid hsperfdata_hadoop
[hadoop@server5 hadoop]$ sbin/start-dfs.sh ##启动
格式化完成之后的效果如图所示,此时在 /tmp/ 中会生成 Hadoop 的数据 ;
[hadoop@server5 hadoop]$ cd
[hadoop@server5 ~]$ vim .bash_profile
[hadoop@server5 ~]$ source .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/java/bin ##写入解析的目的是为了查看进程方便
[hadoop@server5 ~]$ jps
5234 Jps
4870 DataNode
4763 NameNode
5054 SecondaryNameNode
此时查过端口号之后,便可以在网页加端口号访问172.25.25.5:9870
;
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls ##列出用户的根目录
ls: `.': No such file or directory
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop ##创建以自己用户名称的目录
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls ##此时没有报错
[hadoop@server5 hadoop]$ rm -fr output/
[hadoop@server5 hadoop]$ ls
bin etc include input lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
[hadoop@server5 hadoop]$ bin/hdfs dfs -put input ##上传
(2)下载
当分布式文件系统存在时,此时下载时时从分布式文件系统中获得的;此处删除本地的 input 目录来观察实验效果;
当删除本地的 input 目录之后,此时通过网页查看 Hadoop 内的资源,发现input目录依旧存在。
这里再次运行 Hadoop 自带算法 wordcount 来过滤单词;
运行结束后词频统计结果已经被写入了HDFS 的 output 目录下;
[hadoop@server5 hadoop]$ rm -fr input/
[hadoop@server5 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output
##用计算来统计数量,此时input目录不在会在分布式文件系统中去找,output 目录不能存在,output 也会在分布式文件系统中出现
[hadoop@server5 hadoop]$ bin/hdfs dfs -ls
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2021-04-30 11:20 input
drwxr-xr-x - hadoop supergroup 0 2021-04-30 11:22 output
注: hadoop 要求系统的结点时间要一致.
执行命令 bin/hdfs dfs -cat output/*
查看词频统计结果;
执行命令 bin/hdfs dfs -get output
下载数据;
[hadoop@server1 hadoop]$ bin/hdfs dfs -cat output/*
[hadoop@server1 hadoop]$ bin/hdfs dfs -get output ##下载
以上的集中方式,不管是网页查看,还是命令行的查看还是下载到本地文件系统,都是巍峨了查看文件内容;
分布式文件系统分块的意义是为了快速定位。
(3)删除
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
part-r-00000 _SUCCESS
[hadoop@server1 hadoop]$ rm -fr output/*
[hadoop@server1 hadoop]$ bin/hdfs dfs -rm -r output
Deleted output
从网页也可以删除,但是默认是没有权限的。
Hadoop 的配置文件分为2类:
只读类型的默认文件:src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/mapred/mapred-default.xml
定位设置:etc/hadoop/core-default.xml、etc/hadoop/hdfs-default.xml、etc/hadoop/mapred-default.xml
除此之外,也可以通过设置 conf/Hadoop-env.sh
来为Hadoop的守护进程设置环境变量(在bin目录中)
在Hadoop的设置中,Hadoop的配置是通过资源定位的。每个资源由一系列name/value对以XML文件的形式构成,它以一个字符串命名或者是以Hadoop定义的Path类命名
集群中至少有三台主机来观察实验效果;
前面的操作方法和第一台雷同,新建用户,设定密码,写入解析。
此时,将 server5
作为NameNode
,server6
和server7
作为DataNode
.
(1)新建用户
[root@server6 ~]# useradd hadoop
[root@server6 ~]# echo westos | passwd --stdin hadoop
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
[root@server7 ~]# useradd hadoop
[root@server7 ~]# echo westos | passwd --stdin hadoop
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
(2)关闭之前伪分布文件系统开启的进程
[hadoop@server5 hadoop]$ ls
bin etc include input lib libexec LICENSE.txt logs NOTICE.txt output README.txt sbin share
[hadoop@server5 hadoop]$ sbin/stop-dfs.sh
(3)为了保证全平台数据一致性,此处在每台主机上安装 nfs ;
[root@server5 ~]# yum install -y nfs-utils.x86_64
[root@server6 ~]# yum install -y nfs-utils.x86_64
[root@server7 ~]# yum install -y nfs-utils.x86_64
在第一个用户上进行挂载需要写配置文件,将 /home/hadoop
目录共享出去;
[root@server5 ~]# vim /etc/exports
[root@server5 ~]# cat /etc/exports
/home/hadoop *(rw,anonuid=1000,anongid=1000)
[root@server5 ~]# systemctl start nfs
[root@server5 ~]# showmount -e
Export list for server5:
/home/hadoop *
[root@server6 ~]# showmount -e 172.25.25.5
Export list for 172.25.25.5:
/home/hadoop *
[root@server6 ~]# mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server6 ~]# su - hadoop
[hadoop@server6 ~]$ ls
hadoop hadoop-3.2.1 hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[root@server7 ~]# showmount -e 172.25.25.5
Export list for 172.25.25.5:
/home/hadoop *
[root@server7 ~]# mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server7 ~]# su - hadoop
[hadoop@server7 ~]$ ls
hadoop hadoop-3.2.1 hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
此时免密也已经自动好了; DataNode 挂载了server5 的/home/hadoop;在挂载的目录中就包含有 SSH 的公钥;只需要进行免密的验证即可
(4) Hadoop 集群的配置
[hadoop@server5 hadoop]$ vim workers ##告诉 server6 和 server7 是 datanode
[hadoop@server5 hadoop]$ vim hdfs-site.xml ##此时有两个结点
[hadoop@server1 hadoop]$ vim core-site.xml ##解析文件中的域名
[hadoop@server5 hadoop]$ rm -fr /tmp/*
[hadoop@server5 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server5 hadoop]$ bin/hdfs namenode -format
[hadoop@server5 hadoop]$ sbin/start-dfs.sh
启动之后在另外两个结点即可看到对应的信息;
[hadoop@server6 ~]$ jps
4032 Jps
3965 DataNode
[hadoop@server7 ~]$ jps
3905 DataNode
3966 Jps
此时文件系统就已经搭建完毕。
接下来做测试:
[hadoop@server5 hadoop]$ dd if=/dev/zero of=bigfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.139584 s, 1.5 GB/s
[hadoop@server5 hadoop]$ bin/hdfs dfsadmin -report ##查看报告
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server5 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server5 hadoop]$ bin/hdfs dfs -put bigfile
此时访问网页,发现存了2份,在两个节点上;
(5)热添加
再新建一个 server8 用来实现热更改.
和之前一样要下载 nfs ,写入解析,创建用户和密码;
[root@server8 ~]# yum install nfs-utils.x86_64 -y
[root@server8 ~]# vim /etc/hosts
[root@server8 ~]# useradd hadoop
[root@server8 ~]# echo westos | passwd --stdin hadoop
[root@server8 ~]# showmount -e 172.25.25.5
[root@server8 ~]# mount 172.25.25.5:/home/hadoop/ /home/hadoop/
[root@server8 ~]# su - hadoop
[hadoop@server8 ~]$ ls
hadoop hadoop-3.2.1 hadoop-3.2.1.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
完成之后,此时需要编辑配置文件来实现热添加;新添加的 server8
作为 DataNode
要写入 workers
文件中;
[hadoop@server8 ~]$ cd hadoop
[hadoop@server8 hadoop]$ jps ##此时没改文件,可以看到没有添加上去
13648 Jps
[hadoop@server8 hadoop]$ vim workers
[hadoop@server8 hadoop]$ cat workers
server6
server7
server8
[hadoop@server8 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server8 hadoop]$ bin/hdfs --daemon start datanode ##启动集群
[hadoop@server8 hadoop]$ jps
14107 Jps
14077 DataNode
以上启动过程在那个结点都可以,热添加;
此时在网页访问使便可以看到三个 datanode;
不管是在slave 还是master 端操作都一样;此次在 server8 上上传数据来观察效果;
客户端将文件 kkk 分割成 2个block,分别交给指定的DataNode,DataNode复制保存block;
[hadoop@server8 hadoop]$ ls
bigfile etc lib LICENSE.txt NOTICE.txt README.txt share
bin include libexec logs output sbin
[hadoop@server8 hadoop]$ mv bigfile kkk
[hadoop@server8 hadoop]$ bin/hdfs dfs -put kkk
此时 server8 即是一个数据结点又是一个客户端;
此时在网页中可以看到新上传的文件,三个节点之间是均匀分布的。
第一个副本一定会存放在当前。