Hadoop 介绍
Hadoop是Apache旗下的一个用java语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。
狭义上说,Hadoop指Apache这款开源框架,它的核心组件有:
HDFS(分布式文件系统):解决海量数据存储
YARN(作业调度和集群资源管理的框架):解决资源任务调度
MAPREDUCE(分布式运算编程框架):解决海量数据计算
当下的Hadoop已经成长为一个庞大的体系,随着生态系统的成长,新出现的项目越来越多,其中不乏一些非Apache主管的项目,这些项目对HADOOP是很好的补充或者更高层的抽象
Hadoop是Apache Lucene创始人 Doug Cutting 创建的。最早起源于Nutch,它是Lucene的子项目。
分布式技术
- 什么是分布式
把一个服务部署在多台计算机上运行,统一对外提供接口服务,计算机之间能够进行数据的交互通讯
- 常用分布式方案
分布式应用(rpc通讯方式) 分布式存储 分布式计算
- 分布式、集群
- 同一个 服务下的不同功能部署在不同电脑上统一对外提供一个服务就是分布式
- 不同电脑上,分别部署服务,每台电脑可以独立提供服务,多台电脑之间称之为集群
电脑A HDFS存储A MR计算A
电脑B HDFS存储B MR计算B
Hadoop存储的数据分别在A和B上存储
Hadoop特性优点
- 扩容能力: Hadoop是在可用的计算机集群间分配数据并完成计算任务 这些集群可用方便的扩展到数以千计的节点中
- 成本低: Hadoop可以通过连家的机器组成服务器集群来分发以及出路数据
- 高效率:通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
- 可靠性(Rellable):能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得人们信赖。
Hadoop在国内的应用领域
国内其他非互联网领域也有不少hadoop的应用,比如:
金融行业: 个人征信分析
证券行业: 投资模型分析
交通行业: 车辆、路况监控分析
电信行业: 用户上网行为分析
总之:hadoop并不会跟某种具体的行业或者某个具体的业务挂钩,它只是一种用来做海量数据分析处理的工具。
Hadoop的版本 https://hadoop.apache.org/
Hadoop发行版本分为开源社区版和商业版。
商业版Hadoop是指由第三方商业公司在社区版Hadoop基础上进行了一些修改、整合以及各个服务组件兼容性测试而发行的版本,比较著名的有cloudera的CDH、mapR、hortonWorks等。
https://www.cloudera.com/products/open-source/apache-hadoop/key-cdh-components.html
Hadoop集群介绍
Hadoop集群 包含:HDFS集群和YARN集群 逻辑上分离 物理上在一起
HDFS集群负责海量数据的存储 集群中的角色主要有:NameNode、DateNode、SecondaryNameNode
YARN集群负责海量数据运算时的资源调度 集群中的角色主要有:ResourceManager、NodeMenager
mapreduce 是一个分布式运算编程框架 打包运行在HDFS集群上 并受YARN集群的资源调度管理
Hadoop3中部署方式
单机模式 Standalone mode 独立模式 、 Pseudo-Distributed mode伪分布式 1台机器即可运行
集群模式 Cluster mode(集群模式) 多机器部署 我这里条件有限 使用3台虚拟机部署
我这里以3台CentOS7 部署 Hadoop 每台机器的角色分布
Hadoop 安装部署
这里沿用我上篇Zookeeper中的目录结构 不知道的去看看Zookeeper文章
- 基础环境配置
设置主机名 host映射 域名
# 主机名 hosts映射
#编辑host文件
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.227.151 node1.itcast.cn node1
192.168.227.152 node2.itcast.cn node2
192.168.227.153 node3.itcast.cn node3
# 集群时间同步
ntpdate ntp5.aliyun.com
# 防火墙关闭
firewall-cmd --state #查看防火墙状态
systemctl stop firewalld.service #停止firewalld服务
systemctl disable firewalld.service #开机禁用firewalld服务
# ssh免密登录
#node1生成公钥私钥 (一路回车)
ssh-keygen
#node1配置免密登录到node1 node2 node3
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
- 上传Hadoop安装包到node1 /export/software
#我这里和Zookeeper一样 采用的离线安装 没有使用yum 都是先在官网下好的包 自己编译的
#hadoop-3.3.0-Centos7-64-with-snappy.tar.gz 这是名字
#使用tar命令将文件解压到 server中
tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz -C /export/server
#修改 文件名 我的hadoop用的是 3.3.0版本的
mv hadoop-3.3.0-Centos7-64-with-snappy hadoop-3.3.0
- 修改配置文件
hadoop-env.sh
#进入打开配置文件
cd hadoop-3.3.0/etc/hadoop
vim hadoop-env.sh
#添加一下变量
export JAVA_HOME=/export/server/jdk1.8.0_65
#文件最后添加
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
core-site.xml
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 设置Hadoop本地保存数据路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop-3.3.0</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
hdfs-site.xml
<!-- 设置SNN进程运行机器位置信息 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>
mapred-site.xml
<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
yarn-site.xml
<!-- 设置YARN集群主角色运行机器位置 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 是否将对容器实施物理内存限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否将对容器实施虚拟内存限制。 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 开启日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置yarn历史服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 保存的时间7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
workers
node1
node2
node3
- 分发同步hadoop安装包
cd /export/server
scp -r hadoop-3.3.0 root@node2:$PWD
scp -r hadoop-3.3.0 root@node3:$PWD
- 将hadoop添加到环境变量(3台机器)
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#刷新 环境变量
source /etc/profile
截止到目前 我的hadoop集群 已经构架完成
hadoop 初体验
1、hadoop集群初启动
要启动Hadoop集群,需要启动HDFS和YARN两个集群。
注意:**首次启动HDFS时,必须对其进行格式化操作。**本质上是一些清理和准备工作,因为此时的HDFS在物理上还是不存在的。
#(==首次启动==)格式化namenode
hdfs namenode -format
2、单节点逐个启动
#单节点逐个启动 需要进行hadoop的bin目录下
/export/server/hadoop-3.3.0/bin/ 这是路径 后面的是命令
#在主节点上使用以下命令启动HDFS NameNode:
/export/server/hadoop-3.3.0/bin/hdfs --daemon start namenode
#在每个从节点上使用以下命令启动HDFS DataNode:
/export/server/hadoop-3.3.0/bin/hdfs --daemon start datanode
#在node2上使用以下命令启动HDFS SecondaryNameNode:
/export/server/hadoop-3.3.0/bin/hdfs --daemon start secondarynamenode
#在主节点上使用以下命令启动YARN ResourceManager:
/export/server/hadoop-3.3.0/bin/yarn --daemon start resourcemanager
#在每个从节点上使用以下命令启动YARN nodemanager:
/export/server/hadoop-3.3.0/bin/yarn --daemon start nodemanager
#如果想要停止某个节点上某个角色,只需要把命令中的start改为stop即可。
哈哈哈 单个节点启动 很麻烦吧 给大家一个简单的方法
3、脚本一键启动
#这是脚本启动HDFS 服务
[root@node1 ~]# start-dfs.sh
Starting namenodes on [node1]
Last login: Thu Nov 5 10:44:10 CST 2020 on pts/0
Starting datanodes
Last login: Thu Nov 5 10:45:02 CST 2020 on pts/0
Starting secondary namenodes [node2]
Last login: Thu Nov 5 10:45:04 CST 2020 on pts/0
#这是脚本启动YARN服务
[root@node1 ~]# start-yarn.sh
Starting resourcemanager
Last login: Thu Nov 5 10:45:08 CST 2020 on pts/0
Starting nodemanagers
Last login: Thu Nov 5 10:45:44 CST 2020 on pts/0
#这是一键启动hadoop服务 HDFS 和YARN 全部启动
[root@node1 ~]# start-all.sh
Web UI页面 大家windows电脑没有配置本机系统的host 文件 就用后面的IP地址进入网页 前面的是域名
-
HDFS集群:http://node1:9870/ 还可以 http://node1的IP地址:9870/
-
YARN集群:http://node1:8088/ 还可以 http://node1的IP地址:8088/
查看日志
/export/server/hadoop-3.3.0/logs
错误1:运行hadoop3官方自带mr示例出错。
····错误信息
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Please check whether your etc/hadoop/mapred-site.xml contains the below configuration:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
解决 mapred-site.xml,增加以下配置
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
HDFS体验
从Linux本地上传一个文本文件到hdfs的/test/input目录下
#在hdfs上 创建wordcount/input文件
hdfs -mkdir -p /wordcount/input
#上传root目录下的somewords.txt文件 到/test/input
hdfs -put /root/somewords.txt /test/input
MapReduce jobHistory
JobHistory用来记录已经finished的mapreduce运行日志,日志信息存放于HDFS目录中,默认情况下没有开启此功能,需要在mapred-site.xml中配置并手动启动。
cd /export/servers/hadoop-3.3.0/etc/hadoop
vim mapred-site.xml
#MR JobHistory Server管理的日志的存放位置
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
分发到其他机器上
scp -r mapred-site.xml node2:$PWD
scp –r mapred-site.xml node3:$PWD
``
**启动jobHistoryServer服务进程**
```powershell
mapred --daemon start historyserver
#如果关闭的话 用下述命令
mapred --daemon stop historyserver
** 页面访问jobhistoryserver**
http://node1:19888/jobhistory 或者 http://node1的IP地址:19888/jobhistory
HDFS的垃圾桶机制
每一个文件系统都会有垃圾桶机制,便于将删除的数据回收到垃圾桶里面去,避免某些误操作删除一些重要文件。回收到垃圾桶里里面的资料数据,都可以进行恢复。
HDFS的垃圾回收的默认配置属性为 0,也就是说,如果你不小心误删除了某样东西,那么这个操作是不可恢复的。
修改core-site.xml
#那么可以按照生产上的需求设置回收站的保存时间,这个时间以分钟为单位,例如1440=24h=1天。
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
然后重启hdfs集群
特别注意
如果启用垃圾箱配置,dfs命令删除的文件不会立即从HDFS中删除。
相反,HDFS将其移动到垃圾目录(每个用户在/user/<username>/.Trash下都有自己的垃圾目录)。
只要文件保留在垃圾箱中,文件可以快速恢复。
使用skipTrash选项删除文件,该选项不会将文件发送到垃圾箱。它将从HDFS中完全删除。