大数据介绍
大数据的由来
大数据
- 随着计算机技术的发展,互联网的普及,信息的积累已经到了一个非常庞大的地步,信息的增长也在不断的加快,随着互联网、物联网建设的加快,信息更是爆炸是增长,收集、检索、统计这些信息越发困难,必须使用新的技术来解决这些问题
什么是大数据
- 大数据的定义
- 大数据指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产
- 是指从各种各样类型的数据中,快速获得有价值的信息
大数据能做什么
- 企业组织利用相关数据分析帮助他们降低成本、提高效率、开发新产品、做出更明智的业务决策等
- 把数据集合并后进行分析得出的信息和数据关系性,用来察觉商业趋势、判定研究质量、避免疾病扩散、打击犯罪或测定即时交通路况等
- 大规模并行处理数据库,数据挖掘电网,分布式文件系统或数据库,云计算平和可扩展的存储系统等
大数据特性
大数据的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,SecondaryNameNode | HDFS |
192.168.1.71(had-node2) | DataNode | HDFS |
192.168.1.72(had-node3) | DataNode | HDFS |
192.168.1.73(had-node4) | DataNode | HDFS |
搭建完全分布式
基础环境准备
- 新开启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,ResourceManager | HDFS.YARN |
192.168.1.71(had-node2) | DataNode,NodeManager | HDFS,YARN |
192.168.1.72(had-node3) | DataNode,NodeManager | HDFS,YARN |
192.168.1.73(had-node4) | DataNode,NodeManager | HDFS,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/