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