Hadoop入门
Hadoop的优势:
(1)高可靠性 (2)高扩展性 (3)高效性 (4)高容错性
Hadoop的组成部分
HDFS (数据存储)
NameNode
管理真实数据块的元数据的,管理多个DataNode(大哥)
DataNode
对真实数据块进行存储管理(小弟)
SecondaryNameNode
是NameNode的助手,帮助NameNode完成一些事情
MapReduce (数据的计算)
Map阶段
就是把一个job分成多个task来并行计算执行
Reduce阶段
把分开的task任务计算的结果汇总
Yarn (服务器的资源管理)
ResourceManager
统筹管理每一个NodeManager,负责接收每一个作业请求
NodeManager
负责每一台服务器的资源调度,而且实时保证和ResourceManager状态的汇报
ApplicationMaster
只有Job提交的时候才会产生一个对象
Container
对计算机的资源的一个抽象的封装对象
关系理解图
大数据技术生态
Hadoop环境的搭建
1.配置克隆主机的环境
(1) 准备虚拟机 (最小化安装Linux-模板机)
(2) 对模板机进行数据初始化配置 (登录root用户)
-- ip地址要进行修改
[root@hadoop100 桌面]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop100 桌面]#service network restart
-- 用Xshell工具远程连接Linux
-- 通过yum安装所需要的插件
[root@hadoop100 桌面]#sudo yum install -y epel-release
[root@hadoop100 桌面]#sudo yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop
-- 关闭防火墙
[root@hadoop100 桌面]#systemctl stop firewalld
[root@hadoop100 桌面]#systemctl disable firewalld.service
-- 修改主机名
[root@hadoop100 桌面]#vim /etc/hostname
-- 创建atguigu用户,并且提升atguigu用户为root权限
[root@hadoop100 桌面]#useradd atguigu
[root@hadoop100 桌面]#passwd atguigu
//去这里修改被指文件 //大概在91行后
[root@hadoop100 桌面]#vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
atguigu ALL=(ALL) NOPASSWD:ALL
-- 修改Linux的hosts文件
[root@hadoop100 桌面]#vim /etc/hosts
-- 在/opt目录下创建两个文件夹 software 和 moudle
[root@hadoop100 桌面]#mkdir /opt/software
[root@hadoop100 桌面]#mkdir /opt/module
//更改所有组和所有者
[root@hadoop100 opt]#chown -R atguigu:atguigu software/ module/
(3) 克隆模板机准备第一台机器
-- 修改ip地址
[root@hadoop100 桌面]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop100 桌面]#service network restart
-- 修改主机名
[root@hadoop100 桌面]#vim /etc/hostname
--重启
[root@hadoop100 桌面]#sudo reboot
2.安装JDK环境和安装Hadoop
在克隆机上安装jdk
-- 将安装包上传至/opt/software 下
-- 将jdk解压到/opt/module
[root@hadoop100 桌面]#tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
-- 配置jdk的环境变量
-- 在/etc/profile.d 目录下创建 my_env.sh
-- 在my_env.sh中编写一下内容
#创建JAVA_HOME
JAVA_HOME=/opt/module/jdk1.8.0_212
#将JAVA_HOME/bin追加到PATH系统变量中
PATH=$PATH:$JAVA_HOME/bin
#提升当前变量为系统变量
export JAVA_HOME PATH
[root@hadoop100 桌面]#source /etc/profile
在克隆机上安装hadoop软件
-- 将安装包上传至/opt/software 下
-- 将hadoop解压到/opt/module
[root@hadoop100 桌面]#tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
-- 配置hadoop的环境变量
-- 在/etc/profile.d 目录下创建 my_env.sh
[root@hadoop100 桌面]#sudo vim /etc/profile.d/my_env.sh
-- 在my_env.sh中编写一下内容
#创建JAVA_HOME
JAVA_HOME=/opt/module/jdk1.8.0_212
HADOOP_HOME=/opt/module/hadoop-3.1.3
#将JAVA_HOME/bin、HADOOP_HOME/bin、HADOOP_HOME/sbin 追加到PATH系统变量中
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#提升当前变量为系统变量
export JAVA_HOME PATH HADOOP_HOME
[root@hadoop100 桌面]#source /etc/profile
3.Hadoop下的重要目录
(1) bin目录: 存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2) etc目录: Hadoop的配置文件目录,存放Hadoop的配置文件
(3) lib 目录: 存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4) sbin目录:存放启动或停止Hadoop相关服务的脚本
(5) share目录:存放Hadoop的依赖jar包、文档、和官方案例
Hadoop运行模式
本地运行模式
说明:Hadoop默认配置就是本地模式,因此不需要进行任何设置即可运行本地模式
举例:
--在hadoop-3.1.3文件下面创建一个input文件夹
[root@hadoop100 桌面]#cd /opt/module/hadoop-3.1.3
[root@hadoop100 hadoop-3.1.3]#mkdir input
--将斗罗大陆.txt和笑傲江湖.txt放在 input 文件夹内
--执行share目录下的MapReduce程序
//hadoop 因为设置了全局变量所以任何位置都可以调用
[root@hadoop100 hadoop-3.1.3]#hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output5 "令狐冲"
//hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output "令狐冲"
//这里的 grep 是hadoop-mapreduce-examples-3.1.3.jar包下的方法
//这里的input output 分别是输出文档(数据来源)和输出结果的地方
//这里的 "令狐冲" 是索引条件
--查看结果
[root@hadoop100 hadoop-3.1.3]#cd output
[root@hadoop100 hadoop-3.1.3]#cat part-r-00000
完全分布式运行模式(开发重点)
编写集群分发脚本xsync
-
准备集群需要的机器
-
将hadoop102的数据同步给hadoop103和hadoop104
scp安全拷贝 (同名直接覆盖)
定义:scp可以实现服务器与服务器之间的数据拷贝
基本语法
scp -r 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
//-r 代表递归(同步文件夹下所有的内容)
rsync远程同步工具 (只同步差异数据)
定义:rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点
基本语法
rsync -av 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去
xsync集群分发脚本
使用环境:
(1) 循环复制文件到所有节点的相同目录下
(2) 期望脚本:基于rsync技术将文件从一个节点同步到其他所有节点
脚本实现
在/home/atguigu目录下创建bin目录,并在bin目录下创建xsync文件
(说明:在/home/atguigu/bin这个目录下存放的脚本,atguigu用户可以在系统任何地方直接执行。因为/home/atguigu/bin在系统的PATH环境变量中)
[atguigu@hadoop101 ~]#cd /home/atguigu
[atguigu@hadoop101 ~]#mkdir bin
[atguigu@hadoop101 ~]#vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
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
done
修改脚本 xsync 具有执行权限
[atguigu@hadoop101 ~]#chmod 777 xsync
集群配置
集群部署规划
注意:NameNode和SecondaryNameNode不要安装在同一台服务器
注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置
在同一台机器上。
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
默认配置文件:
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] | hadoop-common-3.1.3.jar/ core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-3.1.3.jar/ hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-3.1.3.jar/ yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-3.1.3.jar/ mapred-default.xml |
自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在** H A D O O P H O M E / e t c / h a d o o p ∗ ∗ 这 个 路 径 上 , 用 户 可 以 根 据 项 目 需 求 重 新 进 行 修 改 配 置 ( HADOOP_HOME/etc/hadoop**这个路径上,用户可以根据项目需求重新进行修改配置( HADOOPHOME/etc/hadoop∗∗这个路径上,用户可以根据项目需求重新进行修改配置(HADOOP_HOME指的是hadoop根目录)
配置集群
(1) 配置:hadoop-env.sh (Hadoop3.0版本后就可以省略这步 )
Linux系统中获取JDK的安装路径:
[atguigu@ hadoop101 ~]# echo $JAVA_HOME
/opt/module/jdk1.8.0_212
在hadoop-env.sh文件中修改JAVA_HOME 路径:(它注释了,看清楚打开添加即可 #export JAVA_HOME=)
export JAVA_HOME=/opt/module/jdk1.8.0_212
(2) 核心配置文件
这些文件在$HADOOP_HOME/etc/hadoop 下
[atguigu@ hadoop101 ~]#cd $HADOOP_HOME/etc/hadoop
[atguigu@ hadoop101 ~]#vim core-site.xml
(a) 配置core-site.xml
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
#====hadoop102这边根据自己hostname==进行更改
#====hadoop102 这边是指定了namenode开启的所在机的地址hostname名
#===8020是内部通讯的端口号======
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录
官方配置文件中的配置项是hadoop.tmp.dir ,用来指定hadoop数据的存储目录,此次配置用的hadoop.data.dir是自己定义的变量, 因为在hdfs-site.xml中会使用此配置的值来具体指定namenode 和 datanode存储数据的目录
-->
<property>
#hadoop.data.dir 自定义变量名(该变量指向地址是用来存储Hadoop数据的)
#hdfs-site.xml会调用该变量存储namenode和datenode
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 下面是兼容性配置,先跳过 -->
<!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<!-- 配置该atguigu(superuser)允许代理的用户所属组 -->
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
<!-- 配置该atguigu(superuser)允许代理的用户-->
<property>
<name>hadoop.proxyuser.atguigu.users</name>
<value>*</value>
</property>
(3) HDFS配置文件
(a) 配置hdfs-site.xml
vim hdfs-site.xml
文件内容如下:
<!-- 指定副本数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定NameNode数据的存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<!-- 指定Datanode数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<!-- 指定SecondaryNameNode数据的存储目录 -->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<!-- 兼容配置,先跳过 -->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30s</value>
</property>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
(4) YARN配置文件
(a) 配置 yarn-site.xml
vim yarn-site.xml
文件内容如下
<!--NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<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>
<!-- 取消虚拟内存的限制 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
(5) MapReduce配置文件
配置mapred-site.xml
vim mapred-site.xml
文件内容如下
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(4) 在集群上分发配置好的hadoop
xsync /opt/module/hadoop-3.1.3
(5)在其他节点查看文件分发情况
集群单点启动//不重要
1) 如果集群是第一次启动,需要格式化NameNode
hdfs namenode -format
2) 在hadoop102上启动NameNode
hdfs --daemon start namenode
3) 完成后执行jps命令,看到如下结果(进程号可能不同):
3461 NameNode
4) 在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)启动datanode
hdfs --daemon start datanode
5) 在hadoop104上启动secondarynamenode
hdfs --daemon start secondarynamenode
6) 在hadoop103上启动ResourceManager
yarn --daemon start resourcemanager
7) 在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)启动nodemanager
yarn --daemon start nodemanager
SSH无密登录配置
(1) ssh
基本语法
ssh 另一台电脑的ip地址或者主机名
(2) 配置免密
(a) 分别在hadoop102 hadoop103 hadoop104生成公钥和私钥
ssh-keygen -t rsa
然后敲(三个回车),就会在 ~/.ssh目录下生成两个文件
id_rsa(私钥)、id_rsa.pub(公钥)
(b) 分别在hadoop102 hadoop103 hadoop104执行,将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
© 注意: 如果还想实现其他用户的免密登录,还需要在每台节点上采用其他账号,完成免密的配置。注意给自己也整份!!!!!
群起集群
不能多次格式化
注意:格式化NameNode,会产生新的集群id,导致DataNode中记录的的集群id和刚生成的NameNode的集群id不 一致,DataNode找不到NameNode。所以,格式NameNode时,一定要先删除每个节点的data目录和logs日志,然后再格式化NameNode
如果集群是第一次启动,需要格式化NameNode
hdfs namenode -format
(1) 配置workers文件
(a) 编辑workers文件加入如下内容
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
(2) 同步workers文件到其他节点
xsync workers
启动集群
整体启动/停止HDFS****
start-dfs.sh/stop-dfs.sh
整体启动/停止YARN****
start-yarn.sh/stop-yarn.sh
查看服务情况
jps
查看hdfs服务情况(web端查看):hostname:9870或者运行nn的主机的ip:9870
查看yarn服务情况(web端查看):hostname:8088或者运行的主机的ip:8088
19888
配置历史服务器
(1) 配置 mapred-site.xml
vi mapred-site.xml
在该文件下配置
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
(2) 分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
(3) 在hadoop102启动历史服务器
mapred --daemon start historyserver
(4) 查看历史服务器是否启动
jps
输出:JobHistoryServer
(5) JobHistoryServer
http://hadoop102:19888/jobhistory
配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager ,ResourceManager和HistoryManager
(1) 配置 yarn-site.xml
vim yarn-site.xml
在该文件里面增加如下配置
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(2) 分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
解决web页面中操作没有权限问题
hadoop默认情况下开启了权限检查,且默认使用dir.who作为http访问的静态用户,因此可通过关闭权限检查或者配置http访问的静态用户为atguigu,二选一即可.
在core-site.xml中修改http访问的静态用户为atguigu
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
在hdfs-site.xml中关闭权限检查
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
server.url
http://hadoop102:19888/jobhistory/logs
yarn.log-aggregation.retain-seconds
604800
**(2) 分发配置**
```shell
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
解决web页面中操作没有权限问题
hadoop默认情况下开启了权限检查,且默认使用dir.who作为http访问的静态用户,因此可通过关闭权限检查或者配置http访问的静态用户为atguigu,二选一即可.
在core-site.xml中修改http访问的静态用户为atguigu
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
在hdfs-site.xml中关闭权限检查
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>