Hadoop#分布式存储HDFS集群的部署使用
分布式存储hdfs
一、Hadoop
1、简介
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,充分利用集群的威力进行高速运算和存储,Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),其中一个组件是HDFS,HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序
2、优点
高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++ 。
3、核心架构
Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心
HDFS
对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。这些节点包括 NameNode,它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中
NameNode
NameNode 是一个通常在 HDFS 实例中的机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。
DataNode
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件,DataNode 响应来自HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令
4、发行版本
Hadoop 三大发行版本: Apache、Cloudera、Hortonworks
Apache版本最原始(最基础)的版本,对于入门学习最好。
Cloudera在大型互联网企业中用的较多。 CDH
Hortonworks文档较好。 CDP
5、部署模式
单机(本地)模式:这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM上。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开发过程中运行MapReduce程序,这也是最少使用的一个模式
伪分布式模式:也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode等),伪分布式(Pseudo)适用于开发和测试环境,在这个模式中,所有守护进程都在同一台机器上运行
全分布式模式:全分布模式通常被用于生产环境,使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在每台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,以及tasktracker运行的主机。在分布式环境下,主节点和从节点会分开
二、集群部署
1、环境准备
四台服务器如下:
node-1:10.0.1.20
node-2:10.0.1.21
node-3:10.0.1.22
node-4:10.0.1.23
关闭防火墙,关闭selinux
2、本地解析(所有节点)
[[email protected] ~]# cat /etc/hosts
10.0.1.20 node-1
10.0.1.21 node-2
10.0.1.22 node-3
10.0.1.23 node-4
3、安装jdk环境(所有节点)
1.下载安装包
2.解压安装
[[email protected] ~]# tar xf jdk-9.0.1_linux-x64_bin.tar.gz -C /usr/local/
[[email protected] ~]# mv /usr/local/jdk-9.0.1/ /usr/java
[[email protected] ~]# vi /etc/profile
JAVA_HOME=/usr/java
PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:PATH
export JAVA_HOME PATH
[[email protected] ~]# source /etc/profile
[[email protected] ~]# java -version
java version “9.0.1”
Java™ SE Runtime Environment (build 9.0.1+11)
Java HotSpot™ 64-Bit Server VM (build 9.0.1+11, mixed mode
4、免密登录(所有节点)互相做免密,自己和自己也要做免密
[[email protected] ~]# ssh-******
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eLAtS5mKNQ9aPhakBEVHYBctZ3BqE8Bridiq8Nz9ubo [email protected]
The key’s randomart image is:
±–[RSA 2048]----+
|.+*+B+. |
| o.o.++ |
|.o.o=+. |
|o.=+ . B |
| o. * B S |
|o * B + |
|ooo.=.o |
|. o… . |
| E++. |
±—[SHA256]-----+
[[email protected] ~]# ssh-copy-id -i node-2
[[email protected] ~]# ssh-copy-id -i node-3
[[email protected] ~]# ssh-copy-id -i node-4
5、下载hadoop(所有节点)
[[email protected] ~]# wget http://mirror.bit.edu.cn/apache/hadoop/core/hadoop-3.3.0/hadoop-3.3.0.tar.gz
[[email protected] ~]# tar xf hadoop-3.3.0.tar.gz -C /opt/
[[email protected] ~]# mv /opt/hadoop-3.3.0/ /opt/hadoop
6、添加环境变量(所有节点)
[[email protected] ~]# vi ~/.bash_profile
PATH=
P
A
T
H
:
PATH:
PATH:HOME/bin:/opt/hadoop/bin
[[email protected] ~]# source ~/.bash_profile
[[email protected] ~]# hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4
This command was run using /opt/hadoop/share/hadoop/common/hadoop-common-3.3.0.jar
7、namenode节点部署(node-1)
创建对应的目录
[[email protected] ~]# mkdir -p /data/hdfs/{tmp,var,logs,dfs,data,name,checkpoint,edits}
修改配置文件
[[email protected] ~]# cat /opt/hadoop/etc/hadoop/core-site.xml
8、依次拷贝
[[email protected] ~]# scp -r /data/ node-2:/
[[email protected] ~]# scp -r /data/ node-3:/
[[email protected] ~]# scp -r /data/ node-4:/
[[email protected] ~]# scp -r /opt/hadoop/etc/hadoop/* node-2:/opt/hadoop/etc/hadoop/
[[email protected] ~]# scp -r /opt/hadoop/etc/hadoop/* node-3:/opt/hadoop/etc/hadoop/
[[email protected] ~]# scp -r /opt/hadoop/etc/hadoop/* node-4:/opt/hadoop/etc/hadoop/
9、初始化
[[email protected] ~]# cd /opt/hadoop/bin/
[[email protected] bin]# ./hadoop namenode -format
[[email protected] ~]# cd /opt/hadoop/sbin/
[[email protected] ~]# ./start-all.sh
注意:
1.如果启动报以下错误
[[email protected] sbin]# ./start-all.sh
node-2: ERROR: JAVA_HOME is not set and could not be found.
node-4: ERROR: JAVA_HOME is not set and could not be found.
node-3: ERROR: JAVA_HOME is not set and could not be found.
解决方案
[[email protected] ~]# yum -y install java
[[email protected] ~]# vim /opt/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java
2.如果启动报以下错误
[[email protected] ~]# ./start-all.sh
node-4: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
node-3: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
node-1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
node-2: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
解决方案
所有机器互相做解析
[[email protected] ~]# ssh-******
[[email protected] ~]# ssh-copy-id -i node-1
[[email protected] ~]# touch ~/.ssh/authorized_keys
3.如果启动报以下错误
[[email protected] sbin]# ./start-all.sh
Starting namenodes on [node-1]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [node-1]
解决方案
vi /opt/hadoop/sbin/start-dfs.sh
vi /opt/hadoop/sbin/stop-dfs.sh
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
vi /opt/hadoop/sbin/stop-yarn.sh
vi /opt/hadoop/sbin/start-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
注意:解决完后继续启动hadoop,所有机器都要启动
注意:如果在启动时没有发现50070端口,namenode节点重新初始化,再次启动namenode节点.如果没有8088端口
10、浏览器访问
三、Hadoop使用
1、创建文件夹并查看
[[email protected] ~]# hadoop fs -mkdir -p /test/input
[[email protected] ~]# hadoop fs -ls /
Found 1 items drwxr-xr-x - root supergroup 0 2020-11-13 22:46 /test
[[email protected] ~]# hadoop fs -ls /test
Found 1 items drwxr-xr-x - root supergroup 0 2020-11-13 22:46 /test/input
2、上传文件
[[email protected] ~]# cat xingdian.txt
hello world
nihao
shandong
3、上传到/test/input
[[email protected] ~]# hadoop fs -put xingdian.txt /test/input
4、查看是否上传成功
[[email protected] ~]# hadoop fs -ls /test/input
Found 1 items
-rw-r–r-- 2 root supergroup 27 2020-11-13 22:52 /test/input/xingdian.txt
5、下载文件
[[email protected] ~]# hadoop fs -get /test/input/xingdian.txt /
[[email protected] ~]# ls /
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var xingdian.txt
6、运行一个mapreduce的例子程序: wordcount
[[email protected] ~]# hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/input /test/output
如果报以下错误
[2020-11-13 22:59:31.249]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Please check whether your <HADOOP_HOME>/etc/hadoop/mapred-site.xml contains the below configuration:
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=
f
u
l
l
p
a
t
h
o
f
y
o
u
r
h
a
d
o
o
p
d
i
s
t
r
i
b
u
t
i
o
n
d
i
r
e
c
t
o
r
y
<
/
v
a
l
u
e
>
<
/
p
r
o
p
e
r
t
y
>
<
p
r
o
p
e
r
t
y
>
<
n
a
m
e
>
m
a
p
r
e
d
u
c
e
.
m
a
p
.
e
n
v
<
/
n
a
m
e
>
<
v
a
l
u
e
>
H
A
D
O
O
P
M
A
P
R
E
D
H
O
M
E
=
{full path of your hadoop distribution directory}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=
fullpathofyourhadoopdistributiondirectory</value></property><property><name>mapreduce.map.env</name><value>HADOOPMAPREDHOME={full path of your hadoop distribution directory}
mapreduce.reduce.env
HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}
解决方案
[[email protected] ~]# cat /opt/hadoop/etc/hadoop/mapred-site.xml
7、浏览器界面查看
8、查看结果
[[email protected] ~]# hadoop fs -ls /test/output
Found 2 items
-rw-r–r-- 2 root supergroup 0 2020-11-13 23:06 /test/output/_SUCCESS
-rw-r–r-- 2 root supergroup 35 2020-11-13 23:06 /test/output/part-r-00000
[[email protected] ~]# hadoop fs -cat /test/output/part-r-00000
hello 1
nihao 1
shandong 1
world 1
9、删除
[[email protected] ~]# echo “123” > diandian.txt
[[email protected] ~]# hadoop fs -put diandian.txt /test/input
[[email protected] ~]# hadoop fs -rm /test/input/diandian.txt
Deleted /test/input/diandian.txt
四、Hadoop集群高级使用
1、设置副本数量
[[email protected] ~]# cat /opt/hadoop/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> dfs.replication 22、设置块大小
默认值:
从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M.
如何修改block块的大小:
可以通过修改hdfs-site.xml文件中的dfs.blocksize对应的值。
注意:在修改HDFS的数据块大小时,首先停掉集群hadoop的运行进程,修改完毕后重新启动。
block块大小设置规则:
在实际应用中,hdfs block块的大小设置为多少合适呢?为什么有的是64M,有的是128M、256M、512呢?
首先我们先来了解几个概念:
1)寻址时间:HDFS中找到目标文件block块所花费的时间。
2)原理:文件块越大,寻址时间越短,但磁盘传输时间越长;文件块越小,寻址时间越长,但磁盘传输时间越短。
block不能设置过大,也不要能设置过小:
1)如果块设置过大,一方面从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;另一方面,MapReduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
2)如果设置过小,一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;另一方面块过小,寻址时间增长,导致程序一直在找block的开始位置。因此,块适当设置大一些,减少寻址时间,那么传输一个有多个块组成的文件的时间主要取决于磁盘的传输速度。
多大合适呢:
1)HDFS中平均寻址时间大概为10ms;
2)经过前任的大量测试发现,寻址时间为传输时间的1%时,为最佳状态,所以最佳传输时间为:
10ms/0.01=1000s=1s
3)目前磁盘的传输速度普遍为100MB/s,最佳block大小计算:
100MB/s*1s=100MB
所以我们设置block大小为128MB.
4)实际中,磁盘传输速率为200MB/s时,一般设定block大小为256MB;磁盘传输速率为400MB/s时,一般设定block大小为512MB.
[[email protected] ~]# vim /opt/hadoop/etc/hadoop/hdfs-site.xml
dfs.blocksize
30m
dfs.namenode.fs-limits.min-block-size
30m
五、Hadoop高级理论
1、Hadoop模块
Hadoop Common: Hadoop的一些模块工具
Hadoop HDFS:可以提供能应用程序 数据的高吞吐量的访问
Hadoop YARN:作业调度和集群资源管理的框架
Hadoop MapReduce:分布式计算框架
2、Hadoop在大数据云计算中位置和关系
云计算是分布式计算,并行计算,网络计算,多核计算,网络存储,虚拟化,负载均衡等传统计算机和互联网技术融合的一个产物.现阶段云计算的底层两大技术支撑 “虚拟化”和当前”大数据技术”
HADOOP则是云计算平台服务的解决方案
3、Hadoop案例
大型网站web服务器日志分析:一个大型网站web服务器就能每5分钟就收录的点击量高达800GB左右,峰值点击可以达到每秒900万次,每隔5分钟将数据再装载在内存中,高速计算网站的热点url,并将这些信息反馈给前端缓存服务器,以提高缓存命中率
运行商流量分析:每天的流量数据在2TB-5TB之间拷贝到HDFS上,通过交互式分析引擎模板,能够运行几百个复杂的数据清洗(ETL)和报表业务,总时间比类似的硬件配置的小集群要快2-3倍
程序交通卡口视频监控信息实施分析: 基于流式进行全省范围的交通卡口的视频监控的信息进行实时分析,警告和统计,可以对全省范围内未年检和套牌车辆进行再300毫秒左右就可以得出结论并实时进行警告
4、Hadoop的生态圈重要组件
1.HDFS: 分布式文件系统
2.MapReduce: 分布式计算框架
3.HIVE: 基于大数据技术的SQL数据仓库工具(文件系统+运算框架)
4.HBASE: 基于HADOOP的分布式海量数据库(NOSQL非关系型数据库)
5.ZOOKEEPER: 分布式系统协调服务基础组件
6.Oozie: 工作流调度框架
7. Sqoop: 数据导入导出工具
8. Flume: 日志数据采集框架
9. Mahout: 基于MapReduce/spark/flink等分布式框架的机器学习算法库
5、Hadoop原理
Hadoop文件存储时将文件分为元数据,数据本身分别存储。
元数据指的是文件的属性信息,如存放位置,大小,创建时间等,NameNode节点保存文件元数据
数据本身指的是文件中的数据,数据分块Block存储可能是一块也可能是多块,这取决数据本身大小,DataNode节点保存文件Block数据