传送门:
大数据学习系列:Hadoop3.0苦命学习(一)
大数据学习系列:Hadoop3.0苦命学习(二)
大数据学习系列:Hadoop3.0苦命学习(三)
大数据学习系列:Hadoop3.0苦命学习(四)
大数据学习系列:Hadoop3.0苦命学习(五)
大数据学习系列:Hadoop3.0苦命学习(六)
大数据学习系列:Hadoop3.0苦命学习(七)
内容包括:
(1)Hadoop的介绍
(2)集群环境搭建准备工作
(3)Linux命令和Shell脚本增强
(4)集群环境搭建
大数据:就是对海量数据进行分析处理,得到一些有价值的信息,然后帮助企业做出判断和决策。
处理流程:
Hadoop是一个分布式系基础框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。
它主要解决两个问题:
假设一个文件非常非常大,大小为1PB, 大到世界上所有的高级计算机都存储不下, 怎么办?
HDFS
节点HDFS Master
Master
开始从一个网络日志文件中计算独立 IP, 以及其出现的次数
如果数据量特别大,我们可以将,整个任务拆开, 划分为比较小的任务, 从而进行计算呢。
如果能够在不同的节点上并行执行, 更有更大的提升, 如何把这些任务跑在集群中?
可以设置一个集群的管理者, 这个地方叫做 Yarn
Master
, 用于接收和分配任务Slave
, 用于运行任务在 Hadoop 具体开始前, 先来搭建一下环境:
1:通过ISO镜像安装
2: 直接复制安装好的虚拟机
注意事项:windows系统确认所有的关于VmWare的服务都已经启动
确认好VmWare生成的网关地址,
另外确认VmNet8网卡已经配置好了IP地址。
NAT
仅主机
每 台 机 器 的 内 存 = ( 总 内 存 − 4 ) ÷ 3 每台机器的内存 = \left ( 总内存 - 4\right ) \div 3 每台机器的内存=(总内存−4)÷3
IP | 主机名 | 环境配置 | 安装 |
---|---|---|---|
192.168.188.100 | node01 | 关防火墙和selinux, host映射, 时钟同步 | JDK, NameNode, ResourceManager, Zookeeper |
192.168.188.110 | node02 | 关防火墙和selinux, host映射, 时钟同步 | JDK, DataNode, NodeManager, Zeekeeper |
192.168.188.120 | node03 | 关防火墙和selinux, host映射, 时钟同步 | JDK, DataNode, NodeManager, Zeekeeper |
ifconfig
查看网卡名称为ens33,现在要将它修改成eth0/etc/sysconfig/network-scripts/ifcfg-ens33
cd /etc/sysconfig/network-scripts/
mv ifcfg-ens33 ifcfg-eth0
/etc/default/grub
并加入net.ifnames=0 biosdevname=0
5. 运行命令grub2-mkconfig -o /boot/grub2/grub.cfg
来重新生成GRUB配置并更新内核参数
6. 使用reboot
命令重启操作系统
7. 再次查看网卡名称
vim /etc/udev/rules.d/70-persistent-net.rules
vim /etc/sysconfig/network-scripts/ifcfg-eth0
,更改内容同2.5vi /ect/sysconfig/network
,增加内容如下:vim /etc/hosts
,增加内容如下:
5. 执行reboot
重启,并执行ping www.baidu.com
看是否配置网络成功
grep命令 命令是一种强大的文本搜索工具
格式: grep [option] pattern [file] 可使用 —help 查看更多参数。 使用实例:
ps -ef | grep sshd
查找指定 ssh 服务进程
ps -ef | grep sshd | grep -v grep
查找指定服务进程,排除 gerp 本身
grep -n 'hello' a.txt
从文件中查找关键词,并显示行号
find命令
find 命令在目录结构中搜索文件,并对搜索结果执行指定的操作。
使用实例:
find . -name "*.log" -ls
在当前目录查找以.log 结尾的文件, 并显示详细信息。
find /root/ -perm 777
查找/root/目录下权限为 777 的文件
find . -size +100M
查找当前目录大于 100M 的文件
Locate命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法
是先建立一个包括系统内所有档案名称及路径的数据库。之后当寻找时就只需查
询这个数据库( /var/lib/locatedb)。
Linux 系统自动创建这个数据库, 默认每天自动更新一次,所以使用 locate
命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,
先使用 updatedb 命令,手动更新数据库。
yum -y install mlocate
使用实例:
locate /etc/sh
搜索 etc 目录下所有以 sh 开头的文件
locate pwd
查找和 pwd 相关的所有文件
添加普通用户
useradd hadoop # 这个就表示我们创建了一个普通用户
passwd hadoop # 表示我们需要给hadoop这个普通用户分配一个密码
su - 用户名
规则:(1)root用户到其他用户不需要输入密码,反之要输入;(2) " - "可以理解为切换用户的同时切换环境,而不加它仅仅切换用户。
chmod 777 a.txt
#表示给某个文件赋予所有人的所有权限
chmod u-x a.txt
#取消a.txt文件,用户“执行”权限
chmod g+x a.txt
#添加a.txt文件,组“执行”权限
chown -R hadoop:hadoop a.txt
改变某个文件或者文件夹的所属的用户以及用户组
service iptables status
#查看防火墙状态
service iptables stop
#关闭防火墙
service --status-all
# 查看系统所有的后台服务进程
service sshd status
# 查看指定的后台服务进程的状态
service sshd stop
service sshd start
service sshd restart
配置后台服务进程的开机自启或关闭
chkconfig iptables on
#配置防火墙开机开启
chkconfig iptables off
#配置防火墙开机关闭
chkconfig httpd on
## 让 httpd 服务开机自启
chkconfig httpd off
## 让 httpd 服务开机不要自启
Shell 编程一般指 shell 脚本编程。
语法:
使用 vi 编辑器新建一个文件 hello.sh
#!/bin/bash
echo "Hello World !"
执行:
方式1:
方式2
chmod +x ./hello.sh #使脚本具有执行权限
局部变量
#!/bin/bash
str="hello"
echo ${str}world
环境变量
可以自己设置新的环境变量,通过export key=value
完成设置。
之后,先通过source /etc/profile
使生效,再通过env
命令查询所有环境变量:
ps:可以通过echo $PATH
、echo $HOME
打印某一环境变量的值
命令 | 作用 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 |
$$ | 脚本运行的当前进程 ID 号 |
$! | 后台运行的最后一个进程的 ID 号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$? | 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。 |
#!/bin/bash
echo "第一个参数为: $1";
echo "参数个数为: $#";
echo "传递的参数作为一个字符串显示: $*";
#!/bin/bash
a=1;
b=2;
echo `expr $a + $b`;
echo $((a+b));
echo $[a+b];
#!/bin/bash
read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据
## printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "Get out Please!"
fi
方式1:
#!/bin/bash
for N in 1 2 3
do
echo $N
done
方式2:
#!/bin/bash
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
三台机器执行以下命令(root用户来执行)
systemctl stop iptables #关闭防火墙
systemctl disable iptables.service #禁止开机启动
enforcing
强制模式permissive
宽容模式disable
关闭# 修改selinux的配置文件
vi /etc/selinux/config
第一步:三台机器生成公钥与私钥
在三台机器执行以下命令,生成公钥与私钥
ssh-keygen -t rsa
执行该命令之后,按下三个回车即可
三台机器将拷贝公钥到第一台机器
三台机器执行命令:
ssh-copy-id node01
第三步:复制第一台机器的认证到其他机器
将第一台机器的公钥拷贝到其他机器上
在第一台机器上面指向以下命令
scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh
## 安装
yum install -y ntp
## 启动定时任务
crontab -e
## 查看定时任务
crontab -l
随后在输入界面键入
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
查看自带的openjdk
卸载系统自带的openjdk
rpm -e java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64 tzdata-java-2019c-1.el7.noarch java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64 python-javapackages-3.4.1-11.el7.noarch javapackages-tools-3.4.1-11.el7.noarch --nodeps
上传jdk并解压然后配置环境变量
所有软件的安装路径
mkdir -p /export/services
所有软件压缩包的存放路径
mkdir -p /export/softwares
上传jdk到/export/softwares路径下去
rz -E
,若不能使用该命令,请先执行yum -y install lrzsz
进行下载。
解压
tar -zxvf jdk-8u251-linux-x64.tar.gz -C ../services/
配置环境变量
vim /etc/profile
export JAVA_HOME=/export/services/jdk1.8.0_251
export PATH=:$JAVA_HOME/bin:$PATH
修改完成之后记得 source /etc/profile生效
快捷方式:当装完一台虚拟机的jdk后,可通过scp -r jdk1.8.0_251/ node03:$PWD
分发已上传的jdk
/data/host1
, /data/host2
, 这个路径也可以理解为是 Znode 的 Name/data/host1
, 其值是一个字符串 "192.168.0.1"
Zookeeper 是分布式的
首先呢, Zookeeper 是分为服务端和客户端的, 客户端有 Java 的客户端, 有 Shell 命令行的客户端等, 客户端通过一个类似于文件系统的 API 来访问 Zookeeper 集群
但是事实上, 客户端最终是直接访问 Zookeeper 集群, 集群中有两大类角色, 一类是 Leader, 一类是 Follower, 其实就是主从, Leader 负责读和写, Follower 只能读, 遇到会产生修改的请求会转发给 Leader 处理, 这是因为 Zookeeper 本质上就是为了在分布式环境中对消息的一致性的支持, 而 Zookeeper 所基于的 ZAB 协议是 Paxos 协议的一个变种, ZAB 协议中是有一个全局的事务生成者, 就是 Leader, 修改设计到在分布式环境下对事务达成一致, 必须由 Leader 发起
举个例子?
比如说一个常见的分布式主从系统, 如果有 ZK 在的话, 主节点不需要和每个从节点保持连接, 只需要监听从节点创建的 Znode, 便可以知道谁在线
Zookeeper 能做什么?
服务器IP | 主机名 | myid的值 |
---|---|---|
192.168.188.100 | node01 | 1 |
192.168.188.110 | node02 | 2 |
192.168.188.120 | node03 | 3 |
第一步:下载zookeeeper的压缩包,下载网址如下
http://archive.apache.org/dist/zookeeper/
我们在这个网址下载我们使用的zk版本为3.4.9
下载完成之后,上传到我们的linux的/export/softwares路径下准备进行安装
第二步:解压
解压zookeeper的压缩包到/export/services路径下去,然后准备进行安装
cd /export/software
tar -zxvf zookeeper-3.4.9.tar.gz -C ../services/
第三步:修改配置文件
第一台机器修改配置文件
cd /export/services/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/services/zookeeper-3.4.9/zkdatas/
vim zoo.cfg
dataDir=/export/services/zookeeper-3.4.9/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第四步:添加myid配置
在第一台机器的
/export/services/zookeeper-3.4.9/zkdatas /这个路径下创建一个文件,文件名为myid ,文件内容为1
echo 1 > /export/services/zookeeper-3.4.9/zkdatas/myid
第五步:安装包分发并修改myid的值
安装包分发到其他机器
第一台机器上面执行以下两个命令
scp -r /export/services/zookeeper-3.4.9/ node02:/export/services/
scp -r /export/services/zookeeper-3.4.9/ node03:/export/services/
第二台机器上修改myid的值为2
echo 2 > /export/services/zookeeper-3.4.9/zkdatas/myid
第三台机器上修改myid的值为3
echo 3 > /export/services/zookeeper-3.4.9/zkdatas/myid
第六步:三台机器启动zookeeper服务
三台机器启动zookeeper服务
这个命令三台机器都要执行
/export/services/zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
/export/services/zookeeper-3.4.9/bin/zkServer.sh status
遇到错误:java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
解决:
原因:防火墙没关!,每一台机器依次执行:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
通过zkCli.sh
命令启动。
命令 | 说明 | 参数 |
---|---|---|
create [-s] [-e] path data acl |
创建Znode | -s 指定是顺序节点 -e 指定是临时节点 |
ls path [watch] |
列出Path下所有子Znode | |
get path [watch] |
获取Path对应的Znode的数据和属性 | |
ls2 path [watch] |
查看Path下所有子Znode以及子Znode的属性 | |
set path data [version] |
更新节点 | version 数据版本 |
delete path [version] |
删除节点, 如果要删除的节点有子Znode则无法删除 | version 数据版本 |
rmr path |
删除节点, 如果有子Znode则递归删除 | |
setquota -n|-b val path |
修改Znode配额 | -n 设置子节点最大个数 -b 设置节点数据最大长度 |
history |
列出历史记录 |
1:创建普通节点
create /app1 hello
2: 创建顺序节点
create -s /app3 world
3:创建临时节点
create -e /tempnode world
4:创建顺序的临时节点
create -s -e /tempnode2 aaa
5:获取节点数据
get /app1
6:修改节点数据
set /app1 xxx
7:删除节点
delete /app1
删除的节点不能有子节点
rmr /app1
递归删除
Znode 的特点
Znode
Znode
, 需要使用路径的形式, 例如 /test1/test11
Znode
中数据是有大小限制的, 最大只能为1M
Znode
是由三个部分构成
stat
: 状态, Znode的权限信息, 版本等data
: 数据, 每个Znode都是可以携带数据的, 无论是否有子节点children
: 子节点列表Znode 的类型
Znode
有两大特性, 可以构成四种不同类型的Znode
持久
客户端断开时, 不会删除持有的Znode临时
客户端断开时, 删除所有持有的Znode, 临时Znode不允许有子Znode有序
创建的Znode有先后顺序, 顺序就是在后面追加一个序列号, 序列号是由父节点管理的自增无序
创建的Znode没有先后顺序Znode
的属性
dataVersion
数据版本, 每次当Znode
中的数据发生变化的时候, dataVersion
都会自增一下cversion
节点版本, 每次当Znode
的节点发生变化的时候, cversion
都会自增aclVersion
ACL(Access Control List)
的版本号, 当Znode
的权限信息发生变化的时候aclVersion会自增zxid
事务IDctime
创建时间mtime
最近一次更新的时间ephemeralOwner
如果Znode
为临时节点, ephemeralOwner
表示与该节点关联的SessionId
通知机制
Watcher
, 当Znode发生变化的时候, WatchManager
会调用对应的Watcher
Watcher
会得到通知Watcher
的特点
Watcher
只会被触发一次, 如果需要继续监听, 则需要再次添加 Watcher
Watcher
得到的事件是被封装过的, 包括三个内容 keeperState, eventType, path
KeeperState | EventType | 触发条件 | 说明 |
---|---|---|---|
None | 连接成功 | ||
SyncConnected | NodeCreated | Znode被创建 | 此时处于连接状态 |
SyncConnected | NodeDeleted | Znode被删除 | 此时处于连接状态 |
SyncConnected | NodeDataChanged | Znode数据被改变 | 此时处于连接状态 |
SyncConnected | NodeChildChanged | Znode的子Znode数据被改变 | 此时处于连接状态 |
Disconnected | None | 客户端和服务端断开连接 | 此时客户端和服务器处于断开连接状态 |
Expired | None | 会话超时 | 会收到一个SessionExpiredException |
AuthFailed | None | 权限验证失败 | 会收到一个AuthFailedException |
会话
Session
中的, 客户端和服务器创建一个连接的时候同时也会创建一个Session
Session
会在不同的状态之间进行切换: CONNECTING
, CONNECTED
, RECONNECTING
, RECONNECTED
, CLOSED
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
狭义上来说,hadoop就是单独指代hadoop这个软件,
HDFS :分布式文件系统
MapReduce : 分布式计算系统
广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
1.x版本系列:hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性
3.x版本系列: 加入多namenoode新特性
免费开源版本apache:
http://hadoop.apache.org/
优点:拥有全世界的开源贡献者,代码更新迭代版本比较快,
缺点:版本的升级,版本的维护,版本的兼容性,版本的补丁都可能考虑不太周到,\
apache所有软件的下载地址(包括各种历史版本):
http://archive.apache.org/dist/
免费开源版本hortonWorks:
https://hortonworks.com/
hortonworks主要是雅虎主导Hadoop开发的副总裁,带领二十几个核心成员成立Hortonworks,核心产品软件HDP(ambari),HDF免费开源,并且提供一整套的web管理界面,供我们可以通过web界面管理我们的集群状态,web管理界面软件HDF网址(http://ambari.apache.org/)
软件收费版本ClouderaManager:
https://www.cloudera.com/
cloudera主要是美国一家大数据公司在apache开源hadoop的版本上,通过自己公司内部的各种补丁,实现版本之间的稳定运行,大数据生态圈的各个版本的软件都提供了对应的版本,解决了版本的升级困难,版本兼容性等各种问题
文件系统核心模块:
NameNode:集群当中的主节点,管理元数据(文件的大小,文件的位置,文件的权限),主要用于管理集群当中的各种数据
secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据
数据计算核心模块:
JobTracker:接收用户的计算请求任务,并分配任务给从节点
TaskTracker:负责执行主节点JobTracker分配的任务
第一种:NameNode与ResourceManager单节点架构模型
文件系统核心模块:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据
secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据
数据计算核心模块:
ResourceManager:接收用户的计算请求任务,并负责集群的资源分配
NodeManager:负责执行主节点APPmaster分配的任务
第二种:NameNode单节点与ResourceManager高可用架构模型
文件系统核心模块:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据
secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据
数据计算核心模块:
ResourceManager:接收用户的计算请求任务,并负责集群的资源分配,以及计算任务的划分,通过zookeeper实现ResourceManager的高可用
NodeManager:负责执行主节点ResourceManager分配的任务
第三种:NameNode高可用与ResourceManager单节点架构模型
文件系统核心模块:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,其中nameNode可以有两个,形成高可用状态
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据
JournalNode:文件系统元数据信息管理
数据计算核心模块:
ResourceManager:接收用户的计算请求任务,并负责集群的资源分配,以及计算任务的划分
NodeManager:负责执行主节点ResourceManager分配的任务
第四种:NameNode与ResourceManager高可用架构模型
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现HA高可用
JournalNode:元数据信息管理进程,一般都是奇数个
DataNode:从节点,用于数据的存储
数据计算核心模块:
ResourceManager:Yarn平台的主节点,主要用于接收各种任务,通过两个,构建成高可用
NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务
集群的规划:
服务器IP | 192.168.188.100 | 192.168.188.110 | 192.168.188.120 |
---|---|---|---|
主机名 | node01 | node02 | node03 |
NameNode | 是 | 否 | 否 |
SecondaryNameNode | 是 | 否 | 否 |
dataNode | 是 | 是 | 是 |
ResourceManager | 是 | 否 | 否 |
NodeManager | 是 | 是 | 是 |
cd /export/software
tar xzvf hadoop-3.1.1.tar.gz -C ../services
配置文件的位置在 hadoop/etc/hadoop
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://node01:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/export/services/hadoop-3.1.1/datas/tmpvalue>
property>
<property>
<name>io.file.buffer.sizename>
<value>8192value>
property>
<property>
<name>fs.trash.intervalname>
<value>10080value>
property>
configuration>
export JAVA_HOME=/export/services/jdk1.8.0_251
<configuration>
<property>
<name>dfs.namenode.name.dirname>
<value>file:///export/services/hadoop-3.1.1/datas/namenode/namenodedatasvalue>
property>
<property>
<name>dfs.blocksizename>
<value>134217728value>
property>
<property>
<name>dfs.namenode.handler.countname>
<value>10value>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:///export/services/hadoop-3.1.1/datas/datanode/datanodeDatasvalue>
property>
<property>
<name>dfs.namenode.http-addressname>
<value>node01:50070value>
property>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.permissions.enabledname>
<value>falsevalue>
property>
<property>
<name>dfs.namenode.checkpoint.edits.dirname>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/snn/editsvalue>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>node01.hadoop.com:50090value>
property>
<property>
<name>dfs.namenode.edits.dirname>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/nn/editsvalue>
property>
<property>
<name>dfs.namenode.checkpoint.dirname>
<value>file:///export/services/hadoop-3.1.1/datas/dfs/snn/namevalue>
property>
configuration>
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.map.memory.mbname>
<value>1024value>
property>
<property>
<name>mapreduce.map.java.optsname>
<value>-Xmx512Mvalue>
property>
<property>
<name>mapreduce.reduce.memory.mbname>
<value>1024value>
property>
<property>
<name>mapreduce.reduce.java.optsname>
<value>-Xmx512Mvalue>
property>
<property>
<name>mapreduce.task.io.sort.mbname>
<value>256value>
property>
<property>
<name>mapreduce.task.io.sort.factorname>
<value>100value>
property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopiesname>
<value>25value>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>node01.hadoop.com:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>node01.hadoop.com:19888value>
property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dirname>
<value>/export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatasvalue>
property>
<property>
<name>mapreduce.jobhistory.done-dirname>
<value>/export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatasvalue>
property>
<property>
<name>yarn.app.mapreduce.am.envname>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1value>
property>
<property>
<name>mapreduce.map.envname>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1/value>
property>
<property>
<name>mapreduce.reduce.envname>
<value>HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1value>
property>
configuration>
<configuration>
<property>
<name>dfs.namenode.handler.countname>
<value>100value>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.addressname>
<value>node01:8032value>
property>
<property>
<name>yarn.resourcemanager.scheduler.addressname>
<value>node01:8030value>
property>
<property>
<name>yarn.resourcemanager.resource-tracker.addressname>
<value>node01:8031value>
property>
<property>
<name>yarn.resourcemanager.admin.addressname>
<value>node01:8033value>
property>
<property>
<name>yarn.resourcemanager.webapp.addressname>
<value>node01:8088value>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>node01value>
property>
<property>
<name>yarn.scheduler.minimum-allocation-mbname>
<value>1024value>
property>
<property>
<name>yarn.scheduler.maximum-allocation-mbname>
<value>2048value>
property>
<property>
<name>yarn.nodemanager.vmem-pmem-rationame>
<value>2.1value>
property>
<property>
<name>yarn.nodemanager.vmem-check-enabledname>
<value>falsevalue>
property>
<property>
<name>yarn.nodemanager.resource.memory-mbname>
<value>1024value>
property>
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilitiesname>
<value>truevalue>
property>
<property>
<name>yarn.nodemanager.local-dirsname>
<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatasvalue>
property>
<property>
<name>yarn.nodemanager.log-dirsname>
<value>file:///export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogsvalue>
property>
<property>
<name>yarn.nodemanager.log.retain-secondsname>
<value>10800value>
property>
<property>
<name>yarn.nodemanager.remote-app-log-dirname>
<value>/export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogsvalue>
property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffixname>
<value>logsvalue>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>18144000value>
property>
<property>
<name>yarn.log-aggregation.retain-check-interval-secondsname>
<value>86400value>
property>
<property>
<name>yarn.app.mapreduce.am.resource.mbname>
<value>1024value>
property>
configuration>
node01
node02
node03
mkdir -p /export/services/hadoop-3.1.1/datas/tmp
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/snn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/namenode/namenodedatas
mkdir -p /export/services/hadoop-3.1.1/datas/datanode/datanodeDatas
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/nn/edits
mkdir -p /export/services/hadoop-3.1.1/datas/dfs/snn/name
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/intermediateDoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/jobhsitory/DoneDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerDatas
mkdir -p /export/services/hadoop-3.1.1/datas/nodemanager/nodemanagerLogs
mkdir -p /export/services/hadoop-3.1.1/datas/remoteAppLog/remoteAppLogs
cd /export/services
scp -r hadoop-3.1.1/ node02:$PWD
scp -r hadoop-3.1.1/ node03:$PWD
vi /etc/profile
export HADOOP_HOME=/export/services/hadoop-3.1.1/
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
bin/hdfs namenode -format
注意:启动集群前,一定要启动zookeeper
zookeeper启动命令:/export/services/zookeeper-3.4.9/bin/zkServer.sh start
# 会登录进所有的worker启动相关进行, 也可以手动进行, 但是没必要
/export/services/hadoop-3.1.1/sbin/start-dfs.sh
/export/services/hadoop-3.1.1/sbin/start-yarn.sh
mapred --daemon start historyserver
此时便可以通过如下三个URL访问Hadoop了
http://192.168.188.100:50070/dfshealth.html#tab-overview
http://192.168.188.100:8088/cluster
报错:ERROR: Attempting to operate on hdfs namenode as root \n ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
解决:设置hadoop-env.sh
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
修改完后,向以前一样分发到其他两台机器
创建测试文件,并加入到根目录下
查看控制台:
成功!撒花~~~
很重要,不然启动虚拟机都很难,会有各种怪事情出现!谨慎
/export/services/hadoop-3.1.1/sbin/stop-yarn.sh
/export/services/hadoop-3.1.1/sbin/stop-dfs.sh
/export/services/zookeeper-3.4.9/bin/zkServer.sh stop
shutdown -h now
关机睡觉!下一篇:大数据学习系列:Hadoop3.0苦命学习(二)