目录
hadoop的几种部署模式:
单机模式:
伪分布式模式:
完全分布式模式:
高可用模式:
联邦模式:
安装分布式的准备:
伪分布式安装:
完全分布式安装:
高可用模式
安装过程中的问题
1.查看集群日志
2.主机名
3.启动的时候某一个进程启动不了(jps查看进程)
4.格式化的问题
5.时间同步问题
6.环境变量的配置
hadoop的几种部署模式:
单机模式:
安装在一个节点上。
不存在分布式文件系统,所有的文件存取都是在本地模式,数据来源于本地存储。linux本地存储。
生产上肯定不会用,一般用于本地测试(快)
伪分布式模式:
安装在一个节点上。
存在分布式文件系统,但是所有进程全部运行在一台机器上。存在主从结构,也是分布式。
生产上不会用,一般用于个人学习。用的时候和完全分布式一样。
完全分布式模式:
主从结构,运行在多个节点。(一个主节点,多个从节点)
多个节点共同服务,依赖于namenode进行联系。
生产中用的比较少,集群的节点数比较少的时候会用(20个节点以下)
缺陷:一个主节点,一个冷备份节点
主节点压力大,容易存在主节点的单点故障。(如果namenode宕机了,集群不能正常访问,集群瘫痪)
高可用模式:
多个主节点,多个从节点。
多个主节点中在同一时间只有一个主节点对外提供服务,称为active namenode,其他主节点处于热备份状态(standby namenode),时刻监控active namenode主节点的状态。
当active namenode宕机时,standby namenode立即进行切换为active namenode。所以standby namenode必须实时和active namenode的元数据保持一致。
高可用模式依赖于zookeeper(主从切换依赖zookeeper)
目前使用最广泛的集群模式。
缺陷:虽然有多个主节点,但是同一时间只有一个是active,集群中真正服务的主节点仍然是一台机器的能力。如果集群非常大,有1000台从节点机器,每台datanode的存储元数据都需要存在namenode中,namenode的压力会很大,namenode存储的东西过多,进行数据访问的时候效率过低。
这个时候需要帮namenode分担压力,同一时间有多个主节点对外提供服务就好了(联邦模式)
联邦模式:
适用于大型集群
同一时间会有多个namenode共同服务。多个namenode之间相互协作的时候依赖于块池id,来区分哪个数据归属哪一 个namenode管理。多个namenode共同管理集群中的所有datanode ,分工明确的,每个 namenode只负责管理datanode上自己块池的数据。
块池:联邦模式中标志数据块的管理权限的
blockpoolID=BP-54673466-192.168.40.201-1531445892504
这个指的是当前的namenode所管理的块池的名字
缺陷:当其中一个active namenode宕机时,这个管理的blockpool就不可用。
所以一般采用 :联邦+高可用
安装分布式的准备:
1)ip
vi /etc/sysconfig/network-scripts/ifcfg-eth0
硬件设备名、网卡名、开机是否加载配置文件、网络配置协议、IP、子网掩码、网关、域名解析、外网域名解析
2)主机名
vi /etc/sysconfig/network
HOSTNAME=主机名
3)映射
vi /etc/hosts
主机IP 主机名
192.168.40.161 host1
4)关闭防防火墙和selinux
service iptables stop 或者service iptables off
vi /etc/selinux/config
SELINUX=disabled linux高级运维 权限认证
5)配置普通用户 赋予sudolers权限 root权限
vi /etc/sudoers
hadoop ALL=(ALL) ALL
登录普通用户:hadoop
6)免密登录:(用普通用户进行安装,以下步骤用普通用户登录)
ssh-keygen 生成秘钥(三次回车)
ssh-copy-id host1 对自身进行免密登录
ssh host1 验证免密登录
exit 退出登录
/home/hadoop/.ssh 当前用户的秘钥地址
7)将系统启动级别改为3
sudo vi /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this) 关机 init 0
# 1 - Single user mode 单用户
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多用户 没有网络
# 3 - Full multiuser mode 完全多用户
# 4 - unused 弃用
# 5 - X11 图形化
# 6 - reboot (Do NOT set initdefault to this) 重启 init 6
id:3:initdefault
8)安装jdk
在家目录下创建目录apps
Alt+p 进入sftp,上传jdk,并解压到/home/hadoop/apps/jdk1.8.0_73
(注意: 用普通用户进行登录,否则,上传的时候,默认上传到root用户的家目录下)
tar -zxvf jdk-8u73-linux-x64.tar.gz 解压
配置环境变量:
sudo vi /etc/profile
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
java -version / javac 验证
如果jdk的版本是1.7的就卸载(说明是以前的)
卸载linux自带的jdk
rpm -qa | grep -i jdk -i 忽略大小写
sudo rpm -e java-1.7.0-openjdk-1.7.0.99-2.6.5.1.el6.x86_64 --nodeps 解除依赖
sudo rpm -e java-1.6.0-openjdk-1.6.0.38-1.13.10.4.el6.x86_64 --nodeps 解除依赖
rpm -qa | grep jdk
source /etc/profile
java -version
9)时间同步
伪分布不需要 完全分布式需要
注意:
关闭防火墙 service iptables stop
伪分布式安装:
伪分布式模式:在一台机器上运行
在安装hadoop的时候,会遇到版本选择问题。
不会选择最高版本---市场应用不广,有待测试;
不会选择低版本---很多功能不全;
选择适中版本---2.7.6
1)上传安装包(hadoop)
2)解压
tar -xvzf hadoop-2.7.6.tar.gz -C apps/
3)修改配置文件
/apps/hadoop2.7.6/etc (hadoop的配置文件,而不是家目录下的配置文件)
/home/hadoop/apps/hadoop-2.7.6/etc/hadoop
修改6个配置文件( 都是在hadoop-2.7.6/etc/hadoop下配置 )
1)hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
找配置文件到官网去找(http://hadoop.apache.org/ 找里面的document)
2)core-site.xml 核心文件配置文件 三个模块的公共的配置
vi core-site.xml
<property>
<name>fs.defaultFS</name>配置项的名字(不可改) 文件系统的默认访问路径
<value>hdfs://localhosts:9000</value> 配置项的值
</property>
hdfs://localhosts(主机名):9000(默认的端口号)
jdbc:mysql://localhost
3)hdfs-site.xml hdfs的相关配置
vi hdfs-site.xml
<property>
<name>dfs.replication</name> 文件系统的副本个数, 文件存储的份数
<value>1</value> 伪分布式配一台节点
</property>
4) mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
<property>
<name>mapreduce.framework.name</name> mapreduce程序的资源调度框架,框架为yarn
<value>yarn</value>
</property>
5)yarn-site.xml
vi yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name> Yarn资源调度框架上跑的哪些计算任务
<value>mapreduce_shuffle</value>
</property>
6)slaves
配置从节点的信息 (配置从节点的主机的信息)
vi slaves
改主机名为model(主机名)
注意:
一行一个主机名
主机名输完之后不要加空格
也不要回车(除非多个主机名)
4)配置hadoop的环境变量
sudo vi /etc/profile
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
hadoop version 检验
5)进行格式化 (不进行格式化,整个集群使用不了)执行命令 重要
hadoop namenode -format
成功:
18/07/12 16:31:08 INFO common.Storage: Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.
如果格式化不成功,修改错误的地方 重新格式化
格式化成功,只需要一次
6)启动
启动hdfs: namenode datanode secondarynamenode
start-dfs.sh
jps 查看
进程号 进程名
27504 DataNode
27692 SecondaryNameNode
27804 Jps
27405 NameNode
启动yarn:
start-yarn.sh
jps 查看
27504 DataNode
27953 NodeManager
27988 Jps
27851 ResourceManager
27692 SecondaryNameNode
27405 NameNode
到此 伪分布式安装成功。
7)验证:
http://192.168.40.161:50070 hdfs的web网页
http://192.168.40.161:8088 yarn的web网页
(能访问到的前提是:防火墙关闭)
完全分布式安装:
集群规划:哪个节点上安装哪个进程(这里用三个节点)
hdfs: namenode(1) datanode(多个 3) secondarynamenode(1)
yarn: resourcemanager(1) nodemanager(3)
Hdfs 的进程安装在哪,Yarn 的进程安装在哪,如下:
hadoop01 namenode datanode nodemanager
hadoop02 datanode secondarynamenode nodemanager
hadoop03 datanode resourcemanager nodemanager
安装:准备工作:(如上 9个准备步骤)
连接三个主机(hadoop01,hadoop02,hadoop03)
依次检查准备工作是否做好:
1) ip addr 查看ip
2) cat /etc/sysconfig/network 主机名
3) cat /etc/hosts 映射
4) sudo service iptables status 关闭防火墙
cat /etc/selinux/config
5) 配置普通用户,三台
6) 免密登录:普通用户
三台机器相互之间都需要做免密,用户名和密码一定要一致
ssh-keygen (三台都执行)
ssh-copy-id hadoop@hadoop01(三台都执行)
ssh-copy-id hadoop@hadoop02(三台都执行)
ssh-copy-id hadoop@hadoop03(三台都执行)
ssh hadoop01 验证
ssh hadoop02 验证
ssh hadoop03 验证
为了避免是root用户,加hadoop@;(格式:用户名@),不加这个,默认的是当前用户
/home/hadoop/.ssh当前用户的秘钥
7) 将系统启动级别改为3
检查 cat /etc/inittab
8) 安装jdk
上传安装包 先上传到一台 配置完成之后再发送
上传jdk, 并解压到/home/hadoop/apps/jdk1.8.0_73
tar -zxvf jdk-8u73-linux-x64.tar.gz -C /home/hadoop/apps
配置环境变量:
sudo vi /etc/profile
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
java -version 或javac
hadoop02 hadoop03远程发送:
scp -r jdk1.8.0_73 hadoop02:/home/hadoop/apps/
scp -r jdk1.8.0_73 hadoop03:$PWD
sudo scp /etc/profile hadoop02:/etc/
sudo scp /etc/profile hadoop03:/etc/
source /etc/profile 2个节点都source
如果jdk的版本是1.7的就卸载(说明是以前的)
卸载linux自带的jdk
rpm -qa | grep jdk -i 忽略大小写
sudo rpm -e java-1.7.0-openjdk-1.7.0.99-2.6.5.1.el6.x86_64 --nodeps
sudo rpm -e java-1.6.0-openjdk-1.6.0.38-1.13.10.4.el6.x86_64 --nodeps
source /etc/profile
java -version
发送jdk到hadoop02,hadoop03
在hadoop02,hadoop03里的家目录下创建apps
scp -r jdk1.8.0_73 hadoop02:$PWD
scp -r jdk1.8.0_73 hadoop03:$PWD
9)时间同步
完全分布式需要 多台机器的 集群的 时间同步
命令: ntpdate 时间同步服务器
例如:sudo ntpdate ntp1.aliyun.com (三台一起用这个命令)
注意:不是所有服务器都能用;可以用sudo ntpdate cn.pool.ntp.org
开始安装:
jdk远程发送给其他两个主机
hadoop先在一台机器上安装,再远程发送
1)上传hadoop压缩包
2)解压
tar -xvzf hadoop-2.7.6.tar.gz -C /home/hadoop/apps
3)修改配置文件
cd /home/hadoop/apps/hadoop-2.7.6/etc/hadoop
hadoop-env.sh
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
core-site.xml
<property>
<name>hadoop.tmp.dir</name> hadoop临时文件的存储目录
<value>/home/hadoop/data/hadoopdata</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/name</value>
<description>namenode的存储目录,为了保证元数据的安全一般配置多个不同目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/data</value>
<description>datanode 的数据存储目录</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>HDFS 的数据块的副本存储个数</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop02:50090</value> secondarynamenode的访问路径
<description>secondarynamenode 运行节点的信息,和 namenode 不同节点</description>
</property>
mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>YARN 集群为 MapReduce 程序提供的 shuffle 服务</description>
</property>
vi slaves 从节点的信息
hadoop01
hadoop02
hadoop03
4)配置hadoop的环境变量
sudo vi /etc/profile
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
hadoop version
5)远程发送到其他两个节点
scp -r hadoop-2.7.6 hadoop02:$PWD
scp -r hadoop-2.7.6 hadoop03:$PWD
sudo scp /etc/profile hadoop02:/etc/
sudo scp /etc/profile hadoop03:/etc/
source /etc/profile
6)格式化
只需要在一台机器上执行,一定在namenode节点上 hdfs的主节点上 hadoop01
hadoop namenode -format
格式化成功会出现 successfully formatted
7)启动
启动hdfs:
start-dfs.sh 在任意一个节点上执行,执行一次
hadoop01:namenode datanode
hadoop02:datanode secondarynamenode
hadoop03:datanode
启动yarn:
start-yarn.sh 最好在yarn的主节点,如果不在,会造成resourcemanager启动失败
hadoop01:nodemanager
hadoop02:nodemanager
hadoop03:resourcemanager nodemanager
8) 验证
验证格式
Hdfs:namenode:50070 hadoop01:50070
Yarn:resourcemanager:8088 hadoop03:8088
验证:
http://192.168.2.101:50070 hdfs的web网页
http://192.168.2.103:8088 yarn的web网页
高可用模式
安装过程中的问题
1.查看集群日志
/home/hadoop/apps/hadoop-2.7.6/logs 存放集群的日志信息
日志名称解释:
hadoop(进程归属)-hadoop(用户名)-datanode(进程名)-hadoop01(节点).log
yarn-hadoop-nodemanager-hadoop01.log
以.log结尾的是启动日志;
以.out结尾的是退出日志;
日志监听:
tail -f 文件路径
tail -f/F yarn-hadoop-nodemanager-hadoop01.log
tail -100 yarn-hadoop-nodemanager-hadoop01.log 查看当前日志末尾100行信息
看集群是否有问题,最核心的是看日志文件。日志文件不报错,肯定没有问题
如何判断进程启动成功:(看启动日志)
监听顺序:
stop-dfs.sh
tail -f hadoop-hadoop-datanode-hadoop01.log(在hadoop01上监听)
start-dfs.sh 先监听,再开启(在另一台hadoop01上开启)
想看集群是否有问题,集群启动完毕,只需看日志文件的末尾100行
tail -100 yarn-hadoop-nodemanager-hadoop01.log
结果不报错,那么启动成功
2.主机名
日志文件出现错误:unknown hostname
/etc/sysconfig/network
/etc/hosts
3.启动的时候某一个进程启动不了(jps查看进程)
先检查日志文件有没有报错。日志文件报错,排除错误后重新启动;日志文件没有报错,集群没问题,有可能是通信问题
方式1)先把集群全部停掉 重启 (暴力方式)
stop-dfs.sh
start-dfs.sh
方式2)缺哪一个进程 ,单独启动哪个进程
如果缺hdfs的相关进程,单独启动的命令:(启动程序都在sbin/下)
命令:hadoop-daemon.sh start 单独启动hdfs的相关命令的进程
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
命令:yarn的相关命令,单独启动的命令:(启动程序都在sbin/下)
yarn-daemon.sh start yarn 单独启动yarn的相关命令
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
单独启动的命令:哪个节点上缺,就在哪一个节点上执行
4.格式化的问题
成功的格式化只能进行一次,如果不成功,一直努力,直到成功。把集群恢复到最初搭建好的状态,再格式化。
hdfs的格式化在做什么事情:(hadoop namenode -format)
创建namenode的数据存储目录 ,生成最初的元数据(主节点上的namenode)
/home/hadoop/data/hadoopdata/name/current/ ls
集群最初的元数据信息:fsimage_0000000000000000000 fsimage_0000000000000000000.md5 seen_txid VERSION
在这个元数据中有一个重要的信息:VERSION----记录的是集群当前的版本号,每次格式化一次都会生成一个全新的
cat VERSION 内容如下:
namespaceID=163052539
clusterID=CID-e10d7808-c7ea-48b6-832c-05801cad0b9f 集群的id
同一个集群这个值一定是相同的
cTime=0 创建时间
storageType=NAME_NODE 存储类型
blockpoolID=BP-54673466-192.168.40.201-1531445892504 块池id
layoutVersion=-63
datanode的目录结构是在集群启动的过程中自动创建的:(start-dfs.sh)
集群启动的过程中自动创建datanode的目录结构:/home/hadoop/data 创建data
/home/hadoop/data/hadoopdata/data/current
/home/hadoop/data/hadoopdata/data/in_use.lock
current:datanode的信息
in_use.lock:锁文件,标志这个节点上启动了一个datanode进程,如果再启动另外一个就不允许启动。
目的:保证一个节点启动一个datanode进程
在/home/hadoop/data/hadoopdata/data/current下ls
cat VERSION Datanode的VERSION信息
storageID=DS-34cc3c93-efa6-41a5-9c30-0ba20c3a6982
clusterID=CID-e10d7808-c7ea-48b6-832c-05801cad0b9f 集群id
cTime=0
datanodeUuid=e215a9f5-9a6c-4f9f-b029-fc32b7f3733b
storageType=DATA_NODE
layoutVersion=-56
如果成功格式化之后启动了集群后又进行格式化,namenode的集群id信息会发生改变,datanode记录的集群id还是原来的,这时候就会造成datanode、namenode启动不了
集群关闭的命令:(把集群恢复到最初搭建好的状态)
stop-dfs.sh 在任意一个节点执行都行
stop-yarn.sh 在yarn的主节点上执行,否则会造成resourceManager关不了
5.时间同步问题
机器不能联网:
手动进行同步
date -s ""
能联网的时候:
外部的时间服务器、自己搭建时间服务器
ntpdate "时间同步器的网址"
目的:是为了和北京时间保持一致吗?不是
是为了集群中各个节点之间的时间保持一致,集群中的各个节点需要通信,时间戳
6.环境变量的配置
/etc/profile
~/.bash_profile
~/.bashrc
加载顺序:
系统的环境变量 -> ~/.bash_profile -> ~/.bashrc
生效顺序:
最后加载的最终生效
ps:在hadoop中 每个节点的自身的数据存储在自己的节点上