第二章 大数据处理框架Hadoop
1 | 主页:http://www.cs.xmu.edu.cn/linziyu |
概述
Hadoop简介
1 | • Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 |

Hadoop发展简史
1 | • Hadoop最初是由Apache Lucene项目的创始人Doug Cutting开发的文本搜索库。Hadoop源自始于2002年的Apache Nutch项目——一个开源的网络搜索引擎并且也是Lucene项目的一部分 |
1 | • 到了2006年2月,Nutch中的NDFS和MapReduce开始独立出来,成为Lucene项目的一个子项目,称为Hadoop,同时,Doug Cutting加盟雅虎 |
Hadoop的特性
1 | • 高可靠性 |
Hadoop的应用现状
1 | • Facebook作为全球知名的社交网站,Hadoop是非常理想的选择,Facebook主要将Hadoop平台用于日志处理、推荐系统和数据仓库等 |

Apache Hadoop版本演变
1 | •Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0 |
1 | 有3.0了,大数据开发工程师 |

Hadoop各种版本

2.1.5 Hadoop各种版本

Hadoop项目结构
1 | Hadoop的项目结构不断丰富发展,已经形成一个丰富的Hadoop生态系统 |

1 | 组件 功能 |
Hadoop的安装与使用
1 | 详细安装教程请参考厦门大学数据实验室出品的《大数据技术原理与 |
Hadoop安装之前的预备知识
Linux的选择
1 | (1)选择哪个Linux发行版? |
1 | (2)选择32位还是64位? |
系统安装方式:选择虚拟机安装还是双系统安装
1 | •建议电脑比较新或者配置内存4G以上的电脑可以选择虚拟机安装 |
关于Linux的一些基础知识
Hadoop安装方式
1 | •单机模式:Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试 |
安装Linux虚拟机
安装双操作系统
1 | •第一步:制作安装U盘 |
详解Hadoop的安装与使用
1 | Hadoop基本安装配置主要包括以下几个步骤: |
1 | 详细安装配置过程请参考厦门大学数据库实验室出品教程 |
创建Hadoop用户
1 | 如果安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 |
SSH登录权限设置
1 | SSH 为 Secure Shell 的缩写,是建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠、专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 |
1 | SSH是由客户端和服务端的软件组成,服务端是一个守护进程(daemon),它在后台运行并响应来自客户端的连接请求, |
配置SSH的原因
1 | Hadoop名称节点(NameNode)需要启动集群中所有机器的Hadoop守护进程,这个过程需要通过SSH登录来实现。Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够顺利登录每台机器,需要将所有机器配置为名称节点可以无密码登录它们 |
安装Java环境
1 | • 具体请参考网络教程:http://dblab.xmu.edu.cn/blog/install-hadoop/ |
第1种安装方式
1 | 下面有三种安装JDK的方式,可以任选一种。推荐直接使用第1种安装方式。 |
1 | cd /usr/lib/jvm |
1 | 添加如下几行内容: |
1 | 保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效: |
第2种安装方式
1 | sudo apt-get install openjdk-7-jre openjdk-7-jdk |
1 | JRE和JDK的区别: JRE(Java Runtime Environment,Java运行环境),是运行 Java 所需的环境。JDK(Java Development Kit,Java软件开发工具包)即包括 JRE,还包括开发 Java 程序所需的工具和类库。 |
1 | 安装好 OpenJDK 后,需要找到相应的安装路径,这个路径是用于配置 JAVA_HOME 环境变量的。执行如下命令: |
1 | 接着需要配置一下 JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置 |
第3种安装方式
1 | 根据大量电脑安装Java环境的情况我们发现,部分电脑按照上述的第一种安装方式会出现安装失败的情况,这时,可以采用这里介绍的另外一种安装方式,命令如下: |
1 | 上述安装过程需要访问网络下载相关文件,请保持联网状态。安装结束以后,需要配置JAVA_HOME环境变量,请在Linux终端中输入下面命令打开当前登录用户的环境变量配置文件.bashrc: |
设置Linux环境变量的方法和区别
1 | 设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别。 |
对所有用户都会生效
1 | etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。 |
对单个用户生效
1 | ~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是~/.profile 文件。 |
/etc/environment
1 | 此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。 |
1 | 有几点需注意: |
修改 Linux 环境变量实例
1 | vim ~/.profile |
1 | 在最后加上代码 PATH="$PATH:/usr/local/hadoop/bin",注意等号(=)两边不要有空格,即: |
1 | 因为这个文件是在用户登陆是才读取一次的,所以需要重启才会生效(修改 /etc/profile、/etc/environment 也是如此)。但可以使用命令 source ~/.profile 使其立即生效。通过 echo $PATH 可以看到修改后的变量值: |
通过 Shell 命令 export 修改 Linux 环境变量
1 | 另一种修改 Linux 环境变量的方式就是通过 Shell 命令 export,注意变量名不要有美元号 $,赋值语句中才需要有: |
安装 Hadoop
1 | 一般选择下载最新的稳定版本,即下载 "stable" 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。 |
1 | cat ~/下载/hadoop-2.6.0.tar.gz.mds | grep 'MD5' # 列出md5检验值 |

1 | sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中 |
1 | Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息: |
单机安装配置
1 | https://dblab.xmu.edu.cn/blog/7/ |
1 | Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单Java进程,方便进行调试。 |
1 | cd /usr/local/hadoop |

1 | 注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。 |
伪分布式安装配置
1 | https://dblab.xmu.edu.cn/blog/7/ |
1 | Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,节点既作为NameNode也作为 DataNode,同时,读取的是HDFS中的文件。 |
1 | <configuration> |
1 | 同样的,修改配置文件 hdfs-site.xml: |
1 | Hadoop配置文件说明: |
1 | 配置完成后,执行 NameNode 的格式化: |
1 | 如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。 |
1 | 接着开启 NameNode 和 DataNode 守护进程。 |
1 | 启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。 |

1 | 这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录): |
1 | 保存后,务必执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。 |
1 | Hadoop无法正常启动的解决方法: 一般可以查看启动日志来排查原因,注意几点: |
1 | 此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做) |
1 | 成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。 |

运行Hadoop伪分布式实例
1 | 上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录: |
1 | 注意: 教材《大数据技术原理与应用》的命令是以"./bin/hadoop dfs"开头的Shell命令方式,实际上有三种shell命令方式。 |
1 | 接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input: |
1 | 复制完成后,可以通过如下命令查看文件列表: |
1 | 伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。 |
1 | ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+' |

1 | 我们也可以将运行结果取回到本地: |
1 | Hadoop 运行程序时,输出目录不能存在,否则会提示错误 "org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists" ,因此若要再次执行,需要执行如下命令删除 output 文件夹: |
1 | 运行程序时,输出目录不能存在: 运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作: |
1 | 若要关闭 Hadoop,则运行 |
Hadoop集群的部署与使用
集群节点类型
1 | •Hadoop框架中最核心的设计是为海量数据提供存储的HDFS和对数据进行计算的MapReduce |
集群规模
1 | •Hadoop集群规模可大可小,初始时,可以从一个较小规模的集群开始,比如包含10个节点,然后,规模随着存储器和计算需求的扩大而扩大 |
集群硬件配置
集群网络拓扑
1 | •普通的Hadoop集群结构由一个两阶网络构成 |

集群的建立与安装
1 | 采购好相关的硬件设备后,就可以把硬件装入机架,安装并运行Hadoop安装Hadoop有多种方法: |
集群基准测试
1 | •如何判断一个Hadoop集群是否已经正确安装?可以运行基准测试 |
在云计算环境中使用Hadoop
Ubuntu命令
sudo
1 | 添加用户 |
apt-get
1 | 更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。 |
1 | "Hash校验和不符" 的提示,可通过更改软件源来解决 的解决方法 |
vim
1 | sudo apt-get install vim vim(vi增强版,基本用法相同),建议安装一下 |
1 | 正常模式 |
安装SSH、配置SSH无密码登陆
1 | 集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server |
1 | sudo apt-get install openssh-server |
1 | 安装后,可以使用如下命令登陆本机: |
1 | 但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。 |
1 | ~的含义: 在 Linux 系统中,~ 代表的是用户的主文件夹,即 "/home/用户名" 这个目录,如你的用户名为 hadoop,则 ~ 就代表 "/home/hadoop/"。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。 |
常用命令
1 | 命令 含义 |