Hadoop是一个由Apache基金会所开发的分布式系统基础架构
-分布式:多台服务器共同完成某一个任务
Hadoop主要解决海量数据的储存和海量数据的分析计算问题
Hadoop Distributed File System - HDFS 分布式文件系统
NameNode Server:记录每一个文件快存储的位置(元数据,相当于索引)
DateNode Server:具体存储数据的位置(数据及数据校验和)
2NM Server :辅助NameNode工作 (对元数据备份)
Yet Another Resource Negotiator 资源协调者 是Hadoop中的资源管理器(cpu与内存资源分配)
Resource Manager(RM): 管理整个集群资源
NodeManager(NM): 管理单个节点资源
ApplicationMaster(AM): 管理单个任务资源
Container: 容器 里面封装了任务运行所需要的资源(容器技术)

APPMSTR向RESOUREMANAGER申请资源 RESOURCEMANAGER给APPMSTR分配资源 当一个节点上的资源不够了 容器还可以切换到其他节点是
解决Hadoop中海量数据计算的功能
Mapreduce将计算过程分为两个阶段:Map和Reduce

map:将任务分发给各个主机
reduce:汇总

ResourceManager收到client的任务,创建一个任务容器这个容器负责分发任务给每个节点,每个节点创建任务容器执行任务.最后汇总.
电商平台个性化推荐流程


虚拟机配置:2C4T 4G 50G
VM虚拟机设置

实体机设置:IPV4 192.168.10.1 ,网关192.168.10.2
DNS1 192.168.10.2 DNS2 8.8.8.8
虚拟机配置:
IP
vi /etc/sysconfig/network-scripts/cfg-ens33
将DHCP改成static 在下方插入
IPADDR=192.168.10.100
GATEWAY=192.168.10.2
DNS1=192.168.10.2
主机名
vi /etc/hostname
配置主机名映射
vi /etc/hosts
在下方添加
192.168.10.100 hadoop100
192.168.10.101 hadoop101
...
192.168.10.108 hadoop108
最后reboot重启生效
重启后查看ipaddr和ping baidu.com测试是否生效
编辑Windows(调试机)host文件
c:/windows/system32/drivers/etc/hosts文件
添加和主机上一样的配置
安装xshell & xftp
解决镜像源失效问题
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
sudo sed -i \ -e 's/mirrorlist/#mirrorlist/g' \ -e 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \ /etc/yum.repos.d/CentOS-Base.repo
sudo yum clean all sudo yum makecache
安装epel
yum install -y epel-release
安装net-tools
yum install -y net-tools
yum install -y vim
systemctl stop firewalld
systemctl disable firewalld.service
useradd hadoop
passwd hadoop
给予这个用户root权限

在opt目录下mkdir module 和 software用于存放所有软件
sudo chown hadoop:hadoop moudle/ software/
rpm -qa | grep -i java 查看是否又安装
有的话卸载
重启虚拟机
关闭虚拟机
右键虚拟机 管理 克隆
并依次给每个虚拟机配置对应的IP和主机名
在hadoop102上安装JDK 之后拷贝到其他服务器
1.https://xiandan.io/posts/jdk-download.html 下载JDK并上传到曾经创建的software文件夹中
2.之后执行 tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/moudle/
3.待到解压完后之后cd到moudle/jdk目录下
4.cd到/etc/profile.d/
5.创建my_env.sh并编写
写入这些内容
6.刷新source /etc/profile
1.cd /opt/software
2.上传hadoop包到目录下
3.解压hadoop包 tar -zxvf hadoop-3.1.3\ (1).tar.gz -C /opt/moudle/
4.sudo vim /etc/profile.d/my_env.sh 编辑刚写的脚本文件
5.在其中加入这些内容
6.刷新source /etc/profile

hdfs: 存储相关
maored: 计算相关
yarn: 调度相关
etc: 大量配置信息
native: 本地动态链接库
sbin: 启动集群相关命令
share: 学习资料 文档
local mode 数据储存在本地 本地模式
pseudo-distributed mode 数据存储在HDFS 伪分布式
fullydistributed mode 数据存储在HDFS/多态服务器工作 完全分布式
本地模式:偶尔测试用 不再生产环境使用
伪分布式:只有一台机器却要做集群/预备集群 资源有限的生产环境
在hadoop目录下创建wcinput文件夹
在wcinput文件夹下放待处理数据
word.txt
test1
test2
test3
test4
处理其中每项出现的次数
返回hadoop目录 cd ..
执行官方预制包 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput
指令格式:执行的jar包 参数 输入路径 输出路径
输出路径不能存在 执行命令时会创建
处理完毕 查看结果
cd ..
cd ./wcoutput
ls
查看数据cat part-r-00000 统计好的数据就出现在这里了 数据-出现次数
test1 1 test2 1 test3 1 test4 1
前置条件:需准备三台配置好IP 防火墙 主机名的主机 并都安装了JDK环境 配置好hadoop
目前只在hadoop102上配置好了JDK和HADOOP环境 需要把102上的hadoop环境拷贝到其他机器上
实现服务器与服务器之间的数据拷贝
scp -r 要拷贝文件路径 $user@$host:$pdir/$fname
命令 递归 路径 目的地主机@目的地的路径/名称
--
ssh到102
cd到/opt/moudle
scp -r jdk1.8.0_212/ hadoop@192.168.10.103:/opt/moudle
首次连接输入yes
输入输入密码hadoop
等待拷贝完成.. 这样jdk就克隆到103上了
ssh到103
cd /opt/module/
scp -r hadoop@192.168.10.102:/opt/moudle/hadoop-3.1.3 ./
yes
hadoop
克隆完成
scp -r hadoop@192.168.10.102:/opt/moudle/* hadoop@192.168.10.104:/opt/moudle
依次输入两台主机的密码
等待拷贝成功
将一台机器上的修改同步到其他机器(第一次同步等同于拷贝)
rsync -av 要拷贝的文件目录名称 目的地用户@主机:目的路径/名称
将102上的hadoop同步到103上
rsync -av hadoop-3.1.3/ atguigu@hadoop103:/opt/moudle/hadoop-3.1.3/
输入密码
等待同步完成
在rsync基础上进行封装让多台机器文件拷贝更方便
Demo:
在HOME路径下有一个a.txt文件,在我们执行一个命令后,可以一键把这个文件分发到多个主机的的同一个目录下
效果:xsync a.txt一旦执行其他几台主机的home目录下同步出现这个文件
实现这个功能:
找任意位置存放脚本文件
touch /home/hadoop/
cd /home/hadoop/
mkdir bin
cd ./bin
touch
写入文件 xsync
- #!/bin/bash
- # 判断参数个数
- if [ $# -lt 1 ]
- then
- echo Not Enough Arguement!
- exit;
- fi
- # 2.遍历集群所有节点
- for host in hadoop102 hadoop103 hadoop104 #要编辑一下这里, 这里是你的主机名
- do
- echo ==================== $host ====================
- # 3.遍历所有目录,挨个发送
- for file in $@
- do
- # 4.判断文件是否存在
- if [ -e $file ]
- then
- # 5.获取父目录
- pdir=$(cd -P $(dirname $file); pwd)
- # 6.获取当前文件的名称
- fname=$(basename $file)
- ssh $host "mkdir -p $pdir"
- rsync -av $pdir/$fname $host:$pdir
- else
- echo $file does not exists!
- fi
- done
编辑完之后, 对这个脚本赋予执行权限
chmod +x /home/hadoop/bin/xsync
测试脚本 将脚本分发到其他机器 xsync /home/hadoop/bin
vi ~/.bashrc
# User specific environment and startup programs
export PATH=$PATH:/home/hadoop/bin
source ~/.bashrc
Hadoop 集群启动时,NameNode 需要通过 SSH 远程启动其他节点的进程,如果不配置免密,启动时需要输入几十次密码。
hadoop102 (NameNode) 需要免密登录 -> 102, 103, 104
hadoop103 (ResourceManager) 需要免密登录 -> 102, 103, 104
ssh-keygen -t rsa
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
同样操作要在每台机器上做一遍
| 主机 | HDFS | YARN |
|---|---|---|
| hadoop102 | NameNode, DataNode | NodeManager |
| hadoop103 | DataNode | ResourceManager, NodeManager |
| hadoop104 | SecondaryNameNode, DataNode | NodeManager |
配置文件位于 /opt/module/hadoop-3.1.3/etc/hadoop/ 目录下
现在一台机器上执行下面操作:
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
在 hadoop102 上执行,将配置好的 etc 文件夹分发给 103 和 104。
xsync /opt/module/hadoop-3.1.3/etc/hadoop/
在 hadoop102 上执行
hdfs namenode -format
启动 HDFS 在 hadoop102 (NameNode所在节点) 上执行:
start-dfs.sh
启动 YARN 在 hadoop103 (ResourceManager所在节点) 上执行: 注意: 这里必须切换到 hadoop103 去启动,因为我们在配置文件里指定了 RM 是 103
ssh hadoop103
start-yarn.sh
1.分别在三台机器上输入 jps
102: NameNode, DataNode, NodeManager
103: ResourceManager, NodeManager, DataNode
104: SecondaryNameNode, NodeManager, DataNode
2.Web 端查看
HDFS 界面: http://hadoop102:9870
YARN 界面: http://hadoop103:8088
hadoop fs -mkdir /input
hadoop fs -put /opt/module/hadoop-3.1.3/wcinput/word.txt /input
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
hadoop fs -cat /output/*