Hadoop 学习日记(1)
大数据概论
概念
大数据,指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力,洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
特点(4V)
1、Volumn(大量)
2、Velocity(高速)
3、Variety(多样)
4、低价值密度
应用场景
1、抖音推荐
2、电商站内广告
3、物流仓储
....
大数据部门内部组织结构
Hadoop 概述
Hadoop 是什么
-
Hadoop 是一个由 Apache 基金会开发的分布式系统基础框架。
-
主要解决海量数据的存储和海量数据的分析计算问题
-
广义上来说,Hadoop 通常是指一个更广泛的概念 —— Hadoop生态圈。
Hadoop 组成
HDFS 架构概述
-
Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。
-
NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性,以及每个文件的块列表和块所在的 DataNode 等(也就是存储文件的位置)。
-
DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和(具体存储数据)。
-
Secondary NameNode(2nn):每隔一段时间对 NameNode 元数据备份(NameNode 的备份)。
YARN 架构概述
Yet Another Negotiator,简称 YARN,另一种资源协调者,是 Hadoop 的资源管理器。
MapReduce 架构概述
MapReduce 将计算过程分为两个阶段 Map 和 Reduce。
-
Map 阶段并行处理输入数据
-
Reduce 阶段对 Map 结果进行汇总
HDFS、YARN、MapReduce 三者关系
大数据技术生态体系
Hadoop 运行环境搭建
VMWare 安装
Centos 安装
之后点击两次下一步,均为推荐选项
之后点击安装
重启后
IP 地址和主机名称配置
右键 -> 属性
打开虚拟机终端
添加后三行
修改 bootproto 为 static
修改主机名称
配置Linux克隆机主机名称映射 hosts 文件,打开 /etc/hosts,添加如下内容
之后 reboot 重启
输入 ifconfig
出现我们刚才设置的 ip 地址
ping www.baidu.com
能 ping 通说明 ok
xshell 远程连接工具
新建会话,输入用户名密码
修改 windows 的 host 文件
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
xftp 远程传输工具
新建会话
连接成功
配置其他组件
安装 epel-release
Extra Packages for Enterprise Linux 是为红帽系的操作系统提供额外的软件包。相当于是一个软件仓库,大多数 rpm 包在官方仓库中是找不到的。
yum install -y epel-release
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld.service
配置用户 an 具有 root 权限,方便后期加 sudo 执行 root 权限命令
vim /etc/sudoers
卸载虚拟机自带的 JDK
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
重启虚拟机
克隆虚拟机
Hadoop101 由于历史原因,暂不使用该名称。
配置每台虚拟机的ip地址和主机名,和上述对hadoop100的操作一样。
在 hadoop102 上安装 JDK、Hadoop
上传 Hadoop、JDK
解压 JDK
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
新建 JDK 的环境变量
在 /opt/profile.d/ 目录下
vim my_env.sh
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
安装 Hadoop
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
配置环境变量
在 /opt/profile.d/ 目录下
vim my_env.sh
追加内容
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
source /etc/profile
Hadoop 目录的内容
Hadoop 运行模式
Hadoop 运行模式包括:本地模式、伪分布式、完全分布式
本地模式:单机运行,只是用来演示一下官方案例,生产环境不用
伪分布式:也是单机运行,但是具有 Hadoop 集群的所有功能,一台服务器模拟一个分布式的环境,生成环境不用
完全分布式:多台服务器组成分布式环境,生成环境用
演示本地运行模式
在 hadoop 目录下创建目录 wcinput
mkdir wcinput
在 wcinput 下创建文件 word.txt,内容如下
clear yes no
ok good clear
执行 wordcount 示例
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ wcoutput
注意输出目录 wcoutput 不能已经存在,否则会抛异常
进入 wcoutput 目录,查看文件
完全分布式运行模式(重点)
编写集群分发脚本
scp (secure copy) 安全拷贝
scp 可以实现服务器与服务器之间的数据拷贝
基本语法
scp -r 要拷贝的文件路径/名称 目的用户@主机:目的地路径/名称
前提,hadoop103、hadoop104 都有 /opt/module opt/software
在 hadoop102 上,将 hadoop102 中的 jdk 目录拷贝到 103上
scp -r jdk1.8.0_212/ root@hadoop103:/opt/module/
方式二
在 hadoop103 上,将 hadoop102 中的 hadoop 目录拷贝到 103 上
scp -r root@hadoop102:/opt/module/hadoop-3.1.3 module/hadoop-3.1.3
在 hadoop102 上,将 hadoop102 中的 module 目录拷贝到 104 上
scp -r module/* root@hadoop104:/opt/module/
rsync 远程同步工具(了解)
rsync 主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点
rsync 和 scp 区别,用 rsync 做文件复制比 scp 速度要快,rsync 只对差异文件做更新,scp 是把所有文件都复制过去。
基本语法
rsync -av 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明
-a:归档拷贝 -v:显示复制过程
xsync 集群分发脚本
(1) 需求:循环复制文件到所有脚本的目录下
(2) 在 /home/an/bin 目录下创建 bin 文件
(3) 创建 xsync 脚本 vim xsync
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguments!
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
(4) 修改脚本 xsync 具有执行权限
chmod +x xsync
(5) 分发环境变量
sudo bin/xsync /etc/profile.d/my_env.sh
(6) 使环境变量生效
source /etc/profile
SSH 无密登录配置
- 配置 ssh
(1) 基本语法
ssh 另一台电脑的 IP 地址
(2) 无密钥登录
底层原理
生成密钥
ssh-keygen -t rsa
将102上的公钥传递到103、104
ssh-copy-id hadoop103
ssh-copy-id hadoop104
同样对自己也需要授权
同时,103、104也要进行如上的配置
集群配置
NameNode 和 SecondaryNameNode 不要安装在同一台服务器
ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上
Hadoop 配置文件分为两类:默认文件配置和自定义配置文件,只有用户想修改某一默认配置项时,才需要修改自定义配置文件,更改相应属性。
自定义配置文件
core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml 四个配置文件存放在 hadoop.../etc/hadoop 路径上,用户可以根据项目需求重新进行修改配置。
配置 core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 an -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>an</value>
</property>
</configuration>
配置 hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 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>
</configuration>
配置 yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MR 走 shuffle -->
<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_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
配置mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.cluster.map.memory.mb</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.cluster.reduce.memory.mb</name>
<value>-1</value>
</property>
</configuration>
在集群上分发配置好的 Hadoop 配置文件
sudo ~/bin/xsync /opt/module/hadoop-3.1.3/etc/hadoop/
启动集群并测试
1、配置 workers
在 hadoop../etc/hadoop/workers 添加如下内容
hadoop102
hadoop103
hadoop104
同步所有配置文件
2、启动集群
(1) 如果集群是第一次启动,需要在 hadoop102 集群格式化 NameNode(注意:格式化 NameNode 会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到以往的数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 NameNode 和 DataNode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
hdfs namenode -format
(2) 启动 HDFS
sbin/start-dfs.sh
(3) 在配置了 ResourceManager 的节点 (hadoop103) 启动 YARN
sbin/start-yarn.sh
(4) Web 端查看 HDFS 的 NameNode
常用,在 Utilities 下查看 file system,可以查看上传的文件
(5) Web 端查看 YARN 的页面
3、集群基本测试
(1) 上传文件到集群
创建目录,上传小文件
hadoop fs -mkdir /wcinput
hadoop fs -put wcinput/word.txt /wcinput
上传大文件
hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
(2) 执行 wordcount 程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
这里可能会遇到的问题及解决方案
运行的结果
可能遇到的异常及处理
jps 进程没有完全启动
1、sbin/stop-dfs.sh
2、删除每个集群上的 data 和 logs
3、格式化 namenode
4、启动集群
历史服务器配置
1、配置 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、分发服务器配置
3、在 hadoop102 中启动历史服务器
mapred --daemon start historyserver
4、查看历史服务器是否启动
配置日志的聚集
日志聚集概念:应用运行完成后,将程序运行日志信息上传到 HDFS 系统上。
开启日志聚集功能,需要重新启动 NodeManager、ResourceManager 和 HistoryServer
1、配置 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>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2、重启服务器的yarn和historyserver
sbin/stop-yarn.sh
mapred --daemon stop historyserver
sbin/start-yarn.sh
mapred --daemon start historyserver
两个常用脚本
集群启动停止方式总结
1、各个模块分开启动/停止
- 整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh
2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh
2、各个服务组件逐一启动/停止
- 分别启动/停止 HDFS 组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
- 启动和停止 YARN
yarn -daemon start/stop resourcemanager/nodemanager
编写 Hadoop 集群常用脚本
- Hadoop 集群启动停止脚本 (包含 HDFS、YARN、Historyserver): myhadoop.sh
保存在用户 bin 目录下
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
赋予执行权限
chmod 777 myhadoop.sh
- 查看三台服务器 Java 进程脚本
在bin目录下新建 jpsall
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
赋予执行权限
chmod 777 myhadoop.sh
分发 bin 目录,保证自定义脚本在三台机器上都能使用
bin/xsync bin/
常用端口号说明
端口名称 | Hadoop2.x | Hadoop3.x |
---|---|---|
NameNode 内部通信端口 | 8020 / 9000 | 8020 / 9000/9820 |
NameNode HTTP UI | 50070 | 9870 |
MapReduce 查看执行任务端口 | 8088 | 8088 |
历史服务器通信端口 | 19888 | 19888 |
常用配置文件
3.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
2.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves