基本概念:
1. Hadoop是一个分布式文件系统的基础架构,用户可以利用集群进行高速运算和存储
2. Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算
3. Hdfs主要模块:NameNode、DataNode
4. HDFS主要模块及运行原理:
(1)NameNode:
功能:是整个文件系统的管理节点。维护整个文件系统的文件目录树,文件/目录的元数据和每个文件对应的数据块列表。接收用户的请求
(2)DataNode:
功能:是HA(高可用性)的一个解决方案,是备用镜像,但不支持热备
5. Hadoop的三种模式:
(1)单机模式Local或Standalone Mode
默认情况下,Hadoop即处于该模式,用于开发和调试,使用本地文件系统,而不是分布式文件系统,Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程。用于对MapReduce程序的逻辑进行调试,确保程序的正确
(2)伪分布式模式(Pseudo-Distrubuted Mode)
(3)完全分布式模式
一、单机分布式
1.创建hadoop用户,将安装包传到hadoop的家目录下
[root@server1 ~]# useradd hadoop
[root@server1 ~]# id hadoop
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[root@server1 ~]# ls
hadoop-3.0.3.tar.gz jdk-8u181-linux-x64.tar.gz
[root@server1 ~]# mv * /home/hadoop/
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz jdk-8u181-linux-x64.tar.gz
(1)jdk
[hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ln -s jdk1.8.0_181/ java
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ tar zxf hadoop-3.0.3.tar.gz
[hadoop@server1 ~]$ ls
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
hadoop-3.0.3.tar.gz jdk1.8.0_181
[hadoop@server1 ~]$ ln -s hadoop-3.0.3 hadoop
[hadoop@server1 ~]$ ls
hadoop hadoop-3.0.3.tar.gz jdk1.8.0_181
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim hadoop-env.sh
54 export JAVA_HOME=/home/hadoop/java
4.添加系统环境变量
[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ vim .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/java/bin
[hadoop@server1 ~]$ source .bash_profile
[hadoop@server1 ~]$ jps
11515 Jps
[hadoop@server1 ~]$ ls
hadoop hadoop-3.0.3.tar.gz jdk1.8.0_181
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ ls
bin include libexec NOTICE.txt sbin
etc lib LICENSE.txt README.txt share
[hadoop@server1 hadoop]$ mkdir input
[hadoop@server1 hadoop]$ cd input
[hadoop@server1 input]$ ls
[hadoop@server1 input]$
[hadoop@server1 input]$ cd ..
[hadoop@server1 hadoop]$
[hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input
[hadoop@server1 hadoop]$ ls input/
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar grep input output 'dfs[a-z.]+'
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
part-r-00000 _SUCCESS
[hadoop@server1 output]$ cat *
1 dfsadmin
二、伪分布式
存和取都是在分布式文件系统中和本地文件系统没有任何关系
1.切换到hadoop/etc/hadoop目录下编辑文件,写入的内容如下
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop/etc/hadoop
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ vim core-site.xml
fs.defaultFS
hdfs://localhost:9000
[hadoop@server1 hadoop]$ vim hdfs-site.xml
dfs.replication
1
[hadoop@server1 ~]$ ssh-keygen
[hadoop@server1 ~]$ logout
[root@server1 ~]# passwd hadoop
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.1 ##这三步的目的只是刷掉yes
[hadoop@server1 ~]$ ssh-copy-id localhost
[hadoop@server1 ~]$ ssh-copy-id server1
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
[hadoop@server1 hadoop]$ cd sbin
[hadoop@server1 sbin]$ ls
[hadoop@server1 sbin]$ ./start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [server1]
[hadoop@server1 sbin]$ jps
12241 DataNode
12579 Jps
12423 SecondaryNameNode
12142 NameNode
5.浏览器访问172.25.19.1:9870可以看到web界面
这里hdfs使用的端口是9870,但是各版本之间存在差异
6.测试:
(1)创建目录
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
(2)浏览器中utiltles—>browes the file system 查看文件,现在/user/hadoop下什么都没有
(3)上传文件
[hadoop@server1 hadoop]$ bin/hdfs dfs -put input
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2019-05-19 13:28 input
(4)浏览器中刷新,可以看到input 目录,点击可以看到具体有那些文件
注意:现在的input文件不是/home/hadoop/hadoop下的input
可以点击input查看目录中的文件
(5)删除input和output目录,再次生成(证明浏览器中的input目录不是hadoop目录下的同名目录)
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ rm -fr input/ output/
[hadoop@server1 hadoop]$ ls
在当前目录中没有input和output目录,但是浏览器中依然存在input目录
(6)再次生成output目录,将这个包的内容统计为单词个数输出到output
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount input output
[hadoop@server1 hadoop]$ ls
(7)浏览器中刷新,查看output,有两个文件 ,点一第一个出来的是他的大小
三、完全分布式
首先将dfs文件系统中的内容清除
1.关闭服务,清楚原来的数据
因为这一步是要做集群,需要保证每一个节点上的数据是一致的,但是新加的两个节点是全新的虚拟机,所以要将server1上的数据清除
[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [server1]
[hadoop@server1 hadoop]$ cd /tmp/
[hadoop@server1 tmp]$ ls
hadoop hadoop-hadoop hsperfdata_hadoop
[hadoop@server1 tmp]$ ll
[hadoop@server1 tmp]$ rm -fr *
[hadoop@server1 tmp]$ ls
[hadoop@server1 tmp]$ cd
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ logout
2.server2和server3创建hadoop用户,三个节点都安装nfs
server1:
[root@server1 ~]# yum install -y nfs-utils
[root@server2 ~]# useradd -u 1000 hadoop
[root@server2 ~]# yum install -y nfs-utils
[root@server3 ~]# useradd -u 1000 hadoop
[root@server3 ~]# yum install -y nfs-utils
3.三个节点都开启rpcbind服务(这个服务默认是开机自启动的)
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# systemctl enable rpcbind
[root@server2 ~]# systemctl start rpcbind
[root@server3 ~]# systemctl start rpcbind
[root@server1 ~]# ls
[root@server1 ~]# vim /etc/exports
/home/hadoop *(rw,anonuid=1000,anongid=1000)
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# exportfs -v
/home/hadoop (rw,wdelay,root_squash,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,no_all_squash)
[root@server1 ~]# showmount -e
Export list for server1:
/home/hadoop *
5.server2和server3挂载
(这两步实际上是在配置NFS文件系统,这样的话后面的操作只需要在一server1上做便可以达到整个集群都部署的效果)
server2:
[root@server2 ~]# showmount -e server1
Export list for server1:
/home/hadoop *
[root@server2 ~]# mount 172.25.19.1:/home/hadoop/ /home/hadoop/
[root@server2 ~]# df
[root@server3 ~]# systemctl start rpcbind
[root@server3 ~]# showmount -e server1
Export list for server1:
/home/hadoop *
[root@server3 ~]# mount 172.25.19.1:/home/hadoop/ /home/hadoop/
[root@server3 ~]# df
6.三个节点都切换到hadoop用户,server2和server3同步了server1的hadoop家目录下的内容
[root@server1 ~]# su - hadoop
Last login: Sun May 19 13:11:42 CST 2019 on pts/0
[hadoop@server1 ~]$ ls
[root@server2 ~]# su - hadoop
[hadoop@server2 ~]$ ls
[root@server3 ~]# su - hadoop
[hadoop@server3 ~]$ ls
7.server1将密钥传给server2和server3
这一步的目的是刷掉yes
因为做好了nfs文件系统,这三个结点的数据现在是同步的,server1之前创了密钥,所以现在每个节点中都是有密钥的
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.2
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.3
(1)编辑 core-site.xml配置文件
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$
[hadoop@server1 hadoop]$ vim core-site.xml
fs.defaultFS
hdfs://172.25.19.1:9000 ##这里指向的是master的9000端口
[hadoop@server1 hadoop]$ vim hdfs-site.xml
dfs.replication
2 ##改为两个节点,集群中存储数据的只有2个节点
9.编辑worker文件,文件中的内容是datanode的ip
[hadoop@server1 hadoop]$ vim workers
[hadoop@server1 hadoop]$ cat workers
172.25.19.2
172.25.19.3
(1)初始化集群
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server1]
Starting datanodes
Starting secondary namenodes [server1]
jps查看server1只有namenode,server2和server3都是datanode
[hadoop@server1 hadoop]$ jps
14902 SecondaryNameNode
15035 Jps
14716 NameNode
server2和server3只有datanode
[hadoop@server2 ~]$ jps
11895 Jps
11834 DataNode
[hadoop@server3 ~]$ jps
11888 Jps
11826 DataNode
注意:datanode是真正存储的节点 相当于mfs中的chunkserver
11.测试
(2)创建目录,上传文件
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/ input
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ bin/hdfs dfs -rm -r input
Deleted input![在这里插入图片描述](https://img-blog.csdnimg.cn/2019071314504519.png)
(5)浏览器中查看,会报错
补充:
1.hadoop集群要做到做到全网一致(时间同步 数据一致 )
2.主机名要求解析
3.output自动生成 不能手动建立否则会报错
4.在做hadoop的时候不建议用超级用户,因为是分布式文件系统,超级用户的权限太大,不安全
5.单机版分布式中本机既是namenode又是datanode
在完全分布式中只有一台namenode,可以有多台datanode
6.NameNode 可以控制所有文件操作