大数据离线-Hadoop入门

Hadoop介绍

一般我们讲的Hadoop分为狭义和广义两部分

狭义上讲

Hadoop 指 Apache 这款开源框架
Alt text
Hadoop 是 Apache 旗下的一个用 java 语言实现开源软件框架, 是一个开发和运行处理大规模数据的软件平台。 允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。它的核心组件有:

  • HDFS(分布式文件系统):解决海量数据存储
  • YARN(作业调度和集群资源管理的框架):解决资源任务调度
  • MAPREDUCE(分布式运算编程框架): 解决海量数据计算

广义上讲

Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈。
Alt text
当下的 Hadoop 已经成长为一个庞大的体系,随着生态系统的成长,新出现的项目越来越多,其中不乏一些非 Apache 主管的项目,这些项目对 HADOOP 是很好的补充或者更高层的抽象。 比如:

  • HDFS:分布式文件系统
  • MAPREDUCE:分布式运算程序开发框架
  • HIVE:基于 HADOOP 的分布式数据仓库,提供基于 SQL 的查询数据操作
  • HBASE:基于 HADOOP 的分布式海量数据库
  • ZOOKEEPER:分布式协调服务基础组件
  • Mahout:基于 mapreduce/spark/flink 等分布式运算框架的机器学习算法库
  • Oozie:工作流调度框架
  • Sqoop:数据导入导出工具(比如用于 mysql 和 HDFS 之间)
  • Flume:日志数据采集框架
  • Impala: 基于 Hadoop 的实时分析

Hadoop发展历史

  • Hadoop 是 Apache Lucene 创始人 Doug Cutting 创建的。最早起源于 Nutch,它是 Lucene 的子项目。 Nutch 的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题: 如何解决数十亿网页的存储和索引问题。
  • 2003 年 Google 发表了一篇论文为该问题提供了可行的解决方案。 论文中描述的是谷歌的产品架构,该架构称为: 谷歌分布式文件系统(GFS) ,可以解决他们在网页爬取和索引过程中产生的超大文件的存储需求。
  • 2004 年 Google 发表论文向全世界介绍了谷歌版的 MapReduce 系统。同时期, Nutch 的开发人员完成了相应的开源实现 HDFS 和 MAPREDUCE,并从Nutch 中剥离成为独立项目 HADOOP,到 2008 年 1 月, HADOOP 成为 Apache 顶级项目,迎来了它的快速发展期。
  • 2006 年 Google 发表了论文是关于 BigTable 的,这促使了后来的 Hbase 的发
    展。

因此, Hadoop 及其生态圈的发展离不开 Google 的贡献。

Hadoop的特点

1、扩容能力
Hadoop 是在可用的计算机集群间分配数据并完成计算任务的,这些集群可用方便的扩展到数以千计的节点中。
2、成本低
Hadoop 通过普通廉价的机器组成服务器集群来分发以及处理数据,以至于成本很低。
3、高效率
通过并发数据, Hadoop 可以在节点之间动态并行的移动数据,使得速度非常快。
4、可靠性
能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以 Hadoop 的按位存储和处理数据的能力值得人们信赖。

Hadoop 国内外应用

不管是国内还是国外, Hadoop 最受青睐的行业是互联网领域, 可以说互联
网公司是 hadoop 的主要使用力量。
国外应用

  • Yahoo 的 Hadoop 应用在支持广告系统、 用户行为分析、 支持 Web 搜索等。
  • Facebook 主要使用 Hadoop 存储内部日志与多维数据,并以此作为报告、分
    析和机器学习的数据源。

国内应用
国内来说,BAT领头的互联网公司是当仁不让的 Hadoop 使用者、维护者。比如 Ali 云梯(14 年国内最大 Hadoop 集群)、百度的日志分析平台、推荐引擎系统等。
Alt text
国内其他非互联网领域也有不少 hadoop 的应用,比如:

  • 金融行业: 个人征信分析
  • 证券行业: 投资模型分析
  • 交通行业: 车辆、路况监控分析
  • 电信行业: 用户上网行为分析

总之: hadoop 并不会跟某种具体的行业或者某个具体的业务挂钩,它只是
一种用来做海量数据分析处理的工具。

Hadoop集群搭建

发行版本

Hadoop 发行版本分为开源社区版和商业版。

  • 社区版是指由 Apache 软件基金会维护的版本,是官方维护的版本体系。
  • 商业版 Hadoop 是指由第三方商业公司在社区版 Hadoop 基础上进行了一些修改、整合以及各个服务组件兼容性测试而发行的版本, 比较著名的有 cloudera 的 CDH、 mapR 等。

我们介绍的是社区版: Apache Hadoop。 后续如未说明都是指 Apache 版。Hadoop 的版本很特殊,是由多条分支并行的发展着。 大的来看分为 3 个大的系列版本: 1.x、 2.x、 3.x。

  • Hadoop1.0 由一个分布式文件系统 HDFS 和一个离线计算框架 MapReduce 组成。
  • Hadoop 2.0 则包含一个支持 NameNode 横向扩展的 HDFS,一个资源管理系统YARN 和一个运行在 YARN 上的离线计算框架 MapReduce。相比于 Hadoop1.0,Hadoop 2.0 功能更加强大,且具有更好的扩展性、性能,并支持多种计算框架。
  • Hadoop 3.0 相比之前的 Hadoop 2.0 有一系列的功能增强。但目前还是个alpha 版本,有很多 bug,且不能保证 API 的稳定和质量。

当前 2 系列最稳定版本: Apache Hadoop 2.9.2。

集群介绍

HADOOP 集群具体来说包含两个集群:HDFS集群YARN集群两者逻辑上分 离,但物理上常在一起

  • HDFS 集群负责海量数据的存储,集群中的角色主要有:
    NameNode、 DataNode、 SecondaryNameNode
  • YARN 集群负责海量数据运算时的资源调度,集群中的角色主要有:
    ResourceManager、 NodeManager
  • mapreduce 是一个分布式运算编程框架,是应用程序开发包,由用户按照编程规范进行程序开发,后打包运行在 HDFS 集群上,并且受到 YARN 集群的资源调度管理。

Hadoop 部署方式分三种:

  • 独立模式又称为单机模式, 仅 1 个机器运行 1 个 java 进程,主要用于调试。(单机)
  • 伪分布模式也是在 1 个机器上运行 HDFS 的 NameNode 和 DataNode、 YARN 的
    ResourceManger 和 NodeManager, 但分别启动单独的 java 进程,主要用于调试。(单机)
  • 集群模式主要用于生产环境部署。 会使用 N 台主机组成一个 Hadoop 集群。
    这种部署模式下, 主节点和从节点会分开部署在不同的机器上。

我们以 3 节点为例进行搭建,角色分配如下:
Alt text
角色分配如下:

node-01 NameNode DataNode ResourceManager
node-02 DataNode NodeManager SecondaryNameNode
node-03 DataNode NodeManager

集群安装

服务器准备

node-01 10.186.60.12
node-02 10.186.60.60
node-03 10.186.65.43

服务器系统设置

同步时间

  • #手动同步集群各机器时间
1
2
date -s "2017-03-03 03:03:03"
yum install ntpdate
  • #网络同步时间
1
ntpdate ntp6.aliyun.com

设置主机名

Linux主机名设置

1
vim /etc/hosts

输入内容

10.186.60.12 node-01
10.186.60.60 node-02
10.186.65.43 node-03

window主机名映射
地址:C:\Windows\System32\drivers\etc
修改hosts文件,添加内容

192.168.33.101 node-01
192.168.33.102 node-02
192.168.33.103 node-03

配置 ssh 免密登陆
生成 ssh 免登陆密钥

1
ssh-keygen -t rsa (四个回车)

执行完这个命令后,会生成 id_rsa(私钥)、 id_rsa.pub(公钥)
将公钥拷贝到要免密登陆的目标机器上

1
2
ssh-copy-id node-02
ssh-copy-id node-03

配置防火墙
查看防火墙状态 service iptables status
关闭防火墙 service iptables stop
查看防火墙开机启动状态 chkconfig iptables –list
关闭防火墙开机启动 chkconfig iptables off

JDK环境安装

  • 上传 jdk 安装包 jdk-8u161-linux-x64.tar.gz
  • 解压安装包 tar -zxvf jdk-8u161-linux-x64.tar.gz -C /data/jdk1.8
  • 配置环境变量 vim /etc/profile
  • 插入下面的内容

    1
    2
    3
    export JAVA_HOME=/data/jdk1.8
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • 刷新配置:source /etc/profile

Hadoop 安装

首先我们要有一版是适合我们系统版本的hadoop,所以我们需要编译。
为什么要编译以及如何编译参考:Hadoop2.9.2源码编译
上传hadoop,解压hadoop-2.9.2-with-centos7.6.tar.gz
hadoop的目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pwd
/data/hadoop/hadoop-2.9.2
[root@node-01 hadoop-2.9.2]# ll
total 128
drwxr-xr-x 2 root root 194 Dec 27 03:45 bin
drwxr-xr-x 3 root root 20 Dec 27 03:45 etc
drwxr-xr-x 2 root root 106 Dec 27 03:45 include
drwxr-xr-x 3 root root 20 Dec 27 03:45 lib
drwxr-xr-x 2 root root 239 Dec 27 03:45 libexec
-rw-r--r-- 1 root root 106210 Dec 27 03:45 LICENSE.txt
-rw-r--r-- 1 root root 15917 Dec 27 03:45 NOTICE.txt
-rw-r--r-- 1 root root 1366 Dec 27 03:45 README.txt
drwxr-xr-x 3 root root 4096 Dec 27 03:45 sbin
drwxr-xr-x 4 root root 31 Dec 27 03:45 share

  • bin: Hadoop 最基本的管理脚本和使用脚本的目录,这些脚本是 sbin 目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用 Hadoop。
  • etc: Hadoop 配置文件所在的目录,包括 core-site,xml、 hdfs-site.xml、mapred-site.xml 等从 Hadoop1.0 继承而来的配置文件和 yarn-site.xml Hadoop2.0 新增的配置文件。
  • include:对外提供的编程库头文件(具体动态库和静态库在 lib 目录中),这些头文件均是用 C++定义的,通常用于 C++程序访问 HDFS 或者编写 MapReduce程序。
  • lib:该目录包含了 Hadoop 对外提供的编程动态库和静态库,与 include 目录中的头文件结合使用。
  • libexec:各个服务对用的 shell 配置文件所在的目录,可用于配置日志输出、启动参数(比如 JVM 参数)等基本信息。
  • sbin: Hadoop 管理脚本所在的目录,主要包含 HDFS 和 YARN 中各类服务的启动/关闭脚本。
  • share: Hadoop 各个模块编译后的 jar 包所在的目录。

Hadoop配置文件修改

Hadoop 安装主要就是配置文件的修改, 一般在主节点进行修改,完毕后 scp
下发给其他各个从节点机器。下面的文件都在 hadoop的etc/hadoop目录下:

  • 修改hadoop-env.sh文件,更改
1
export JAVA_HOME=${JAVA_HOME}


1
export JAVA_HOME=/data/jdk1.8

此处JAVA_HOME为JDK的位置。

  • 修改core-site.xml文件,在configuration中增加代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>

<!-- 用于设置 Hadoop 的文件系统,由 URI 指定 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-1:9000</value>
</property>

<!-- 配置 Hadoop 的临时目录,默认/tmp/hadoop-${user.name} -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoopData</value>
</property>
</configuration>
  • 修改hdfs-site.xml,在configuration中增加代码
1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- 指定 HDFS 副本的数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- secondary namenode 所在主机的 ip 和端口->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node-02:50090</value>
</property>
</configuration>
  • 修改mapred-site.xml的,configuration中增加代码
1
2
3
4
5
6
7
<configuration>
<!-- 指定 mr 运行时框架,这里指定在 yarn 上,默认是 local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • 修改yarn-site.xml的,configuration中增加代码
1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- 指定 YARN 的老大( ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-1</value>
</property>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序默认值: "" -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
  • 创建slaves文件,如果存在进行编辑,删除locahost,增加文件
1
2
3
node-1
node-2
node-3
  • 将hadoop添加到环境变量 ,命令vim /etc/proflie
1
2
export HADOOP_HOME=/data/hadoop/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存配置文件,刷新配置文件:source /etc/profile

集群启动

  • 启动方式

要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
注意: 首次启动 HDFS 时,必须对其进行格式化操作。 本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的。
hdfs namenode –format或者hadoop namenode –format

  • 单节点逐个启动

1、在主节点上使用以下命令启动 HDFS NameNode:
hadoop-daemon.sh start namenode
2、在每个从节点上使用以下命令启动 HDFS DataNode:
hadoop-daemon.sh start datanode
3、在主节点上使用以下命令启动 YARN ResourceManager:
yarn-daemon.sh start resourcemanager
4、在每个从节点上使用以下命令启动 YARN nodemanager:
yarn-daemon.sh start nodemanager
以上脚本位于$HADOOP_PREFIX/sbin/目录下。 如果想要停止某个节点上某个角色,只需要把命令中的 start 改为 stop 即可。

  • 脚本一键启动

如果配置了 etc/hadoop/slaves 和 ssh 免密登录,则可以使用程序脚本启动
所有 Hadoop 两个集群的相关进程,在主节点所设定的机器上执行。
hdfs: /sbin/start-dfs.sh
yarn: /sbin/start-yarn.sh
停止集群: stop-dfs.shstop-yarn.sh
集群 web-ui
一旦 Hadoop 集群启动并运行, 可以通过 web-ui 进行集群查看,如下所述:
node-1:50070 HDFS的NameNode节点
Alt text
node-1:8088 YARN的主页
Alt text

Hadoop初体验

上传文件

从 Linux 本地上传一个文本文件到 hdfs 的/test/input 目录下
hadoop fs -mkdir -p /wordcount/input 创建文件夹
hadoop fs -put /root/somewords.txt /wordcount/input Linux上传到hadoop

运行程序

运行 mapreduce 程序
在 Hadoop 安装包的 hadoop-2.7.4/share/hadoop/mapreduce 下有官方自带的 mapreduce 程序。 我们可以使用如下的命令进行运行测试。示例程序 jar:
hadoop-mapreduce-examples-2.7.4.jar

计算圆周率

计算圆周率:
hadoop jar hadoop-mapreduce-examples-2.7.4.jar pi 20 50
这里使用的是Monte Carlo 方法来计算 Pi 值
使用Monte Carlo 计算圆周率

本文标题:大数据离线-Hadoop入门

文章作者:Francis

原始链接:http://www.cnops.com/posts/497086ea.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。