hadoop第二部分
Hadoop环境准备
虚拟机环境准备
克隆多台虚拟机
链接克隆
完整克隆

依次修改克隆出来的ip地址和主机名
ip地址修改
vim /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
host主机名
hostnamectl set-hostname hadoop01
bash


修改hosts文件添加映射关系
vim /etc/hosts 10.0.0.1 hadoop101

关闭防火墙
systemctl disable firewalld systemctl status firewalld reboot
所需软件准备
hadoop的运行需要依赖于java的jdk软件
jdk压缩包
hadoop压缩包(2.X 最新3.X)
第三方软件一般都是存储在/opt目录下
该目录下可以创建不同的目录存储不同类型的文件
software
压缩包
module
解压文件

linux系统与windows系统数据交互
借助于linux的lrzsz工具
不单单可以使用命令下载完成后还可以直接在xshell拖拽
借助于python的模块
paramiko模块

paramiko模块
能够远程链接服务器并执行命令和上传下载文件
支持两种链接服务器的方式
用户名密码
公钥私钥
解压文件
tar -zxvf hadoop...tar.gz -C /opt/module/

环境变量配置
vim /etc/profile '''添加内容''' ##HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin # 使环境变量生效 source /etc/profile # 查看是否有效 hadoop

hadoop目录结构
bin
主要服务
hadoop 管理整个hadoop集群
hdfs 管理数据存储
yarn 管理资源调度
etc
hadoop配置文件
sbin
hadoop启动停止、整个集群启动停止
share
说明文档/手册,大量使用案例
# 1.创建input文件夹 [jason@hadoop101 hadoop-2.7.2]$ mkdir input # 2.将Hadoop 的xml配置文件复制到input文件夹内 [jason@hadoop101 hadoop-2.7.2]$ cp etc/hadoop/*.xml input/ # 3.从多个文件内过滤出符合条件的文件内容 [jason@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input/ output 'dfs[a-z.]+' # 4.查看输出结果 [jason@hadoop101 hadoop-2.7.2]$ cat output/*


# 1.创建wcinput文件夹 [jason@hadoop101 hadoop-2.7.2]$ mkdir wcinput # 2.在wcinput 文件下创建一个wc.input 文件 [jason@hadoop101 hadoop-2.7.2]$ cd wcinput [jason@hadoop101 wcinput]$ touch wc.input # 3.编辑wc.input文件 [jason@hadoop101 wcinput]$ vim wc.input '''文件内容''' hadoop yarn hadoop mapreduce jason jason # 4.回到 Hadoop 目录/opt/module/hadoop-2.7.2执行程序 [jason@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput/ wcoutput # 5.查看结果 cat wcoutput/part-r-00000

# 1./etc/hadoop路径下 vim core-site.xml """ <!-- 指定 HDFS 中 NameNode 的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!-- 指定 Hadoop 运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> """ # 2./etc/hadoop路径下 vim hadoop-env.sh """ 2.1 新建连接查看并拷贝 echo $JAVA_HOME 2.2 修改hadoop-env.sh文件中的JAVA_HOME export JAVA_HOME = ... """ # 3./etc/hadoop路径下 vim hdfs-site.xml """ <!-- 指定 HDFS 副本的数量 --> <property> <name>dfs.replication</name> <value>1</value> </property> """ # 4.退出到hadoop根目录下(hadoop-2.7.2) # 4.1格式化 NameNode(第一次启动时格式化,以后就不要总格式化) hdfs namenode - format # 4.2启动 NameNode sbin/hadoop-daemon.sh start namenode # 4.3启动 DataNode sbin/hadoop-daemon.sh start datanode # 5.查看是否启动成功 # 5.1命令的形式 jps '''注意:jps 是 JDK 中的命令,不是 Linux 命令。不安装 JDK 不能使用 jps''' # 5.2浏览器可视化界面 虚拟机ip地址,端口号50070 # 6.浏览器界面Browse Directory bin/hdfs dfs -mkdir -p /user/jason/input # 与linux操作基本一致 bin/hdfs dfs -ls / # 7.将hadoop-2.7.2路径下的wcinput文件上传到hdfs路径下 bin/hdfs dfs -put wcinput/wc.input /user/jason/input # 8.在hdfs上实现字符统计 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-2.7.2.jar wordcount /user/jason/input /user/jason/output # 浏览器可视化查看或者命令查看 bin/hdfs dfs -cat /user/jason/ouput/p* """ 补充 针对已经格式化NameNode想再次格式化, 第一步先用jps查看进程是否已经关闭 第二步将hadoop-2.7.2目录下的data和logs删除 """


# 编辑文件内容 vim etc/hadoop/mapred-site.xml """ <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop101:10020</value> </property> <!-- 历史服务器 web 端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop101:19888</value> </property> """ # 在hadoop-2.7.2路径下启动历史服务器 sbin/mr-jobhistory- daemon.sh start historyserver # 刷新页面再点击图形化界面history标签
分布式
分布式:将一个完整的功能、软件等拆分到不同的机器上运行
伪分布式:在一台机器(服务器,虚拟机)上模拟多台机器的效果
完全分布式:真正在多台机器(服务器 虚拟机)上操作
linux一切皆文件,所有的操作说白了都仅仅是在操作文件从而产生功能效果
50070 # Hadoop HDFS 3306 # MySQL 27017 # MongoDB 6379 # Redis 8088 # Hadoop MapReduce
HDFS是专门用于存储数据的地方
初始化HDFS里面上面数据都没有
完全分布式
拷贝
本地拷贝
远程拷贝
全量拷贝(scp):每一次都是完完整整的将数据重新加载一份
增量拷贝(rsync):检查是否有重复的项 只加载改动的数据
准备
准备3台客户机
安装 JDK
配置环境变量
安装Hadoop
配置环境变量
配置集群
单点启动
配置 ssh
群起并测试集群
详细步骤
详细:
1)准备 3台客户机(关闭防火墙、静态 ip、主机名称)
克隆机器修改主机名和主机IP地址
2)安装 JDK
利用scp命令拷贝数据文件至三个客户机
scp -r /opt/module root@hadoop102:/opt/module
scp -r /opt/module root@hadoop103:/opt/module
scp -r /opt/module root@hadoop104:/opt/module
"""
也可以在A机器将B机器文件拷贝给C机器
scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module
"""
# 扩展:拷贝文件的命令有scp(全量拷贝)、rsync(增量拷贝)
"""
scp(全量拷贝)
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
rsync(增量拷贝)
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
参数详解
r 递归
v 显示复制过程
l 拷贝符号连接
"""
3)配置环境变量
1.利用scp命令拷贝环境变量文件至三个客户机
scp /etc/profile root@hadoop102:/etc/profile
scp /etc/profile root@hadoop103:/etc/profile
scp /etc/profile root@hadoop104:/etc/profile
2.source文件配置
source /etc/profile
3.验证是否成功
java
4)扩展:集群分发脚本
复制文件到所有节点的相同目录下
1.在/usr/local/bin下创建sync文件并填写以下内容
[jason@hadoop102 ~]$ cd /usr/local/bin
[jason@hadoop102 bin]$ touch xsync
[jason@hadoop102 bin]$ vi xsync
"""
文件内容
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1 fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
"""
2.修改权限
chmod 777 xsync
3.测试
在当前机器随便找一个其他机器没有的目录
xsync test/






单点启动
1.如果集群是第一次启动,需要格式化 NameNode(我们不是 因为前面弄了伪分布式) [jason@hadoop102 hadoop-2.7.2]$ hadoop namenode -format """ 如果集群不是第一次启动,需要删除data和logs目录 [jason@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/ [jason@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/ [jason@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/ """ 2.在 hadoop102 上启动 NameNode和DataNode [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode 3.去103和104启动datanode(namenode就一个) [jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode [jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode 4.浏览器验证 hadoop102:50070


集群ssh配置
""" 上述单点启动的方式每次都一个一个节点启动 如果节点数量很多该如何解决 """ # 公钥私钥工作原理 # 知识补充:查看know_hosts文件(访问过的主机地址) [jason@hadoop102 ~]$ ll # 无法查看 [jason@hadoop102 ~]$ ls -al # 可以查看 [jason@hadoop102 ~]$ cd .ssh [jason@hadoop102 .ssh]$ ll [jason@hadoop102 .shh]$ cat known_hosts # 生成公钥私钥 [jason@hadoop102 .ssh]$ ssh-keygen -t rsa # 连续回车即可 # 将102公钥拷贝到103和104 [jason@hadoop102 .shh]$ ssh-copy-id hadoop103 [jason@hadoop102 .shh]$ ssh-copy-id hadoop104 """ hadoop103中的.ssh在拷贝前后文件是有变化的 hadoop104中的.ssh在拷贝前后文件是有变化的 """ # 免密直接访问103和104 ssh hadoop103/hadoop104 # 自己用ssh访问自己也需要输入密码,可以采用相同措施解决 [jason@hadoop102 .shh]$ ssh-copy-id hadoop102 # 由于hadoop103上有一个resurcemanage所以也需要配置ssh [jason@hadoop103 .ssh]$ ssh-keygen -t rsa [jason@hadoop103 .shh]$ ssh-copy-id hadoop102 [jason@hadoop103 .shh]$ ssh-copy-id hadoop103 [jason@hadoop103 .shh]$ ssh-copy-id hadoop104

1.配置
文件位置:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[jason@hadoop102 hadoop]$ vi slaves
"""内容(内容清空再添加)
hadoop102
hadoop103
hadoop104
"""
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
2.同步所有节点配置文件
[jason@hadoop102 hadoop]$ xsync slaves
3.将之前单节点启动的datanode、namenode全部退出
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode
[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
4.启动HDFS
[jason@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
5.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错
6.启动yarn(一定要在hadoop103上启动 因为rm在这里)
"""
这里需要将hadoop03的公钥分别发送给hadoop102、hadoop103、hadoop104
"""
[jason@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
7.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错




1.上传文件到集群 1.小文件 [jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input / 2.大文件 [jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz / 3.浏览器界面测试

集群启动停止总结
1. 各个服务组件逐一启动/停止 (1)分别启动/停止 HDFS 组件 hadoop-daemon.sh start/stop namenode/datanode/ secondarynamenode (2)启动/停止 YARN yarn-daemon.sh start /stop resourcemanager/nodemanager 2. 各个模块分开启动/停止(配置 ssh 是前提)常用 (1)整体启动/停止 HDFS start-dfs.sh/stop-dfs.sh (2)整体启动/停止 YARN start-yarn.sh/stop-yarn.sh
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间
1. 时间服务器配置(必须 root 用户)
(1)检查 ntp 是否安装
[root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp
(2)修改 ntp 配置文件
[root@hadoop102 hadoop-2.7.2]# vi /etc/ntp.conf
a)修改1(授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查 询和同步时间)
# 解开注释
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集群在局域网中,不使用其他互联网上的时间)
# 加上注释
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@hadoop102 hadoop-2.7.2]$ vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动 ntpd 服务
[root@hadoop102 桌面]$ service ntpd start
[root@hadoop102 桌面]$ service ntpd status
(5)设置 ntpd 服务开机启动
[root@hadoop102 桌面]$ chkconfig ntpd on
2. 其他机器配置(必须 root 用户)
分 时 日 月 周
(1)在其他机器配置 1 分钟与时间服务器同步一次
root@hadoop103 hadoop2-7.2]$ crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
[root@hadoop103 ~]$ date -s "2020-11-11 11:11:11"
(3)一分钟后查看机器是否与时间服务器同步
[root@hadoop103 ~]$ date
# 测试的时候可以将 10 分钟调整为 1 分钟,节省时间。
(4)主动同步时间
[root@hadoop103 root]$ /usr/sbin/ntpdate hadoop102


浙公网安备 33010602011771号