Hadoop概述与安装配置

大数据介绍

大数据的由来

大数据

  • 随着计算机技术的发展,互联网的普及,信息的积累已经到了一个非常庞大的地步,信息的增长也在不断的加快,随着互联网、物联网建设的加快,信息更是爆炸是增长,收集、检索、统计这些信息越发困难,必须使用新的技术来解决这些问题

什么是大数据

  • 大数据的定义
  • 大数据指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产
  • 是指从各种各样类型的数据中,快速获得有价值的信息

大数据能做什么

  • 企业组织利用相关数据分析帮助他们降低成本、提高效率、开发新产品、做出更明智的业务决策等
  • 把数据集合并后进行分析得出的信息和数据关系性,用来察觉商业趋势、判定研究质量、避免疾病扩散、打击犯罪或测定即时交通路况等
  • 大规模并行处理数据库,数据挖掘电网,分布式文件系统或数据库,云计算平和可扩展的存储系统等
大数据特性

在这里插入图片描述

大数据的5V特性是什么?
(V)olume (大体量)
可从数百TB到数十数百PB、甚至EB的规模

  • (V)ariety(多样性)
    大数据包括各种格式和形态的数据
  • (V)elocity(时效性)
    很多大数据需要在一定的时间限度下得到及时处理
  • (V)eracity(准确性)
    处理的结果要保证一定的准确性
  • (V)alue(大价值)
    大数据包含很多深度的价值,大数据分析挖掘和利用将带来巨大的商业价值
大数据与Hadoop

Hadoop是什么

  • Hadoop是一种分析和处理海量数据的软件平台
  • Hadoop是一款开源软件,使用JAVA开发
  • Hadoop可以提供一个分布式基础架构
    Hadoop特点
  • 高可靠性、高扩展性、高效性、高容错性、低成本
Hadoop历史起源
  • 2003年开始Google陆续发表了3篇论文
    GFS,MapReduce,BigTable

GFS

  • GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用
  • 可以运行于廉价的普通硬件上,提供容错功能

MapReduce

  • MapReduce是针对分布式并行计算的一套编程模型,由Map和Reduce组成,Map是映射,把指令分发到多个worker上,Reduce是规约,把worker计算出的结果合并

BigTable

  • BigTable是存储结构化数据

  • BigTable建立在GFS,Scheduler,Lock Service和MapReduce之上

  • 每个Table都是一个多维的稀疏图

  • GFS、MapReduce和BigTable三大技术被称为Google的三驾马车,虽然没有公布源码,但发布了这三个产品的详细设计论

  • Yahoo资助的Hadoop,是按照这三篇论文的开源Java实现的,但在性能上Hadoop比Google要差很多

  • GFS - - -> HDFS

  • MapReduce - - -> MapReduce

  • BigTable - - -> Hbase

Hadoop组件

Hadoop常用组件
  • HDFS:Hadoop分布式文件系统(核心组件)
  • MapReduce:分布式计算框架(核心组件)
  • Yarn:集群资源管理系统(核心组件)
  • Zookeeper:分布式协作服务
  • Hbase:分布式列存数据库
  • Hive:基于Hadoop的数据仓库
  • Sqoop:数据同步工具
  • Pig:基于Hadoop的数据流系统
  • Mahout:数据挖掘算法库
  • Flume:日志收集工具
Hadoop核心组件

在这里插入图片描述

Hadoop生态系统

在这里插入图片描述

HDFS结构

在这里插入图片描述

HDFS角色及概念
  • Hadoop体系中数据存储管理的基础,是一个高度容错的系统,用于在低成本的通用硬件上运行

角色和概念

  • Client
  • Namenode
  • Secondarynode
  • Datanode

NameNode

  • Master节点,管理HDFS的名称空间和数据块映射信息,配置副本策略,处理所有客户端请求
    Secondary NameNode
  • 定期合并fsimage 和fsedits,推送给NameNode
  • 紧急情况下,可辅助恢复NameNode

但Secondary NameNode并非NameNode的热备

DataNode

  • 数据存储节点,存储实际的数据
  • 汇报存储信息给NameNode

Client

  • 切分文件
  • 访问HDFS
  • 与NameNode交互,获取文件位置信息
  • 与DataNode交互,读取和写入数据

Block

  • 每块缺省128MB大小
  • 每块可以多个副本
MapReduce结构

在这里插入图片描述

MapReduce角色及概念

  • 源自于Google的MapReduce论文,JAVA实现的分布式计算框架

角色和概念

  • JobTracker
  • TaskTracker
  • Map Task
  • Reducer Task

JobTracker

  • Master节点只有一个
  • 管理所有作业/任务的监控、错误处理等
  • 将任务分解成一系列任务,并分派给TaskTracker

TaskTracker

  • Slave节点,一般是多台
  • 运行Map Task和Reduce Task
  • 并与JobTracker交互,汇报任务状态
  • Map Task:解析每条数据记录,传递给用户编写的map()并执行,将输出结果写入本地磁盘
  • 如果为map-only作业,直接写入HDFS
  • Reducer Task:从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行
Yarn结构

在这里插入图片描述
Yarn角色及概念

  • Yarn是Hadoop的一个通用的资源管理系统

Yarn角色

  • Resourcemanager
  • Nodemanager
  • ApplicationMaster
  • Container
  • Client

ResourceManager

  • 处理客户端请求
  • 启动/监控ApplicationMaster
  • 监控NodeManager
  • 资源分配与调度

NodeManager

  • 单个节点上的资源管理
  • 处理来自ResourceManager的命令
  • 处理来自ApplicationMaster的命令

Container

  • 对任务运行行环境的抽象,封装了CPU 、内存等
  • 多维资源以及环境变量、启动命令等任务运行相关的信息资源分配与调度

ApplicationMaster

  • 数据切分
  • 为应用程序申请资源,并分配给内部任务
  • 任务监控与容错

Client

  • 用户与Yarn交互的客户端程序
  • 提交应用程序、监控应用程序状态,杀死应用程序等

Yarn的核心思想
将JobTracker和TaskTacker进行分离,它由下面几大构成组件

  • ResourceManager一个全局的资源管理器
  • NodeManager每个节点(RM)代理
  • ApplicationMaster表示每个应用
  • 每一个ApplicationMaster有多个Container在NodeManager上运行

Hadoop介绍

Hadoop模式
Hadoop的部署模式有三种
  • 单机
  • 伪分布式
  • 完全分布式

单机模式
Hadoop的单机模式安装非常简单

  • 获取软件
    http://hadoop.apache.org
  • 安装配置Java环境,安装jps工具
    安装Openjdk和Openjdk-devel
  • 设置环境变量,启动运行
  • hadoop-env.sh
    JAVA_HOME=“JAVA安装路径”
    HADOOP_CONF_DIR=“hadoop配置文件路径”

Hadoop的单机模式安装很简单,只需配置好环境变量即可运行,这个模式一般用来学习和测试Hadoop的功能

测试 — 统计词频

# cd /usr/local/hadoop
# mkdir input
# cp *.txt input/
# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input output

(1)部署虚拟机192.168.1.70(had-node1),修改/etc/hosts的本地域名解析
[root@had-node1 ~]# yum -y install java-1.8.0-openjdk-devel
(2)解压本地安装包,修改属主属组

[root@had-node1 ~]# tar -xf hadoop/hadoop-2.7.7.tar.gz
[root@had-node1 ~]# chown -R root:root hadoop-2.7.7/
[root@had-node1 ~]# mv hadoop-2.7.7/ /usr/local/hadoop

(3)修改hadoop配置文件,指定openjdk的路径以及hadoop配置文件路径

查看openjdk的文件路径

[root@had-node1 ~]# rpm -ql java-1.8.0-openjdk
[root@had-node1 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@had-node1 hadoop]# vim hadoop-env.sh

...	...
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre"
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
...	...

(4)查看hadoop版本

[root@had-node1 hadoop]# /usr/local/hadoop/bin/hadoop version

(5)简单分析,统计input文件夹下的txt文件内的单词出现的次数

[root@had-node1 hadoop]# mkdir input
[root@had-node1 hadoop]# cp *.txt input/

(6)将input文件夹内统计的数据输出到output文件夹

[root@had-node1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input/ output

伪分布式

  • 伪分布式的安装和完全分布式类似,区别是所有角色安装在一台机器上,使用本地磁盘,一般生产环境都会使用完全分布式,伪分布式一般是用来学习和测试Hadoop的功能
  • 伪分布式的配置和完全分布式配置类似

Hadoop配置文件及格式
文件格式

  • Hadoop-env.sh
    JAVA_HOME
    HADOOP_CONF_DIR
  • xml文件配置格式
<property>
  <name>关键字</name>
  <value>变量值</value>
  <description> 描述 </description>
</property>
HDFS

完全分布式

  • 系统规划
主机角色软件
192.168.1.70(had-node1)NameNode,SecondaryNameNodeHDFS
192.168.1.71(had-node2)DataNodeHDFS
192.168.1.72(had-node3)DataNodeHDFS
192.168.1.73(had-node4)DataNodeHDFS

搭建完全分布式

基础环境准备

  • 新开启3台虚拟机
  • 禁用 selinux
    SELINUX=disabled
  • 禁用 firewalld
# systemctl stop firewalld
# systemctl mask firewalld
安装 java-1.8.0-openjdk-devel
# yum install -y java-1.8.0-openjdk-devel
基础环境准备
  • 在3台机器上配置/etc/hosts
  • 注意:所有主机都能ping通namenode的主机名,namenode能ping通所有节点
  • java -version 验证java安装
  • jps 验证角色
配置SSH信任关系(NameNode)
  • 注意:不能出现要求输入yes的情况,每台机器都要能登录成功,包括本机!!!
  • /etc/ssh/ssh_config
    StrictHostKeyChecking no
# ssh-keygen
# ssh-copy-id 192.168.1.X

(1)配置192.168.1.70(had-node1)~192.168.1.73(had-node3),本地域名解析

[root@had-node1 ~]# cat /etc/hosts

...	...
192.168.1.70 had-node1
192.168.1.71 had-node2
192.168.1.72 had-node3
192.168.1.73 had-node4

(2)安装java-1.8.0-openjdk-devel,并将本地hadoop拷贝到/usr/local/hadoop,以70为例

[root@had-node1 ~]# yum -y install java-1.8.0-openjdk-devel
[root@had-node2 ~]# tar -xf hadoop/hadoop-2.7.7.tar.gz 
[root@had-node2 ~]# mv hadoop-2.7.7/   /usr/local/hadoop

(3)配置had-node1可以ssh无密码登录其他主机,包括自己

[root@had-node1 ~]# ssh-keygen
[root@had-node1 ~]# for i in `seq 70 73`
> do
> ssh-copy-id 192.168.1.$i
> done
HDFS完全分布式系统配置
  • 环境配置文件:hadoop-env.sh
  • 核心配置文件:core-site.xml
  • HDFS配置文件:hdfs-site.xml
  • 节点配置文件:slaves

环境配置文件hadoop-env.sh

  • OpenJDK的安装目录:JAVA_HOME
  • Hadoop配置文件的存放目录:HADOOP_CONF_DIR

核心配置文件 core-site.xml

  • fs.defaultFS:文件系统配置参数
  • hadoop.tmp.dir:数据目录配置参数
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>

(4)配置hadoop-env.sh,core-site.xml

[root@had-node1 hadoop]# vim hadoop-env.sh

...	...
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre"
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
...	...

[root@had-node1 hadoop]# vim etc/hadoop/core-site.xml

...	...
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://had-node1:9000</value>    
  </property>
  <property>
   <name>hadoop.tmp.dir</name>
   <value>/var/hadoop</value>
  </property>
</configuration>
...	...

[root@had-node1 ~]# mkdir /var/hadoop/		//创建数据存放目录

[root@had-node1 ~]# cd /usr/local/hadoop/etc/hadoop/

HDFS配置文件hdfs-site.xml

  • Namenode:地址声明
    dfs.namenode.http-address
  • Secondarynamenode:地址声明
    dfs.namenode.secondary.http-address
  • 文件冗余份数
    dfs.replication

(5)配置hdfs-site.xml

[root@had-node1 hadoop]# vim hdfs-site.xml 
...	...
<configuration>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>had-node1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>had-node1:50090</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>3</value>		//一份数据存储三份
  </property>
</configuration>
...	...

(6)配置集群节点

[root@had-node1 hadoop]# vim slaves

had-node2
had-node3
had-node4
  • 同步配置
  • Hadoop所有节点的配置参数完全一样,在一台配置好后,把配置文件同步到其它所有主机上

(7)同步所有配置
四台机器都要创建/var/hadoop目录

[root@had-node1 ~]# for i in `seq 3`; do scp -r /usr/local/hadoop/* root@192.168.1.7$i:/usr/local/hadoop/; done	//同步所有配置
[root@had-node1 ~]# cd /usr/local/hadoop/
[root@had-node1 hadoop]# ./bin/hdfs namenode -format		//在namenode上执行格式化操作
[root@had-node1 hadoop]# ./sbin/start-dfs.sh				//启动集群
[root@had-node1 hadoop]# bin/hdfs dfsadmin -report		//节点验证

JPS验证角色

  • NameNode验证
[root@had-node1 ~]# jps
25152 SecondaryNameNode
25383 Jps
24969 NameNode
  • DataNode验证
[root@had-node2 ~]# jps
23552 DataNode
23645 Jps
问题现象
  • 节点DataNode已经启动,但是节点信息读不出来

原因分析

  • namenode上面/etc/hosts没有配置主机名信息,导致启动了安全模式

解决方案

  • 启动 datanode,确保服务正常没有问题,与 namenode通讯正常
  • 关闭安全模式,在 namenode 上
    ./bin/hdfs dfsadmin -safemode leave
安装与部署

Hadoop三大核心组件

  • 分布式文件系统
  • HDFS已经部署完毕
  • 分布式计算框架
  • MapReduce
  • 集群资源管理
  • yarn

系统规划

主机角色软件
192.168.1.70(had-node1)NameNode,SecondaryNameNode,ResourceManagerHDFS.YARN
192.168.1.71(had-node2)DataNode,NodeManagerHDFS,YARN
192.168.1.72(had-node3)DataNode,NodeManagerHDFS,YARN
192.168.1.73(had-node4)DataNode,NodeManagerHDFS,YARN
mapred部署

分布式计算框架mapred-site.xml

  • 改名
    FROM:mapred-site.xml.template
    To:mapred-site.xml
  • 资源管理类
    mapreduce.framework.name

分布式计算框架mapred-site.xml

  • 只支持local和yarn两种
  • 单机使用local
  • 集群使用yarn
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

//修改mapred配置文件

[root@had-node1 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@had-node1 hadoop]# vim mapred-site.xml
...	...
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>
yarn部署

资源管理yarn-site.xml

  • resourcemanager 地址
    yarn.resourcemanager.hostname
  • nodemanager 使用哪个计算框架
    yarn.nodemanager.aux-services
  • mapreduce_shuffle 计算框架的名称
    mapreduce_shuffle

修改yarn配置文件

[root@had-node1 hadoop]# vim yarn-site.xml 

...	...
<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>had-node1</value>		//计算节点
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>		//使用的计算框架的名称
  </property>
</configuration>

其他节点同步数据

[root@had-node1 ~]# for i in `seq 71 73`
> do
> rsync -av --delete /usr/local/hadoop/etc/hadoop/  192.168.1.$i:/usr/local/hadoop/etc/hadoop/
> done

启动服务
# /usr/local/hadoop/sbin/start-yarn.sh

验证服务
jps 和 ./bin/yarn node -list

[root@had-node1 ~]# /usr/local/hadoop/sbin/start-yarn.sh
[root@had-node1 ~]# /usr/local/hadoop/bin/yarn node -list

19/06/21 09:45:03 INFO client.RMProxy: Connecting to ResourceManager at had-node1/192.168.1.70:8032
Total Nodes:3
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
 had-node3:36671	        RUNNING	   had-node3:8042	                           0
 had-node2:34162	        RUNNING	   had-node2:8042	                           0
 had-node4:44559	        RUNNING	   had-node4:8042	                           0
Web访问Hadoop

使用Web访问Hadoop

  • namenode web页面(had-node1)
    # http://192.168.1.70:50070/
  • secondory namenode web 页面(had-node1)
    # http://192.168.1.70:50090/
  • datanode web 页面(had-node2,had-node3,had-node4)
    # http://192.168.1.71:50075/
  • resourcemanager web页面(had-node1)
    # http://192.168.1.70:8088/
  • nodemanager web页面(had-node2,had-node3,had-node4)
    # http://192.168.1.71:8042/

HDFS基本使用

HDFS基本命令
# ./bin/hadoop fs -ls /

  • 对应shell命令
    # ls /
    # ./bin/hadoop fs -mkdir /abc
  • 对应shell命令
    # mkdir /abc
[root@had-node1 hadoop]# ./bin/hadoop fs -ls /
[root@had-node1 hadoop]# ./bin/hadoop fs -mkdir /abc
[root@had-node1 hadoop]# ./bin/hadoop fs -ls /

# ./bin/hadoop fs -touchz /urfile

  • 对应shell命令

# touch /urfile

[root@had-node1 hadoop]# ./bin/hadoop fs -touchz /urfile

上传文件
# ./bin/hadoop fs -put localfile /remotefile

将当前路径下的txt文件上传到hadoop的abc目录下

[root@had-node1 hadoop]# ./bin/hadoop fs -put ./*.txt /abc/

下载文件

# ./bin/hadoop fs -get /remotefile

将hadoop集群上的文件下载到本地当前目录下

[root@had-node1 hadoop]# ./bin/hadoop fs -get /urfile

删除abc文件夹

[root@had-node1 hadoop]# ./bin/hadoop fs -rm -r -f /abc

创建分析用文件夹input,并将分析文件上传到该文件夹

[root@had-node1 hadoop]# ./bin/hadoop fs -mkdir /input
[root@had-node1 hadoop]# ./bin/hadoop fs -put *.txt /input/

提交分析文件

[root@had-node1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output

查看结果

[root@had-node1 hadoop]# ./bin/hadoop fs -cat /output/part-r-00000

HDFS节点管理

增加节点

HDFS增加结点

  • 启动一个新的系统,设置SSH免密码登录
  • 在所有节点修改 /etc/hosts,增加新节点的主机信息
  • 安装java运行环境(java-1.8.0-openjdk-devel)
  • 修改NameNode的slaves文件增加该节点
  • 拷贝NamNode的/usr/local/hadoop到本机
  • 在该节点启动DataNode
    ./sbin/hadoop-daemon.sh start datanode

配置一台新机器192.168.1.74(had-node4)

(1)had-node4安装jdk环境

[root@had-node5 ~]# yum -y install java-1.8.0-openjdk-devel

(2)修改namenode(had-node1)节点的本地hosts解析,修改namenode节点可以无密码ssh登录had-node5,并讲hosts文件同步到所有的节点

[root@had-node1 ~]# vim /etc/hosts
...	...
192.168.1.70 had-node1
192.168.1.71 had-node2
192.168.1.72 had-node3
192.168.1.73 had-node4
192.168.1.74 had-node5

[root@had-node1 ~]# ssh-copy-id 192.168.1.74

[root@had-node1 ~]# for i in {71..74}
> do
> rsync -av --delete /etc/hosts 192.168.1.$i:/etc/hosts
> done

(3)修改namenode的slaves配置文件增加新节点

[root@had-node1 ~]# vim /usr/local/hadoop/etc/hadoop/slaves
had-node2
had-node3
had-node4
had-node5

(4)将hadoop同步到所有节点

[root@had-node1 ~]#  for i in {71..74}; do rsync -av --delete /usr/local/  192.168.1.$i:/usr/local/hadoop; done

(5)启动该节点

[root@had-node5 ~]# cd /usr/local/hadoop/
[root@had-node5 hadoop]# ./sbin/hadoop-daemon.sh start datanode

(6)设置同步带宽,并同步数据

[root@had-node1 ~]# cd /usr/local/hadoop/
[root@had-node1 hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 50000000
[root@had-node1 hadoop]# ./sbin/start-balancer.sh

(7)查看节点

[root@had-node1 hadoop]# bin/hdfs dfsadmin -report
修复节点

HDFS修复节点

  • 修复节点比较简单,与增加节点基本一致
  • 注意:新节点的ip和主机名要与损坏节点的一致
  • 启动服务
    # ./sbin/hadoop-daemon.sh start datanode
  • 数据恢复是自动的
  • 上线以后会自动恢复数据,如果数据量非常巨大,可能需要一定的时间
删除节点

HDFS删除节点

  • 配置NameNode的hdfs-site.xml
  • 增加dfs.hosts.exclude配置
<property>
  <name>dfs.hosts.exclude</name>
  <value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property
  • 增加exclude配置文件,写入要删除的节点主机名
  • 更新数据
    # ./bin/hdfs dfsadmin -refreshNodes

HDFS删除节点状态

  • 查看状态
    # ./bin/hdfs dfsadmin -report
  • Normal:正常状态
  • Decommissioned in Program:数据正在迁移
  • Decommissioned:数据迁移完成
  • 注意:仅当状态变成Decommissioned才能down机下线

下线had-node5

(1)编辑hdfs-site文件,添加下线节点配置文件

[root@had-node1 hadoop]# vim hdfs-site.xml 
<configuration>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>had-node1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>had-node1:50090</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/exclude</value>
  </property>
</configuration>

(2)编辑下线节点配置文件

[root@had-node1 hadoop]# vim exclude
had-node5

(3)刷新节点

[root@had-node1 hadoop]# ./bin/hdfs dfsadmin -refreshNodes

(4)查看节点状态

[root@had-node1 hadoop]# ./bin/hdfs dfsadmin -report

...	...
Name: 192.168.1.74:50010 (had-node5)
Hostname: had-node5
Decommission Status : Decommissioned		//数据迁移完成
...	...

yarn节点管理

yarn的相关操作

  • 由于Hadoop在2.x引入了yarn框架,对于计算节点的操作已经变得非常简单
  • 增加节点
    # sbin/yarn-daemon.sh start nodemanager
  • 删除节点
    # sbin/yarn-daemon.sh stop nodemanager

删除节点后需要剔除namenode中salves文件中的该节点的主机名,并同步给其他主机节点

  • 查看节点 (ResourceManager)
    # ./bin/yarn node -list

  • yarn的系统环境配置与HDFS的基础环境配置是相同的,这里不再重复列出

  • 由于yarn不包含数据,所以在增加删除修复节点的时候比较简单,HDFS要注意数据安全

NFS网关

NFS 网关用途

  • 用户可以通过操作系统兼容的本地NFSv3客户端来浏览HDFS文件系统
  • 用户可以从HDFS文件系统下载文档到本地文件系统
  • 用户可以通过挂载点直接流化数据,支持文件附加,但是不支持随机写
  • NFS网关支持NFSv3和允许HDFS作为客户端文件系统的一部分被挂载

特性

  • HDFS超级用户是与NameNode进程本身具有相同标识的用户,超级用户可以执行任何操作,因为权限检查永远不会认为超级用户失败

注意事项

  • 在非安全模式下,运行网关进程的用户是代理用户
  • 在安全模式下,Kerberos keytab中的用户是代理用户

配置用户
配置代理用户

  • 在NameNode和NFSGW上添加代理用户
  • 代理用户的UID,GID,用户名必须完全相同
  • 如果因特殊原因客户端的用户和NFS网关的用户UID不能保持一致,需要我们配置nfs.map的静态映射关系
  • nfs.map
    uid 10 100 # Map the remote UID 10 the local UID 100
    gid 11 101 # Map the remote GID 11 to the local GID 101

配置用户
在 namenode(nn01)上添加用户和组

  • groupadd -g 800 nfsuser
  • useradd -u 800 -g 800 -r -d /var/hadoop nfsuser

在 nfs 网关服务器也同样执行以上两条命令

准备两台主机192.168.1.76(had-nfs-gw),192.168.1.75(had-client)

(1)安装java-1.8.0-openjdk-devel

[root@had-nfsgw ~]# yum -y install java-1.8.0-openjdk-devel

(2)修改namenode节点的hosts文件并同步到全部节点

[root@had-node1 ~]# vim /etc/hosts
...	...
192.168.1.70 had-node1
192.168.1.71 had-node2
192.168.1.72 had-node3
192.168.1.73 had-node4
192.168.1.74 had-node5
192.168.1.75 had-client
192.168.1.76 had-nfsgw

[root@had-node1 ~]# for i in {71..76}
> do
> scp /etc/hosts root@192.168.1.$i:/etc/hosts
> done

(3)在namenode节点(had-node1)跟had-nfsgw上添加指定用户跟组

[root@had-node1 ~]# groupadd -g 800 nfsuser
[root@had-node1 ~]# useradd -u 800 -g 800 -r -d /var/hadoop/ nfsuser
[root@had-nfsgw ~]# mkdir /var/hadoop
[root@had-nfsgw ~]# groupadd -g 800 nfsuser
[root@had-nfsgw ~]# useradd -u 800 -g 800 -r -d /var/hadoop/ nfsuser

配置core-site.xml
核心配置core-site.xml
hadoop.proxyuser.{代理用户}.groups
hadoop.proxyuser.{代理用户}.hosts

  • 这里的{代理用户}是主机上真实运行的nfs3的用户
  • 在非安全模式下,运行nfs网关的用户为代理用户
  • groups为挂载点用户所使用的组
  • hosts为挂载点主机地址

核心配置core-site.xml

... ...
<property>
<name>hadoop.proxyuser.nfsuser.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.nfsuser.hosts</name>
<value>*</value>
</property>
... ...

配置步骤

  • 停止集群所有服务
    # ./sbin/stop-all.sh
  • 同步配置文件到所有主机
  • 启动 hdfs
    # ./sbin/start-dfs.s

(4)停止集群

[root@had-node1 ~]# cd /usr/local/hadoop/
[root@had-node1 hadoop]# ./sbin/stop-all.sh 

(5)修改配置文件

[root@had-node1 hadoop]# vim etc/hadoop/core-site.xml 
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://had-node1:9000</value>
  </property>
  <property>
   <name>hadoop.tmp.dir</name>
   <value>/var/hadoop</value>
  </property>
  <property>
    <name>hadoop.proxyuser.nfsuser.groups</name>		//组授权
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.nfsuser.hosts</name>		//主机授权
    <value>*</value>
</property>
</configuration>

(6)给所有datanode节点同步配置文件

[root@had-node1 ~]# for i in {71..73}
> do
> rsync -av --delete /usr/local/hadoop root@192.168.1.$i:/usr/local/
> done

(7)启动集群并查看集群节点

[root@had-node1 ~]# /usr/local/hadoop/sbin/start-dfs.sh
[root@had-node1 ~]# /usr/local/hadoop/bin/hdfs dfsadmin -report

NFSGW配置

配置步骤

  • 启动一个新的系统,卸载rpcbind 、nfs-utils
  • 配置/etc/hosts,添加所有NameNode和DataNode的主机名与ip对应关系
  • 安装JAVA运行环境(java-1.8.0-openjdk-devel)
  • 同步NameNode的/usr/local/hadoop到本机
  • 配置hdfs-site.xml
  • 启动服务

配置hdfs-site.xml

  • 配置文件hdfs-site.xml

  • nfs.exports.allowed.hosts

  • 默认情况下,export可以被任何客户端挂载。为了更好的控制访问,可以设置属性。值和字符串对应机器名和访问策略,通过空格来分割。机器名的格式可以是单一的主机、Java的正则表达式或者IPv4地址

  • 使用rw或ro可以指定导出目录的读写或只读权限。如果访问策略没被提供,默认为只读。每个条目使用";"来分割

hdfs-site.xml配置

  • nfs.exports.allowed.hosts
  • 配置 * rw
... ...
<property>
  <name>nfs.exports.allowed.hosts</name>
  <value>* rw</value>
</property>
... ...

nfs.dump.dir

  • 用户需要更新文件转储目录参数。NFS客户端经常重新安排写操作,顺序的写操作会随机到达NFS网关。这个目录常用于临时存储无序的写操作。对于每个文件,无序的写操作会在他们积累在内存中超过一定阈值(如,1M)时被转储。需要确保有足够的空间的目录
  • 如:应用上传10个100M,那么这个转储目录推荐1GB左右的空间,以便每个文件都发生最坏的情况。只有NFS网关需要在设置该属性后重启

配置文件hdfs-site.xml

  • nfs.dump.dir
... ...
<property>
  <name>nfs.dump.dir</name>
  <value>/var/nfstmp</value>
</property>
... ...
  • 配置完该属性后要创建/var/nfstmp文件夹
    # mkdir /var/nfstmp
    # chown nfsuser.nfsuser /var/nfstmp
  • 并且把该文件夹的属组改成代理用户

(1)修改配置文件,指定目录的读写权限跟本地临时存储目录

[root@had-nfsgw ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>had-node1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>had-node1:50090</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/exclude</value>
  </property>
  <property>
    <name>nfs.exports.allowed.hosts</name>
    <value>* rw</value>		//指定读写属性
  </property>
  <property>
    <name>nfs.dump.dir</name>
    <value>/var/nfstmp</value>		//临时缓存目录
  </property>
</configuration>

(2)创建缓存目录并指定属主属组

[root@had-nfsgw ~]# mkdir /var/nfstmp
[root@had-nfsgw ~]# chown nfsuser.nfsuser /var/nfstmp

NFS启动与挂载

启动与挂载

  • 设置/usr/local/hadoop/logs权限,为代理用户赋予读写执行的权限
    # setfacl -m user:nfsuser:rwx /usr/local/hadoop/logs
  • 使用root用户启动portmap服务
    # ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
  • 使用代理用户启动nfs3
    # sudo -u nfsuser ./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3

警告

  • 启动portmap需要使用root用户
  • 启动nfs3需要使用core-site里面设置的代理用户
  • 必须先启动portmap之后再启动nfs3
  • 如果portmap重启了,在重启之后nfs3也需要重启

(3)设置nfsuser对hadoop->logs的acl权限

[root@had-nfsgw ~]# setfacl -m u:nfsuser:rwx /usr/local/hadoop/logs/

(4)启动portmap跟nfs3

[root@had-nfsgw ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh --script /usr/local/hadoop/bin/hdfs start portmap

[root@had-nfsgw ~]# sudo -u nfsuser /usr/local/hadoop/sbin/hadoop-daemon.sh --script /usr/local/hadoop/bin/hdfs start nfs3

[root@had-nfsgw ~]# jps

启动与挂载

  • 目前NFS只能使用v3版本
    vers=3

  • 仅使用TCP作为传输协议
    proto=tcp

  • 不支持NLM
    nolock

  • 禁用access time的时间更新
    noatime

  • 禁用acl扩展权限
    noacl

  • 强烈建议使用安装选项sync,它可以最小化避免重排序写入造成不可预测的吞吐量,未指定同步选项可能会导致上传大文件时出现不可靠行为

  • 启动一台机器并安装nfs-utils
    yum install nfs-utils

  • 挂载nfs
    # mount -t nfs -o vers=3,proto=tcp,noatime,nolock,sync,noacl 192.168.1.65:/ /mnt/

(5)客户端挂载

[root@had-client ~]# yum -y install nfs-utils
[root@had-client ~]# mount -t nfs -o vers=3,proto=tcp,noatime,nolock,sync,noacl 192.168.1.76:/ /mnt/
[root@had-client ~]# ls /mnt/
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值