【Hadoop 伪分布式 与 完全分布式 的安装部署】
Hadoop 伪分布式
• 伪分布式
– 伪分布式的安装和完全分布式类似,但区别是所有角
色安装在一台机器上,使用本地磁盘,一般生产环境
都会使用完全分布式,伪分布式一般用来学习和测试
方面的功能
– 伪分布式的配置和完全分布式配置类似
+++++++++++++++++++++++++++++++++++++++++++++++
HDFS 分布式文件系统
——完全分布式
• 系统规划
主机 角色 软件
192.168.1.10
Nn01 NameNode
Sec ondaryNameNode HDFS
192.168.1.11
Node1 Da taNode HD FS
192.168.1.12
Node2 DataNode HDFS
192.168.1.13
node3 DataNode HDFS
---------------------------
搭建完全分布式
【【一】】• 基础环境准备
– 新开启3台虚拟机
– 禁用 selinux
SELINUX=disabled
– 禁用 firewalld
systemctl stop firewalld
systemctl mask firewalld
– 安装 java-1.8.0-openjdk-devel
yum install -y java-1.8.0-openjdk-devel
----------------
搭建完全分布式
• 基础环境准备
– 在3台机器上配置 /etc/hosts
– 注: 所有主机都能 ping 同 namenode 的主机名
–
namenode 能 ping 同所有节点
– java -version 验证 java 安装
– jps 验证角色
-----------------------
完全分布式
• 配置 SSH 信仸关系(namenode)
– 注意:不能出现要求输入 yes 的情况,每台机器都要
能登录成功,包括本机!!!
– ssh_config
StrictHostKeyChecking no
– ssh-keygen -b 2048 -t rsa -N '' -f key
– ssh-copy-id -i ./key.pub root@ip.xx.xx.xx
4台hosts 都配置
192.168.1.20 nn01
192.168.1.21 node1
192.168.1.22 node2
192.168.1.23 node3
[root@nn01 ~]# vim /etc/hosts
192.168.1.10 nn01
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
[root@nn01 ~]# rsync -av /etc/hosts node1:/etc/
-bash: rsync: 未找到命令
[root@nn01 ~]# yum provides rsync #查找这个命令由哪个包产生
[root@nn01 ~]# yum -y install rsync #(node1 2 3 也要安装!)
同步到node1 2 3
[root@nn01 ~]# rsync -av /etc/hosts node1:/etc/
[root@nn01 ~]# rsync -av /etc/hosts node2:/etc/
[root@nn01 ~]# rsync -av /etc/hosts node3:/etc/
【nn01 已经部署安装过了hadoop】
[root@nn01 ~]# yum install java-1.8.0-openjdk-devel
[root@node1 ~]# yum install java-1.8.0-openjdk-devel
[root@node2 ~]# yum install java-1.8.0-openjdk-devel
[root@node3 ~]# yum install java-1.8.0-openjdk-devel
验证一下所有机器java环境
[root@nn01 ~]# for i in node{1..3};do ssh ${i} jps; done
root@node1's password:
10290 Jps
root@node2's password:
10263 Jps
root@node3's password:
1442 Jps
-------------------------
【【二 】】配置 SSH 信任关系
– 注意:不能出现要求输入 yes 的情况,每台机器都要
能登录成功,包括本机!!
– ssh-keygen -b 2048 -t rsa -N '' -f key
– ssh-copy-id -i ./key.pub root@ip.xx.xx.xx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解释: -f key key表示文件名,key有两个文件名(id_rsa , id_rsa.pub);如果指定了key的话,它会指定文件名; -f filename; 如果在外面生成了,私钥需要拷贝到root下的.ssh里才能生效! 因为配置文件里面写的路径就是/root/.ssh/
除非自己私自更改路径;
[root@nn01 ~]# vim /etc/ssh/ssh_config
....... ......
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa #—> 默认写好了路径, 想改就把注释去掉,自己写路径
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
.........
记住:如果使用了 ssh-keygen -b 2048 -t rsa -N '' -f key (没有指定key的文件名),
会生成 两个文件.key .key.pub (如果指定了key文件名,或者默认,会生成id_rsa id_rsa.pub )
[root@nn01 ~]# ls
.key .key.pub
那么私钥可能会生成在外面, 可能无法实现 免秘钥匙,怎么解决,
私钥 默认是在root下的.ssh里
1种方法:
mv key /root/.ssh/id_rsa (把生成的文件key放到/root/.ssh/ 重命名id_rsa)
2种方法: 找到key的路径,把配置文件里面的路径改一下。
3种方法:ssh -i key 192.168.1.10
如果不想出现这问题,想省事情 就直接 ssh-keygen -b 2048 -t rsa -N '' 不带-f key 就生成默认的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
##: ssh 的时候,需要输入“yes” 在配置文件中找到“StrictHostKeyChecking”写到“Host”下面
[root@nn01 ~]# vim /etc/ssh/ssh_config # 不让出现输入yes情况!
.... ... ..
Host *
GSSAPIAuthentication yes
StrictHostKeyChecking no
......
[root@nn01 .ssh]# ssh-keygen -t rsa -b 2048 -N '' -f id_rsa
[root@nn01 .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@nn01 .ssh]#
[root@nn01 .ssh]# ssh-copy-id -i id_rsa.pub nn01
[root@nn01 .ssh]# ssh-copy-id -i id_rsa.pub node1
[root@nn01 .ssh]# ssh-copy-id -i id_rsa.pub node2
[root@nn01 .ssh]# ssh-copy-id -i id_rsa.pub node3
[root@nn01 .ssh]# ssh localhost
[root@nn01 .ssh]# ssh node1
[root@nn01 .ssh]# ssh node2
[root@nn01 .ssh]# ssh node3
----------------------------------
【hadoop官方网址::---》》》】http://hadoop.apache.org/
hadoop官方文档 http://hadoop.apache.org/
-> Documentation -> 找到相应的版 --> configuration——> 看到相应的配置文件
+++++++++
Hadoop 配置文件及格式
• 文件格式
– Hadoop-env.sh
JAVA_HOME
HADOOP_CONF_DIR
– Xml 文件配置格式
<property>
<name>关键字</name>
<value>变量值</value>
<description> 描述 </description>
</property>
【【 三 】】• HDFS 完全分布式系统配置
– 环境配置文件 hadoop-env.sh
– 核心配置文件 core-site.xml
– HDFS配置文件 hdfs-site.xml
– 节点配置文件 slaves
:: hadoop 有通用性 在一台机器上配置完了 所有节点的配置文件相同,
所以在一台机器上配置完之后,可以拷贝(同步)到其它机器上 ,就完成了配置。
----------------------
1. # # # 环境配置文件 hadoop-env.sh #
– openjdk 的安装目录
– JAVA_HOME
– hadoop 配置文件的存放目录
– HADOOP_CONF_DIR
-------------------
找到软件,或者下载到机器上 (本次实验之前我的把下载的hadoop软件放到另外一台机器上了)
[root@node20 ~]# lftp 192.168.1.254
lftp 192.168.1.254:/> cd elk/hadoop/
lftp 192.168.1.254:/elk/hadoop> get hadoop-2.7.6.tar.gz
[root@node20 ~]# ls
hadoop-2.7.6.tar.gz
[root@node20 ~]#
[root@node20 ~]# tar zxf hadoop-2.7.6.tar.gz
[root@node20 ~]# ls
hadoop-2.7.6 hadoop-2.7.6.tar.gz
[root@node20 ~]# mv hadoop-2.7.6 /usr/local/hadoop
[root@node20 ~]#
[root@node20 ~]# cd /usr/local/hadoop/
[root@node20 hadoop]# ls
bin include libexec NOTICE.txt sbin
etc lib LICENSE.txt README.txt share
『bin里面放的可以执行的命令文件; sbin也是命令 服务相关的; include放的是引用的类库 libexec执行的一些类库
etc配置文件所在的路径; lib动态连接库 share 编写的一些文档,案例,代码!』
[root@node20 hadoop]# ls bin/
container-executor hdfs mapred.cmd yarn
hadoop hdfs.cmd rcc yarn.cmd
hadoop.cmd mapred test-container-executor
[root@node20 hadoop]#
[root@node20 hadoop]# ./bin/hadoop ## — — — —>> 运行一下hadoop
Error: JAVA_HOME is not set and could not be found. ##报错!
[root@node20 hadoop]#
[root@node20 hadoop]# rpm -ql java-1.8.0-openjdk ##查找一下java的安装的家目录路径
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64-policytool.desktop
..... ..... .... ....
可以看到家目录,共有的目录到/jre 之前都相同
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre
[root@node20 hadoop]# ls
[root@node20 hadoop]# cd etc/
[root@node20 etc]# ls
hadoop
[root@node20 hadoop]# ls
[root@node20 hadoop]# pwd
/usr/local/hadoop/etc/hadoop ##----->> hadoop 配置文件的路径!
[root@node20 hadoop]# pwd
/usr/local/hadoop/etc/hadoop
[root@node20 hadoop]# vim hadoop-env.sh #(这其实是个脚本,修改这个脚本, 非注释的 前两行!)
修改前
export JAVA_HOME=${JAVA_HOME}
与 后
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"
修改前
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"} ##// hadoop配置文件路径!
【解释: ${HADOOP_CONF_DIR:-"/etc/hadoop"} 前面是个变量 HADOOP_CONF_DIR这是变量的主题,后面/etc/hadoop是个字符串; 其中 :- 表示 前面变量为空或没有设置的时候,由后面字符串代替 】
修改后
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
[root@node20 hadoop]# cd /usr/local/hadoop/
[root@node20 hadoop]# ./bin/hadoop ##此时就不会报错了!显示出信息了!
验证安装是否完成!
[root@node20 hadoop]# ./bin/hadoop version ## 查看一下版本 这时候安装完成!
Hadoop 2.7.6
Subversion https://shv@git-wip-us.apache.org/repos/asf/hadoop.git -r 085099c66cf28be31604560c376fa282e69282b8
Compiled by kshvachk on 2018-04-18T01:33Z
Compiled with protoc 2.5.0
From source with checksum 71e2695531cb3360ab74598755d036
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.6.jar
[root@node20 hadoop]#
------------------
2 # # # 核心配置文件 core-site.xml #
默认都是注释,配置文件部分 是空的 需要手写
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
.... .. .. ..
<!--
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
</configuration>
[root@nn01 hadoop]# vim core-site.xml
[root@nn01 ~]# cd /usr/local/hadoop/
[root@nn01 hadoop]# ls
[root@nn01 hadoop]# cd etc/hadoop/
[root@nn01 hadoop]# pwd
/usr/local/hadoop/etc/h
[root@nn01 hadoop]# vim core-site.xml
....... ...... ... ...
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn01:9000</value> #->namenode
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value> #->可以理解为hadoop的数据根目录
</property>
</configuration>
[root@nn01 hadoop]# mkdir /var/hadoop # 建立数据目录
[root@nn01 hadoop]# ssh node1 mkdir /var/hadoop #为每个节点创造目录
[root@nn01 hadoop]# ssh node2 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node3 mkdir /var/hadoop
---------------------------------------
3 # # # HDFS配置文件 hdfs-site.xml #
[root@nn01 hadoop]# vim hdfs-site.xml
... ... ... ... ...
<configuration>
<property>
<name>dfs.namenode.http-address</name> #namenode的地址
<value>nn01:50070</value> #namenode的地址(ip)
</property>
<property>
<name>dfs.namenode.secondary.http-address</name> #相当于namenode的小蜜 本次实验还是nn01
<value>nn01:50090</value>
</property>
<property>
<name>dfs.replication</name> #切块数据 存几份 默认是3份
<value>2</value> # 存两份!
</property>
</configuration>
---------------------------------------------------------
4 # # # 节点配置文件 slaves #
完全分布式
• 节点配置文件 slaves
– 只写 datanode 节点的主机名称
node1
node2
node3
[root@nn01 ~]# cd /usr/local/hadoop/
[root@nn01 hadoop]# ls
bin etc include lib libexec LICENSE.txt NOTICE.txt oo README.txt sbin share xx
[root@nn01 hadoop]# cd etc/hadoop/
[root@nn01 hadoop]# pwd
/usr/local/hadoop/etc/hadoop
[root@nn01 hadoop]# ls
[root@nn01 hadoop]# vim slaves ## 其实就是写datanode的主机名
node1
node2
node3
--------------------------------
5 # # #
– 同步配置
– hadoop 所有节点的配置参数完全一样,我们在一台
配置好以后,要把配置文件分发到其它所有主机上去
[root@nn01 hadoop]# for i in node{1..3};do
> rsync -aSH --delete /usr/local/hadoop ${i}:/usr/local/ -e 'ssh' &
> done
[1] 11977
[2] 11978
[3] 11979
[root@nn01 hadoop]# wait
[1] 完成 rsync -aSH --delete /usr/local/hadoop ${i}:/usr/local/ -e 'ssh'
[2]- 完成 rsync -aSH --delete /usr/local/hadoop ${i}:/usr/local/ -e 'ssh'
[3]+ 完成 rsync -aSH --delete /usr/local/hadoop ${i}:/usr/local/ -e 'ssh'
[root@nn01 hadoop]#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
补充:注意::--->>
为了方便后期同步,我们可以写个脚本!
[root@nn01 hadoop]# cd /usr/local/bin/
[root@nn01 bin]# ls
[root@nn01 bin]# vim rrr
#!/bin/bash
for i in $@;do
rsync -aSH --delete /usr/local/hadoop/etc ${i}:/usr/local/hadoop/ -e 'ssh' &
done
wait
[root@nn01 bin]# chmod 755 rrr
[root@nn01 bin]# cd
[root@nn01 ~]#
[root@nn01 ~]# rrr node{1..3}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 # # #
– 在所有机器上创建 /var/hadoop 文件夹 这一步骤在“2 ##”已经做过
mkdir /var/hadoop
– 在 namenode 上执行格式化操作
./bin/hdfs namenode -format
– 启劢集群
./sbin/start-dfs.sh
[root@nn01 ~]# cd /usr/local/hadoop/
[root@nn01 hadoop]# ls
[root@nn01 hadoop]# ./bin/hdfs 直接“回车” 可以看到帮助!
[root@nn01 hadoop]# ./bin/hdfs namenode -format #------> 执行格式化!!
格式化:成功的结果是 会看到一列 INFO 没有erro 应该也没有waring 会看到successfully
启动集群之前 是没有叫logs的文件夹
[root@nn01 hadoop]# ls
bin etc include lib libexec LICENSE.txt NOTICE.txt oo README.txt sbin share xx
[root@nn01 hadoop]#
[root@nn01 hadoop]# ./sbin/start-dfs.sh #-----------> 启动集群!!
[root@nn01 hadoop]# ./sbin/stop-dfs.sh #-----------> 关闭集群!!
启动集群之后 会看到logs文件夹
[root@nn01 hadoop]# ls
bin include libexec logs oo sbin xx
etc lib LICENSE.txt NOTICE.txt README.txt share
[root@nn01 hadoop]#
-----------------------------------
7 # # #——————
• JPS验证角色:
– namenode 验证
[root@nn01 hadoop]# jps
29826 SecondaryNameNode
31237 Jps
29643 NameNode
– datanode 验证
[root@node1 ~]# jps
24472 Jps
24027 DataNode
[root@nn01 hadoop]# jps ## 可以看到nn01 有两个角色!!!
12481 Jps
12355 SecondaryNameNode
12168 NameNode
[root@nn01 hadoop]#
[root@nn01 hadoop]# ssh node1 jps
11162 Jps
11085 DataNode
[root@nn01 hadoop]#
[root@nn01 hadoop]# ssh node2 jps
11057 DataNode
11133 Jps
[root@nn01 hadoop]#
[root@nn01 hadoop]#
[root@nn01 hadoop]# ssh node3 jps
11043 Jps
10966 DataNode
[root@nn01 hadoop]#
--------------------------------------------------
8 ###
完全分布式
• 节点验证:
– namenode 上
– bin/hdfs dfsadmin -report
[root@nn01 hadoop]# bin/hdfs dfsadmin -report
Configured Capacity: 51505004544 (47.97 GB)
DFS Used: 733184 (716 KB)
... ...
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (3):
-
实际验证::———>>>>
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report
Configured Capacity: 64389844992 (59.97 GB)
Present Capacity: 59319640064 (55.25 GB)
DFS Remaining: 59319627776 (55.25 GB)
DFS Used: 12288 (12 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (3): #!#!#------------>> 一定是3 因为我们之前规划的就是三个!!
Name: 192.168.1.12:50010 (node2)
Hostname: node2
Decommission Status : Normal
Configured Capacity: 21463281664 (19.99 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 1690120192 (1.57 GB)
DFS Remaining: 19773157376 (18.42 GB)
DFS Used%: 0.00%
DFS Remaining%: 92.13%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Wed Aug 08 11:45:33 CST 2018
Name: 192.168.1.11:50010 (node1)
Hostname: node1
Decommission Status : Normal
Configured Capacity: 21463281664 (19.99 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 1690034176 (1.57 GB)
DFS Remaining: 19773243392 (18.42 GB)
DFS Used%: 0.00%
DFS Remaining%: 92.13%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Wed Aug 08 11:45:33 CST 2018
Name: 192.168.1.13:50010 (node3)
Hostname: node3
Decommission Status : Normal
Configured Capacity: 21463281664 (19.99 GB)
DFS Used: 4096 (4 KB)
Non DFS Used: 1690050560 (1.57 GB)
DFS Remaining: 19773227008 (18.42 GB)
DFS Used%: 0.00%
DFS Remaining%: 92.13%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Wed Aug 08 11:45:33 CST 2018
------------------------------------------------------
排错::————>>
如果看不到哪台机器 就去哪台机器上 去排错!
例如namenode
[root@nn01 hadoop]# cd logs/
[root@nn01 logs]#
[root@nn01 logs]# ls
hadoop-root-namenode-nn01.log hadoop-root-secondarynamenode-nn01.out
hadoop-root-namenode-nn01.out SecurityAuth-root.audit
hadoop-root-secondarynamenode-nn01.log
解释:hadoop-root-namenode-nn01.log hadoop-root-namenode-nn01.out
hadoop 软件平台名称 ; root表示启动这个服务的用户 ; namenode表示这个用户启动的角色 ;
nn01 表示服务器的名称 ; .log日志输出; .out屏幕输出
例如到datanode 也一样
[root@node1 hadoop]# ls
bin include libexec logs oo sbin xx
etc lib LICENSE.txt NOTICE.txt README.txt share
[root@node1 hadoop]# cd logs/
[root@node1 logs]# ls
hadoop-root-datanode-node1.log hadoop-root-datanode-node1.out SecurityAuth-root.audit
[root@node1 logs]#
另外排错,什么样的角色 就存什么要的数据
例如node1
[root@node1 ~]# cd /var/hadoop/
[root@node1 hadoop]# ls
dfs
[root@node1 hadoop]# cd dfs/
[root@node1 dfs]# ls
data ## 只有data 因为node1它是datanode角色
[root@node1 dfs]# tree
.
└── data
├── current
│ ├── BP-1963026238-192.168.1.10-1533699139698
│ │ ├── current
│ │ │ ├── finalized
│ │ │ ├── rbw
│ │ │ └── VERSION
│ │ ├── scanner.cursor
│ │ └── tmp
│ └── VERSION
└── in_use.lock
7 directories, 4 files
[root@node1 dfs]#
再如nn01 它是name角色 namesecondary角色
[root@nn01 hadoop]# cd /var/hadoop/
[root@nn01 hadoop]# ls
dfs
[root@nn01 hadoop]# cd dfs/
[root@nn01 dfs]# ls
name namesecondary ## 只有name namesecondary 没有data
[root@nn01 dfs]#
# # # 就是数这台机器起什么角色,它/var/hadoop 才会存什么样的东西!
那么角色由什么查看呢
#如果这些都没有问题,那么hadoop就成功了