大数据
什么是大数据
大数据能做什么
大数据的5V特性是什么?
(V)olume (大体量)
可从数百TB到数十数百PB、甚至EB的规模
Hadoop是什么
GFS
MapReduce
BigTable
BigTable是存储结构化数据
BigTable建立在GFS,Scheduler,Lock Service和MapReduce之上
每个Table都是一个多维的稀疏图
GFS、MapReduce和BigTable三大技术被称为Google的三驾马车,虽然没有公布源码,但发布了这三个产品的详细设计论
Yahoo资助的Hadoop,是按照这三篇论文的开源Java实现的,但在性能上Hadoop比Google要差很多
GFS - - -> HDFS
MapReduce - - -> MapReduce
BigTable - - -> Hbase
角色和概念
NameNode
但Secondary NameNode并非NameNode的热备
DataNode
Client
Block
MapReduce角色及概念
角色和概念
JobTracker
TaskTracker
Yarn角色
ResourceManager
NodeManager
Container
ApplicationMaster
Client
Yarn的核心思想
将JobTracker和TaskTacker进行分离,它由下面几大构成组件
单机模式
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配置文件及格式
文件格式
关键字
变量值
描述
完全分布式
主机 | 角色 | 软件 |
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 |
基础环境准备
# systemctl stop firewalld
# systemctl mask firewalld
安装 java-1.8.0-openjdk-devel
# yum install -y java-1.8.0-openjdk-devel
# 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
环境配置文件hadoop-env.sh
核心配置文件 core-site.xml
fs.defaultFS
hdfs://nn01:9000
hadoop.tmp.dir
/var/hadoop
(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
... ...
fs.defaultFS
hdfs://had-node1:9000
hadoop.tmp.dir
/var/hadoop
... ...
[root@had-node1 ~]# mkdir /var/hadoop/ //创建数据存放目录
[root@had-node1 ~]# cd /usr/local/hadoop/etc/hadoop/
HDFS配置文件hdfs-site.xml
(5)配置hdfs-site.xml
[root@had-node1 hadoop]# vim hdfs-site.xml
... ...
dfs.namenode.http-address
had-node1:50070
dfs.namenode.secondary.http-address
had-node1:50090
dfs.replication
3 //一份数据存储三份
... ...
(6)配置集群节点
[root@had-node1 hadoop]# vim slaves
had-node2
had-node3
had-node4
(7)同步所有配置
四台机器都要创建/var/hadoop目录
[root@had-node1 ~]# for i in `seq 3`; do scp -r /usr/local/hadoop/* [email protected]$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验证角色
[root@had-node1 ~]# jps
25152 SecondaryNameNode
25383 Jps
24969 NameNode
[root@had-node2 ~]# jps
23552 DataNode
23645 Jps
原因分析
解决方案
./bin/hdfs dfsadmin -safemode leave
Hadoop三大核心组件
系统规划
主机 | 角色 | 软件 |
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-site.xml
mapred-site.xml.template
mapred-site.xml
mapreduce.framework.name
分布式计算框架mapred-site.xml
mapreduce.framework.name
yarn
//修改mapred配置文件
[root@had-node1 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@had-node1 hadoop]# vim mapred-site.xml
... ...
mapreduce.framework.name
yarn
资源管理yarn-site.xml
yarn.resourcemanager.hostname
yarn.nodemanager.aux-services
mapreduce_shuffle
修改yarn配置文件
[root@had-node1 hadoop]# vim yarn-site.xml
... ...
yarn.resourcemanager.hostname
had-node1 //计算节点
yarn.nodemanager.aux-services
mapreduce_shuffle //使用的计算框架的名称
其他节点同步数据
[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
# http://192.168.1.70:50070/
# http://192.168.1.70:50090/
# http://192.168.1.71:50075/
# http://192.168.1.70:8088/
# http://192.168.1.71:8042/
HDFS基本命令
# ./bin/hadoop fs -ls /
# ls /
# ./bin/hadoop fs -mkdir /abc
# 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
# 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增加结点
./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修复节点
# ./sbin/hadoop-daemon.sh start datanode
HDFS删除节点
dfs.hosts.exclude
/usr/local/hadoop/etc/hadoop/exclude
# ./bin/hdfs dfsadmin -refreshNodes
HDFS删除节点状态
# ./bin/hdfs dfsadmin -report
下线had-node5
(1)编辑hdfs-site文件,添加下线节点配置文件
[root@had-node1 hadoop]# vim hdfs-site.xml
dfs.namenode.http-address
had-node1:50070
dfs.namenode.secondary.http-address
had-node1:50090
dfs.replication
2
dfs.hosts.exclude
/usr/local/hadoop/etc/hadoop/exclude
(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的相关操作
# sbin/yarn-daemon.sh start nodemanager
# sbin/yarn-daemon.sh stop nodemanager
删除节点后需要剔除namenode中salves文件中的该节点的主机名,并同步给其他主机节点
查看节点 (ResourceManager)
# ./bin/yarn node -list
yarn的系统环境配置与HDFS的基础环境配置是相同的,这里不再重复列出
由于yarn不包含数据,所以在增加删除修复节点的时候比较简单,HDFS要注意数据安全
NFS 网关用途
特性
注意事项
配置用户
配置代理用户
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)上添加用户和组
在 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 [email protected].$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
核心配置core-site.xml
... ...
hadoop.proxyuser.nfsuser.groups
*
hadoop.proxyuser.nfsuser.hosts
*
... ...
配置步骤
# ./sbin/stop-all.sh
# ./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
fs.defaultFS
hdfs://had-node1:9000
hadoop.tmp.dir
/var/hadoop
hadoop.proxyuser.nfsuser.groups //组授权
*
hadoop.proxyuser.nfsuser.hosts //主机授权
*
(6)给所有datanode节点同步配置文件
[root@had-node1 ~]# for i in {71..73}
> do
> rsync -av --delete /usr/local/hadoop [email protected].$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
配置步骤
配置hdfs-site.xml
配置文件hdfs-site.xml
nfs.exports.allowed.hosts
默认情况下,export可以被任何客户端挂载。为了更好的控制访问,可以设置属性。值和字符串对应机器名和访问策略,通过空格来分割。机器名的格式可以是单一的主机、Java的正则表达式或者IPv4地址
使用rw或ro可以指定导出目录的读写或只读权限。如果访问策略没被提供,默认为只读。每个条目使用";"来分割
hdfs-site.xml配置
... ...
nfs.exports.allowed.hosts
* rw
... ...
nfs.dump.dir
配置文件hdfs-site.xml
... ...
nfs.dump.dir
/var/nfstmp
... ...
# mkdir /var/nfstmp
# chown nfsuser.nfsuser /var/nfstmp
(1)修改配置文件,指定目录的读写权限跟本地临时存储目录
[root@had-nfsgw ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
dfs.namenode.http-address
had-node1:50070
dfs.namenode.secondary.http-address
had-node1:50090
dfs.replication
2
dfs.hosts.exclude
/usr/local/hadoop/etc/hadoop/exclude
nfs.exports.allowed.hosts
* rw //指定读写属性
nfs.dump.dir
/var/nfstmp //临时缓存目录
(2)创建缓存目录并指定属主属组
[root@had-nfsgw ~]# mkdir /var/nfstmp
[root@had-nfsgw ~]# chown nfsuser.nfsuser /var/nfstmp
启动与挂载
# setfacl -m user:nfsuser:rwx /usr/local/hadoop/logs
# ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
# sudo -u nfsuser ./sbin/hadoop-daemon.sh --script ./bin/hdfs start 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/