Hadpoo基本配置,公钥与密钥,集群相关配置
Hadpoo基本配置,公钥与密钥
- HDFS概念
- Paramiko模块
- 公钥私钥
- JDK环境准备
- Hadoop环境准备
- Hadoop目录结构
- 官方案例
- 伪分布式模式
- 配置日志采集
- 完全分布式(开发重点)
- 单点启动(了解)
HDFS概念
⼀个⽂件系统,通过⽬录树来定位⽂件; 其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各 ⾃的⻆⾊
优点:
1.高容错性
2.适合处理大数据量
3.可以构建在廉价机器上
缺点:
1.不适合低延时数据访问
2.无法高效的对大量小文件进行存储
3.支持数据append(追加)
HDFS文件块
可以最多存储3个副本块
HDFS存储数据的数据块大小
1.X版本最小是64M其它版本是128M
'''数据块大小使用默认128M即可,不需要修改'''
热备与冷备
热备:不停服更新
冷备:停服更新
热数据与冷数据
热数据:使用频率较高的数据
冷数据:使用频率较低的数据
保存副本节点选择
两个备份在同一个机架,另一个备份在其他机架
""" 何为快照? 给虚拟机保存当下的状态 之后可以回退到保存的状态 什么时候用快照? 在对虚拟机执行一些比较危险的操作之前 可以先快照之后还可以返回 """
如何快速生成多台虚拟机
先将需要克隆的机器关机
链接克隆与完整克隆
链接克隆:
效率高,但是需要保证原设备不能坏
完整克隆:
速度较慢,但是克隆完成后克隆机与原机器之间再无关系
克隆步骤
点击虚拟机-->管理-->克隆
选择虚拟机当前状态
选择连结克隆-->点击下一页
更改虚拟机,安装地址不要在c盘-->点击完成
网卡信息的修改
如果遇到文件无法打开问题,就需要删除特定的文件,详细操作看昨日博客操作(本人暂时还未碰到)
# vim /etc/sysconfi/network-scripts/ifcfg-ens33
# systemctl restart network
主机名称修改(可以不做)
# hostnamectl set-hostname 新的名称 # bash
关闭防火墙
systemctl stop firewalld # 临时关闭 systemctl disable firewalld # 悠久关闭 reboot # 重启 systemctl status firewalld # 查看防火墙状态 systemctl restart network # 重启网卡
配置映射关系
vim /etc/hosts # 打开配置文件
拔高:
如何利用xshell通过主机名的方式链接虚拟机?
修改宿主机hosts文件映射关系即可
1.找到host文件并打开,如果无法打开要设置相关权限
2.复制以下内容到文件中
10.0.0.201 ds691 10.0.0.202 ds692 10.0.0.203 ds693 10.0.0.204 ds694
公钥私钥
# 比用户名密码的方式更加安全
通过ssh远程连接服务器并执行想要命令 类似于Xshell 链接服务器有两种方式:
1.用户名和密码连接服务器
2.公钥私钥连接服务器
前期文件准备
# 在opt目录下创建两个文件夹 mkdir software # 存放压缩文件 mkdir module # 存放解压之后的文件
将JDK的Hadoop压缩包传入
方式1(拖拽直接上传):
下载对应插件
yum install lrzsz -y
验证是否安装成功
rpm -qa lrzsz
方法2:.python中的paramiko模块
Paramiko模块
paramiko模块支持上面两种连接服务器的方式: 1.用户名和密码连接服务器 2.公钥私钥连接服务器
安装
pip3 install paramiko
Paramiko远程执行命令
# 用户名和密码的方式 import paramiko # 创建ssh对象 ssh = paramiko.SSHClient() # 允许链接不在know_hosts文件中主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname='10.0.0.201' ,port=22,username='root' ,password='112233aacc') # 执行命令 stdin, stdout, stderr =ssh.exec_command('ip a') # 获取结果 res = stdout.read() # 基于网络传输 该结果是一个bytes类型 print(res.decode('utf-8')) # 断开链接 ssh.close()
公钥私钥方式
首先你要产生你自己的公钥和私钥,然后将你的公钥上传到 服务器保存 之后就可以通过私钥来链接
下列代码用于linux环境,需要在主机下载一个git编程环境,输入
""" mac ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub username@hostname cat ~/.ssh/id_rsa windows 1.下载git并安装(提供windows环境的linux操作 界面) https://git-scm.com/ 2.右键git bash here进入git终端(相当于linux 界面) ssh-keygen -t rsa 3.拷贝公钥至远程服务器 ssh-copy-id -i 公钥文件路径 username@hostname """
将提示信息输入
ssh 'root@10.0.0.201'
python方法:
# 公钥和私钥(先讲公钥保存到服务器上) import paramiko # 读取本地私钥 private_key = paramiko.RSAKey.from_private_key_file('a.tx t') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.Au toAddPolicy()) # 连接服务器 ssh.connect(hostname='10.0.0.21' , port=22, username='root' , pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls /') # 获取命令结果 result = stdout.read() print(result.decode('utf-8')) # 关闭连接 ssh.close()
JDK环境准备
1.将解压之后的放入module
tar -zxvf jdk[按TAB键]tar.gz -C /opt/module/
2.环境变量配置
vim /etc/profile
添加内容:
## JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin
3.使环境变量生效
source /etc/profile
4.查看是否有效
java -version
Hadoop环境准备
1.在software文件中,解压文件
tar -zxvf hadoop...tar.gz -C /opt/module/
2.环境变量配置
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
3.使环境变量生效
source /etc/profile
4.查看是否有效
hadoop
Hadoop目录结构
bin:
主要服务
hadoop 管理整个hadoop集群
hdfs 管理数据存储
yarn 管理资源调度
etc:
hadoop配置文件
sbin:
hadoop启动停止、整个集群启动停止
share:
说明文档/手册,大量使用案例
官方案例
Grep过滤代码
# 进入hadpood
# cd hadpood
# 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]$ bin/hadoop jar share/hadoop/mapreduce/hadoopmapreduce-examples-3.2.1.jar grep input/output 'dfs[a-z.]+' # 4.查看输出结果 [jason@hadoop101 hadoop-2.7.2]$ cat output/*
之WordCount(重要)代码
# 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
回到 Hadoop 目录/opt/module/hadoop-2.7.2执行程序
[jason@hadoop101 hadoop-2.7.2]$ bin/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/hadoop2.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)
# 格式化 NameNode(第一次启动时格式化,以后就不要总格式化) bin/hdfs namenode -format # 启动 NameNode sbin/hadoop-daemon.sh start namenode # 启动 DataNode sbin/hadoop-daemon.sh start datanode
5.查看是否启动成功
jps
5.2虚拟机ip地址,端口号50070
eg:10.0.0.201: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-mapreduceexample-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删除 """
伪分布的YARM配置
1.在hadoop-2.7.2路径下
cd etc/hadoop
vim yarn-env.sh
2.修改配置
export JAVA_HOME=/opt/module/jdk1.8.0_144
3.编辑文件内容
vim yarn-site.xml
复制插入
<!-- Reducer 获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 YARN 的 ResourceManager 的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop101</value> </property>
4.在hadoop路径下
vim mapred-env.sh
5.修改配置
export JAVA_HOME=/opt/module/jdk1.8.0_144
6.修改文件名
mv mapred-site.xml.template mapred-site.xml
7.编辑文件内容
vim mapred-site.xml
复制插入
<!-- 指定 MR 运行在 YARN 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
8.在hadoop-2.7.2路径下启动yarn
sbin/yarn-daemon.sh start resourcemanager
9.在hadoop-2.7.2路径下启动NodeManager
sbin/yarn-daemon.sh start nodemanager
10.查看服务是否正常启动
jps
11.查看mapreduce服务
10.0.0.201:8088
跑服务查看平台变化
1.在hadoop-2.7.2路径下先删除之前的output文件
bin/hdfs dfs -rm -r /user/jason/output
2.再次运行wordcount案例
hadoop jar share/hadoop/mapreduce/hadoopmapreduce-examples-2.7.2.jar wordcount /user/jason/input/ /user/jason/output/
配置日志采集
1.在hadoop路径下编辑文件
vim yarn-site.xml
复制插入
<!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregationenable</name> <value>true</value> </property> <!-- 日志保留时间设置 7 天 --> <property> <name>yarn.log-aggregation.retainseconds</name> <value>604800</value> </property>
'''
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryManager。
'''
代码操作:
[jason@hadoop101 hadoop-2.7.2]$ sbin/yarndaemon.sh stop resourcemanager [jason@hadoop101 hadoop-2.7.2]$ sbin/yarndaemon.sh stop nodemanager [jason@hadoop101 hadoop-2.7.2]$ sbin/mrjobhistory- daemon.sh stop historyserver
3.启动 NodeManager 、ResourceManager 和 HistoryManager
[jason@hadoop101 hadoop-2.7.2]$ sbin/yarndaemon.sh start resourcemanager [jason@hadoop101 hadoop-2.7.2]$ sbin/yarndaemon.sh start nodemanager [jason@hadoop101 hadoop-2.7.2]$ sbin/mrjobhistory- daemon.sh start historyserver
完全分布式(开发重点)
准备工作
1)准备 3台客户机
2)安装 JDK
3)配置环境变量
4)安装 Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置 ssh
9)群起并测试集群
详细:
# 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
3)配置环境变量 1.利用scp命令拷贝环境变量文件至三个客户机
scp /etc/profile root@hadoop102:/etc/profile scp /etc/profile root@hadoop103:/etc/profile scp /etc/profile root@hadoop104:/etc/profile
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/
5)集群配置
'''在102上修改,然后用xsync脚本直接同步'''
1.配置 core-site.xml(修改主机名即可),复制插入
""" <!-- 指定 HDFS 中 NameNode 的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!-- 指定 Hadoop 运行时产生文件的存储目录 -- > <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop2.7.2/data/tmp</value> </property> """
2.HDFS 配置文件
1.配置 hadoop-env.sh
[jason@hadoop102 hadoop]$ vi hadoopenv.sh
复制插入
"""内容(有就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """
2.配置 hdfs-site.xml(将伪分布式配置删除添加下列配置)
[jason@hadoop102 hadoop]$ vi hdfs-site.xml
复制插入
"""内容 <!-- 指定 Hadoop 辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> """
3.YARN 配置文件 1.配置 yarn-env.sh
[jason@hadoop102 hadoop]$ vi yarnenv.sh """内容(有就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """
2.配置 yarn-site.xml(修改主机名即可)
[jason@hadoop102 hadoop]$ vi yarnsite.xml """内容 <!-- Reducer 获取数据的方式 --> <property> <name>yarn.nodemanager.auxservices</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 YARN 的 ResourceManager 的地 址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> """
4.MapReduce 配置文件 1.配置 mapred-env.sh
[jason@hadoop102 hadoop]$ vi mapredenv.sh """内容(伪分布式配了就不用改了) export JAVA_HOME=/opt/module/jdk1.8.0_144 """
2.配置 mapred-site.xml(伪分布式配了就不用改 了)
[jason@hadoop102 hadoop]$ cp mapredsite.xml.template mapred-site.xml [jason@hadoop102 hadoop]$ vi mapred-site.xml """内容 <!-- 指定 MR 运行在 Yarn 上 --> <property> 集群单点启动 <name>mapreduce.framework.name</name> <value>yarn</value> </property> """
3.在集群上分发配置好的 Hadoop 配置文件
[jason@hadoop102 etc]$ xsync hadoop/
4.查看文件分发情况
[jason@hadoop103 hadoop]$ cat /opt/module/hadoop2.7.2/etc/hadoop/core-site.xml
单点启动(了解)
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就一个)
$ sbin/hadoop-daemon.sh start datanode
$ sbin/hadoop-daemon.sh start datanode
4.浏览器验证
10.0.0.202:50070
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.验证每个节点对于启动的服务
jpg
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间
1. 时间服务器配置(必须 root 用户)
简介步骤
(1)检查 ntp 是否安装 (2)修改 ntp 配置 a)修改1(授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查 询和同步时间)文件 b)修改2(集群在局域网中,不使用其他互联网上的时间) c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步) (3)修改/etc/sysconfig/ntpd 文件 (4)重新启动 ntpd 服务 (5)设置 ntpd 服务开机启动
2. 其他机器配置(必须 root 用户)
简介步骤
(1)在其他机器配置 1 分钟与时间服务器同步一次 (2)修改任意机器时间 (3)一分钟后查看机器是否与时间服务器同步 (4)主动同步时间
重要知识
分 时 日 月 周