大数据Hadoop3.x入门
创建虚拟机(主机名hadoop100)
我这个内存配置太少了,后面启动个集群都要很久,电脑带得动的话记得多配一点内存。
如果Linux安装的是最小系统版,还需要安装如下工具
net-tool:工具包集合,包含ifconfig等命令
1
yum install -y net-tools
vim:编辑器
1
yum install -y vim
rsync
1
yum install -y rsync
配置IP与映射
配置虚拟机,vmware,window10的ip
vmware
第一步:编辑—>虚拟网络编辑器
第二步:nat设置
window10
第一步:找到VMnet8右键属性
第二步:配置
虚拟机
第一步:切换到root,执行 vim /etc/sysconfig/network-scripts/ifcfg-ens33
第二步:修改添加配置信息
第三步:执行 vim /etc/hostname
修改主机名称为hadoop100
第四步:执行 vim /etc/hosts
配置主机名称映射
第五步:都配置完后执行reboot
重启
查看能否ping通
Xshell远程访问
修改windows的主机映射文件(hosts)
进入
C:\Windows\System32\drivers\etc
修改hosts
文件添加如下内容
之后就可以用主机名远程登录虚拟机
虚拟机安装epel-release
Extra Packages for Enterprise Linux 是为 “红帽系” 的操作系统提供额外软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方 repository 中是找不到的。
1 | [root@hadoop100 ~]# yum install -y epel-release |
关闭防火墙、关闭防火墙开机自启
1 | systemctl stop firewalld |
企业开发中,通常单个服务器的防火墙会关闭。公司整体对外会设置防火墙。
配置hadoop100用户root权限
方便后期加sudo执行root权限的命令
1 | [root@hadoop100 ~]# vim /etc/sudoers |
添加图中那一行,并配置切换到最高权限时,无需输入密码。
切换到username用户测试
1 | [username@hadoop100 ~]$ cd /opt/ |
在/opt目录下创建文件夹,并修改所属主和所属组
用来保存软件
1 | [username@hadoop100 opt]$ sudo mkdir module |
卸载虚拟机自带JDK
如果是最小化安装不需要执行这一步
切换到root执行
1 | # 删除jdk |
1 | # 查看是否删除,执行后没有显示jdk则删除成功 |
重启虚拟机
reboot
克隆三台虚拟机
克隆前请先关机
步骤:右键虚拟机—>管理—>克隆—>选择克隆虚拟机中的当前状态—>选择创建完整克隆。
依次创建hadoop102、hadoop103、hadoop104
修改这三台虚拟机的ip和主机名(以hadoop102为例)
- 执行
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改ip为192.168.10.102
- 执行
vim /etc/hostname
修改主机名为hadoop102
- 执行
reboot
重启
将hadoop以及jdk导入hadoop102
JDK安装
将jdk解压到module文件夹
1 | [username@hadoop102 software]$ tar -zxvf jdk-8u231-linux-x64.tar.gz -C /opt/module/ |
进入profile.d目录中
1 | cd /etc/profile.d/ |
创建my_env.sh文件来配置环境变量
1 | [username@hadoop102 profile.d]$ sudo vim my_env.sh |
内容如下:jdk1.8.0_231为jdk解压后生成的目录
1 | # JAVA_HOME |
重新加载profile里头的文件并验证
1 | [username@hadoop102 profile.d]$ source /etc/profile |
Hadoop安装
解压
1 | [username@hadoop102 profile.d]$ cd /opt/software |
配置环境变量
1 | [username@hadoop102 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh |
添加如下内容
1 | # HADOOP_HOME |
重新加载
1 | source /etc/profile |
Hadoop运行模式
本地模式:单机运行
伪分布式模式:单机运行,但是具备Hadoop集群所有功能,一台服务器模拟分布式环境
完全分布式模式:多台服务器组成分布式环境。生产环境使用。
- 准备3台客户机(关闭防火墙、使用静态IP、配置主机名称)
- 安装JDK
- 配置环境变量
- 安装Hadoop
- 配置环境变量
- 配置集群
- 单点启动
- 配置ssh
- 群起并测试集群
本地运行模式案例(WordCount)
在hadoop-3.1.3文件下创建wcinput文件夹并在wcinput文件夹下创建word.txt文件
1
2
3[username@hadoop102 hadoop-3.1.3]$ mkdir wcinput
[username@hadoop102 hadoop-3.1.3]$ cd wcinput
[username@hadoop102 wcinput]$ vim word.txt内容如下
1
2
3
4kk kk
bobo
scarf
swj回到Hadoop目录
/opt/module/hadoop-3.1.3
执行程序提示:对路径不熟可以边按tab查看边输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/
doc/ hadoop/
[username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/
client/ common/ hdfs/ mapreduce/ tools/ yarn/
[username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/
hadoop-mapreduce-client-app-3.1.3.jar hadoop-mapreduce-client-shuffle-3.1.3.jar
hadoop-mapreduce-client-common-3.1.3.jar hadoop-mapreduce-client-uploader-3.1.3.jar
hadoop-mapreduce-client-core-3.1.3.jar hadoop-mapreduce-examples-3.1.3.jar
hadoop-mapreduce-client-hs-3.1.3.jar jdiff/
hadoop-mapreduce-client-hs-plugins-3.1.3.jar lib/
hadoop-mapreduce-client-jobclient-3.1.3.jar lib-examples/
hadoop-mapreduce-client-jobclient-3.1.3-tests.jar sources/
hadoop-mapreduce-client-nativetask-3.1.3.jar
# wcinput/ 输入路径 ./wcoutput/ 输出路径且之前不能存在
[username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput/结果
1
2
3
4
5
6
7
8
9
10[username@hadoop102 hadoop-3.1.3]$ cd wcoutput
[username@hadoop102 wcoutput]$ ll
总用量 4
-rw-r--r--. 1 username username 26 6月 8 21:02 part-r-00000
-rw-r--r--. 1 username username 0 6月 8 21:02 _SUCCESS
[username@hadoop102 wcoutput]$ cat part-r-00000
bobo 1
kk 2
scarf 1
swj 1
编写集群分发脚本xsync
scp(secure copy)安全拷贝
定义:实现服务器与服务器之间的数据拷贝
基本语法:
1
2scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称实操:
前提在这三台服务器上都已经创建了
/opt/module
、/opt/software
并且所属都为username:username
(之前克隆时就解决了)将hadoop102中的jdk以及hadoop分发到Hadoop103以及hadoop104
1
2
3
4
5
6
7
8
9# 在hadoop102中将jdk发给hadoop103
[username@hadoop102 module]$ scp -r jdk1.8.0_231/ username@hadoop103:/opt/module/
# 在hadoop103中拉取hadoop102中的hadoop
[username@hadoop103 module]$ scp -r username@hadoop102:/opt/module/hadoop-3.1.3/ ./
# 在hadoop103中将hadoop102的jdk拷贝到hadoop104中
[username@hadoop103 module]$ scp -r username@hadoop102:/opt/module/jdk1.8.0_231/ username@hadoop104:/opt/module/
# 之后给hadoop104传hadoop自选
## 可见scp使用不局限于哪台服务器
rsync远程同步工具
rsync主要用于备份与镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
1)rsync与scp区别:用rsync做文件复制要比scp的速度快,rsync只对差异文件做更新,scp是把所有文件都复制过去
2)基本语法
1 | rsync -av $pdir/$fname $user@$host:$pdir/$fname |
选项参数
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
3)实操
删除hadoop103中的wcinput
以及wcoutput
文件夹
1 | [username@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/ wcoutput/ |
将hadoop102中的hadoop-3.1.3
整个目录同步到hadoop103对应目录中
1 | [username@hadoop102 module]$ rsync -av hadoop-3.1.3/ username@hadoop103:/opt/module/hadoop-3.1.3/ |
xsync集群分发脚本
1)需求:循环复制文件到所有节点的相同目录下
2)编写代码:
在hadoop102家目录下的bin文件夹中创建xsync文件
1 | [username@hadoop102 ~]$ cd /home/username |
文件内容如下:
1 | !/bin/bash |
赋予xsync可执行权限
1 | [username@hadoop102 bin]$ chmod 777 xsync |
3)实操
如果xsync不能使用,执行以下代码
1 | [hadoop@hadoop102 bin]$ sudo cp xsync /bin |
分发当前bin目录
1 | xsync bin/ |
效果:
分发环境变量
1 | # 需要root权限,所以加上sudo,相当于代替root执行,所以得加上绝对路径./bin/xsync |
之后在hadoop103、hadoop104中执行
1 | source /etc/profile |
ssh免密登录
查看家目录的文件(包含隐藏文件),如果之前没有使用过ssh命令则不会有.ssh
1 | [username@hadoop102 ~]$ ls -al |
进入.ssh
文件夹执行ssh-keygen -t rsa
回车三次生成公私钥
ll
查看
将公钥拷贝到hadoop103和hadoop104
1 | [username@hadoop102 .ssh]$ ssh-copy-id hadoop103 |
之后hadoop102就可免密登录hadoop103和hadoop104
1 | [username@hadoop102 .ssh]$ ssh hadoop103 |
但是不能免密访问自己,所以还得将公钥发给自己
1 | [username@hadoop102 .ssh]$ ssh-copy-id hadoop102 |
hadoop103、hadoop104做相同操作后即可实现集群服务器之间免密登录,但是仅限于配置的用户之间,如果切换到root则不能免密,想免密就得再配置。现在进行xsync分发就不必再输入密码
集群配置
1)集群部署规划
NameNode 和 SecondaryNameNode 不要配置在同一台服务器
ResourceManager 很耗内存,不要和 NameNode 、SeconddaryNameNode 配置在同一台服务器上
hadoop102 | Hadoop103 | Hadoop104 | |
---|---|---|---|
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
2)配置文件说明
默认配置文件:
默认文件 | 文件存放在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 四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改。
3)配置集群
配置core-site.xml
1 | [username@hadoop102 ~]$ cd $HADOOP_HOME/etc/hadoop |
内容:
1 | <configuration> |
配置hdfs-site.xml
1 | [username@hadoop102 hadoop]$ vim hdfs-site.xml |
内容:
1 | <configuration> |
配置yarn-site.xml
1 | [username@hadoop102 hadoop]$ vim yarn-site.xml |
内容:
1 | <configuration> |
配置mapred-site.xml
1 | [username@hadoop102 hadoop]$ vim mapred-site.xml |
内容:
1 | <configuration> |
分发配置文件
1 | [username@hadoop102 hadoop]$ cd .. |
群起集群并测试
配置workers
1
[username@hadoop102 ~]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
内容:
不允许有空行,结尾不能有空格。
1
2
3hadoop102
hadoop103
hadoop104同步所有节点配置文件
1
2[username@hadoop102 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
[username@hadoop102 hadoop]$ xsync workers启动集群
如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
格式化集群:成功的话会在hadoop-3.1.3目录下生成data和logs目录
1
2[username@hadoop102 hadoop]$ cd /opt/module/hadoop-3.1.3
[username@hadoop102 hadoop-3.1.3]$ hdfs namenode -format启动集群:
1
[username@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
之后可通过
jps
命令查看启动情况访问hadoop102:9870
在配置了ResourceManager的节点(hadoop103)启动Yarn
1
2[username@hadoop103 ~]$ cd $HADOOP_HOME
[username@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh访问hadoop103:8088
集群的基本测试
上传文件到集群
上传小文件
1
2[username@hadoop102 ~]$ hadoop fs -mkdir /input
[username@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input效果
上传大文件
1
[username@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u231-linux-x64.tar.gz /
效果
文件的存储路径:
1
$HADOOP_HOME/data/dfs/data/current/BP-1767647801-192.168.10.102-1654708206348/current/finalized/subdir0/subdir0
运行wordcount案例
1
[username@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /ouput