一、案列分析
1.1案例概述
现在已经进入了大数据(Big Data)时代,数以万计用户的互联网服务时时刻刻都在产生大量的交互,要处理的数据量实在是太大了,以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代出现,在解决大数据存储和计算方面有很多的优势。
1.2案列前置知识点
1.什么是大数据
大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的大量数据集合,是需要新的处理模式才能具备更强的决策能力、洞察发现能力和流程优化能力的海量、高增长率和多样化的信息资产数据。简而言之,就是数据量非常大,大到无法用常规工具处理,如关系型数据库、数据仓库等。这里的“大”又是一个什么量级呢?如阿里巴巴每天所处理的交易数据达到 20PB(即 20971520GB)。传统数据处理技术为何不能胜任?主要原因是关系型数据库是针对表、字段、行这种可使用二维表格表示的结构化数据而设计的,而大数据通常是针对文本这种非结构化数据。
数据量大是大数据的显著特点,归纳来说大数据特点如下:
- (1)数据体量巨大。按目前的发展趋势看,大数据的体量已经达到PB甚至EB级。
- (2)大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频图片、地理位置信息、交易数据、社交数据等。
- (3)价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。由于价值密度低,所以迅速地完成数据的价值提纯是目前大数据汹涌背景下亟待解决的难题。
- (4)产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。
另外,大数据也是一种方法论。原则是“一切都被记录,一切都被数字化,从数字里寻找需求、寻找知识、发掘价值”,这是一种新的思维方式,不同于此前的专家方式,而是通过数据分析来得到结论,这是大数据时代的一个显著特征。这也就要求技术人员拥有能够从各种各样类型的数据中快速获得有价值信息的能力。
目前,有很多大数据处理系统可以处理大数据
2.Hadoop体系结构
Hadoop特点
- 高可靠性
- 高扩展性
- 高效性
- 高容错性
- 低成本
- 可构建在廉价机器上
Hadoop运行模式
- 单机模式
- 无须配置,Hadoop被视为一个非分布式模式运行的独立Java进程。
- 伪分布式模式
- 只有一个节点的集群,这个节点既是 Master(主节点、主服务器)也是 Slave(从节点、从服务器),可在此单节点上以不同的 Java 进程模拟分布式中的各类节点。
- 完全分布式模式
- 对于 Hadoop,不同的系统会有不同的节点划分方式。在HDFS看来分为 NameNode(管理者)和 DataNode(工作者),其中NameNode只有一个,DataNode 可有多个;在 MapReduce 看来节点又分为 JobTrackel(作业调度者)和 TaskTracker(任务执行者),其中 JobTracker 只有一个,TaskTracker 可以有多个。NameNode 和 JobTracker 可以部署在不同的机器上,也可以部署在同一机器上。部署 NameNode 和 JobTracker 的机器是Master,其余的机器都是 Slave。
Hadoop框架的核心构成
- 分布式文件系统(HDFS)
- 分布式计算系统(MapReduce)
- 分布式资源管理系统(YARN)
Hadoop生态圈
- HDFS:分布式文件系统,是整个Hadoop 体系的基石。
- MapReduce/YARN:并行编程模型。YARN是下一代的 MapReduce 框架从 Hadoop 0.23.01 版本后,MapReduce 被重构。通常 YARN 也称为MapReduceV2,老版本MapReduce 称为MapReduce V1.
- Hive:建立在 Hadoop 上的数据仓库。提供类似 SQL 语言的查询方式查询Hadoop 中的数据。
- Pig:一个对大型数据集进行分析、评估的平台。主要作用类似于数据库里的存储过程。
- HBase:全称 Hadoop Database。Hadoop 分布式、面向列的数据库来源于Google 关于 BigTable 的论文,主要用于需要随机访问、实时读写的大数据。在后面章节还会详细介绍。
- ZooKeeper:是一个为分布式应用所设计的协调服务。主要为用户提供同步、配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。
当然还有大量其它项目加入到 Hadoop 生态圈,如:
- Sqoop:主要用于 Hadoop与传统数据库(MySQL等)间的数据传递。
- Flume:日志采集系统。
- Spark:前面提过,是一个相对独立于Hadoop的大数据处理系统,可单独进行分布式处理。在这里列出来是因为它可以和HDFS很好的结合。
- Oozie:可以将多个MapReduce 作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。
- Ambari:支持 Hadoop 集群管理、监控的 Web 工具。
经过近十多年的发展,越来越多的项目加入到了 Hadoop 的生态圈。在本课程中着重介绍3个模块,分别是:HDFS、MapReduce、HBase。对于 Hadoop 应用开发人员来说,这也是最基本的模块。
3..MapReduce 概述
Hadoop 的 MapReduce 框架源自于 Google 的 MapReduce 论文。在 Google 发表论文时,MapReduce最大成就是重写了 Google的索引文件系统。现在,MapReduce波广泛地应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。
Hadoop 中,并行应用程序的开发是基于 MapReduce 编程模型的,基于它可以各任务分发到由上千台商用机器组成的集群上,实现Hadoop 的并行任务处理功能。前面提过,HDFS 和 MapReduce 二者相互作用,共同完成了 Hadoop 分布式集群的主要任务。
4.MapReduce 框架设计
与 HDFS 架构设计相似,Hadoop 中用于执行 MapReduce 作业的机器也有两个角色:JobTracker 和 TaskTracker.
- JobTracker:是一个 Master 服务,用于作业(Job)的管理和调度工作。一个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker 负责创建、调度作业中的每一个子任务(MapTask或 ReduceTask)运行于 TaskTracker上,并监控它们。如果发现有失败的任务就重新运行它。
- TaskTracker:是运行于多个节点上的 Slave 服务,用于执行任务。TaskTracker需要运行在 HDFS的 DataNode 上。
基于 JobTracker 和 TaskTracker 的运行架构为 MapReduce V1,在下一代MapReduce V2 中,V1 架构已被 YARN 替代。关于 YARN 在本章稍后会讲解。从学习的难易程度来看,应该先了解 MapReduce V1。不论是 V1还是 V2,都不会影响编写 MapReduce 程序,好比同样是一个 Web 应用,运行在 Tomcat 与 Jetty 下的效果是相同的。由此可见,实际上运行 MapReduce 作业的过程对开发人员是透明的。
1.3案列环境
1.本案例实验环境
二、实例实施
2.1系统环境设置(所有节点都设置)
1.关闭selinux和防火墙
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
2.为各个节点设置主机名
hostnamectl set-hostname node1
bash
hostnamectl set-hostname node2
bash
hostnamectl set-hostname node3
bash
3.修改每台主机的hosts文件
cat <<EOF>>/etc/hosts
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
EOF
4.创建hdoop用户组和hduser用户
[root@node1 ~]# groupadd hadoop
[root@node1 ~]# useradd -g hadoop hduser
[root@node1 ~]# passwd hduser
此处设置密码
5.为hduser用户授权
[root@node1 ~]# visudo
在末尾添加:
hduser ALL=(ALL) ALL
6.安装JDK
[root@node1 ~]# rpm -ivh jdk-8u171-linux-x64.rpm
[root@node1 ~]# vim /etc/profile
在末尾添加:
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
[root@node1 ~]# source /etc/profile
7.配置免密码登录(在node1上配置)
[root@node1 ~]# su - hduser
[hduser@node1 ~]$ ssh-keygen -t rsa //一路回车键即可
[hduser@node1 ~]$ ssh-copy-id hduser@node1
[hduser@node1 ~]$ ssh-copy-id hduser@node2
[hduser@node1 ~]$ ssh-copy-id hduser@node3
2.2安装Hadoop
1.将hadoop包拷贝到hduser的家目录并解压
在node1上操作
[hduser@node1 ~]$ tar zxvf hadoop-2.6.5.tar.gz
[hduser@node1 ~]$ mv hadoop-2.6.5 hadoop
2.配置hadoop的环境变量
[hduser@node1 ~]$ sudo vim /etc/profile
在末尾添加:
export HADOOP_HOME=/home/hduser/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
[hduser@node1 ~]$ source /etc/profile
3.配置hadoop-env.sh文件
[hduser@node1 ~]$ cd ~/hadoop/etc/hadoop/
[hduser@node1 hadoop]$ vim hadoop-env.sh
在末尾添加:
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
4.修改yarn-env.sh文件
[hduser@node1 hadoop]$ vim yarn-env.sh
在末尾添加
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
5.修改slaves文件
[hduser@node1 hadoop]$ vim slaves
清空文件中原有的内容
node2
node3
6.编辑core-site.xml文件
[hduser@node1 hadoop]$ vim core-site.xml
在末尾找到<configuration>模块
在里面添加配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hduser/hadoop/tmp</value>
</property>
</configuration>
备注:定义hdfs的uri,以及hdfs的临时目录
7.编辑hdfs-site.xml文件
[hduser@node1 hadoop]$ vim hdfs-site.xml
在末尾找到<configuration>模块
在里面添加:
<configuration>
<property><name>dfs.namenode.secondary.http-address</name><value>node1:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hduser/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hduser/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
备注:
名称节点和数据节点的存放位置,文件副本数和读取权限。
8.修改mapred-site.xml文件
[hduser@node1 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[hduser@node1 hadoop]$ vim mapred-site.xml
在末尾找到<configuration>模块,在里面添加:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
</configuration>
备注:Mapreduce作业记录的web地址和端口。
9.修改yarn-site.xml文件
[hduser@node1 hadoop]$ vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>node1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>node1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>node1:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>node1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node1:8088</value>
</property>
</configuration>
备注:
resourcemanager、nodemanager的通信端口,web端口等信息
10.将hadoop目录拷贝到其他节点上
[root@node1 ~]#scp -r /home/hduser/hadoop node2:/home/hduser
[root@node1 ~]#scp -r /home/hduser/hadoop node3:/home/hduser
2.3验证安装配置
1.在 Master 主机(node1)上格式化 NameNode
[hduser@node1 ~]$ cd hadoop/
[hduser@node1 hadoop]$ bin/hdfs namenode -format
[hduser@node1 hadoop]$ sbin/start-dfs.sh
2.查看进程
[hduser@node1 hadoop]$ jps
16721 Jps
15687 NameNode
15866 SecondaryNameNode
3.启动yarn
[hduser@node1 hadoop]$ sbin/start-yarn.sh
4.查看集群环境
[hduser@node1 hadoop]$ bin/hdfs dfsadmin -report
5.浏览器查看 HDFS 运行状态
http://192.168.10.101:50070
2.4运行 Hadoop 的 WordCount 程序
WordCount 实现了对文本中的单词计数的功能,并要求输出结果并按单词首字母排序
1.创建测试文件的目录
[hduser@node1 ~]$ mkdir ~/file
2.编辑测试文件
[hduser@node1 ~]$ cd ~/file/
[hduser@node1 file]$ echo "ni hao hadoop">file1.txt
[hduser@node1 file]$ echo "hello hadoop hi china">file2.txt
3.启动hadoop并 创建hdfs目录
[hduser@node1 file]$ cd ~/hadoop/
[hduser@node1 hadoop]$ sbin/start-all.sh
[hduser@node1 hadoop]$ bin/hadoop fs -mkdir /input2
4.将file1和file2拷贝到hdfs存储目录中
[hduser@node1 hadoop]$ bin/hadoop fs -put ~/file/file* /input2/
[hduser@node1 hadoop]$ bin/hadoop fs -ls /input2/
5.执行WordCount程序,对文件进行统计
[hduser@node1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input2/ /output2/wordcount1
注意:输出目录不能已存在,否则不会输出
6.查看执行结果
[hduser@node1 hadoop]$ bin/hadoop fs -cat /output2/wordcount1/*
如果看到输出结果证明hadoop安装成功