首页 > 分布式 > Hadoop > Hadoop基础及伪分布式环境搭建
2015
04-23

Hadoop基础及伪分布式环境搭建

一、What Is Apache Hadoop?

The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.

1、产生背景

首先从Hadoop之父Doug Cutting谈起,在创建Hadoop项目之前,他主要从事两个与搜索有关的开源项目的开发:Lucene和Nutch。

  • Lucene是一个提供全文检索的函数库。Lucene不是一个应用软件,它提供很多API让你可以运用到各种实际应用程序中(例如你在各大网站看到的站内搜索,如淘宝、京东等等)。
  • Nutch是一个建立在Lucene之上的Web搜索的实现,它是一个真正的应用程序,也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网络爬虫以及一些和Web相关的东东。其目的就是想从一个简单的站内索引和站内搜索推广到整个Internet的搜索上,就像Google和Baidu一样。利用Lucene和Nutch搭建的搜索引擎的工作过程大致如下图:

02. Hadoop基础及伪分布式环境搭建540

但后来,开发者认为这一架构的灵活性不够,不足以解决数十亿乃至更多网页的存储、索引问题。这一问题在同为搜索领域的谷歌公司得到了解决,并将相关技术以论文的形式对外发表(GFS、MapReduce、BigTable)。受这三篇论文的启发,Doug Cutting实现了NDFS、MapReduce,这也是Hadoop的雏形,其被设计的最初目的也是用于存储和处理海量的网页。

在2006年2月,开发人员将NDFS和MapReduce移出Nutch形成Lucene的一个子项目,并命名为Hadoop,2008年1月,Hadoop成为Apache的顶级项目。

2、三大核心模块

HDFS:海量数据的存储

MapReduce:海量数据的分析

Yarn:资源管理调度

有些地方也说四大模块,即将Hadoop Common也看成是其中的一大模块。

3、Hadoop相关项目

  • Hbase:A scalable, distributed database that supports structured data storage for large tables.
  • Hive:将SQL语句翻译成MapReduce任务执行。
  • Mahout:提供一些机器学习领域经典算法的实现,可以帮助开发人员更加方便快捷地创建智能应用程序。
  • Pig
  • Flume:分布式的日志采集系统,Hadoop是用来处理海量数据的,其中有一类重要的数据就是各种各样的日志数据。在一个大型公司里,服务器有很多,如业务服务器、Web服务器等等,每种服务器上都会不定时的产生一些日志,对这些日志的收集是一个难题。Flume就是被用于此类日志的自动采集。
  • Zookeeper

更多Hadoop相关项目可以参考文末附录部分。

4、版本

Apache Hadoop:官方版本,最新版本号为2.6.0

Cloudera Hadoop(CDH): 使用下载最多的版本,稳定,有商业支持,在Apache的基础上打上了一些patch。推荐使用。

HDP(Hortonworks Data Platform):Hortonworks公司发行版本。

二、Hadoop伪分布式环境搭建

Hadoop有三种部署方式:

  • 本地模式:Hadoop的默认模式,在解压Hadoop压缩包后指定JAVA_HOME变量即可(在hadoop-env.sh中)。该模式下直接读写本地文件系统,不使用HDFS,也不加载任何Hadoop的服务进程。该模式主要用于开发调试MapReduce程序的应用逻辑。
  • 伪分布式:在一个节点上运行所有Hadoop的服务进程,如HDFS、Yarn等。在该模式下可以对代码进行调试,并使用HDFS输入输出。
  • 集群模式:在多个节点上运行。

本章主要讲解Hadoop伪分布式环境的搭建,并使用伪分布式环境作为后续Hadoop的学习环境。

整个Hadoop伪分布式环境安装步骤包括:关闭防火墙、修改ip、修改hostname、设置ssh免密码登录、安装jdk、安装hadoop。本文重点讲解安装Hadoop,并在最后对ssh免密码登录做了详细介绍。一些基本环境如下:

  • 版本:Apache Hadoop 2.4.1
  • linux用户名@主机名:hadoop@hadoop01

1、Hadoop伪分布式安装配置

1)上传Hadoop的安装包至用户家目录/home/hadoop,并解压该安装包到app目录下:

tar -zxvf hadoop-2.4.1.tar.gz -C app/

解压完成后在/home/hadoop/app/hadoop-2.4.1路径下可以看到如下目录:

  • bin、sbin:Hadoop的执行命令、系统执行命令(如启动和停止服务)
  • etc:Hadoop的配置文件目录
  • share:存放Hadoop各模块所使用的jar包
  • lib:注意,该目录下存放的不是jar包,而是和操作系统有关的一些本地库
  • libexec:一些配置命令的脚本文件,如*.cmd、*.sh

2)配置Hadoop伪分布式需要修改5个配置文件(核心)

①指定JAVA_HOME:修改hadoop-env.sh文件

export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65/

②Hadoop的全局配置,如Hadoop所使用的文件系统、运行时产生文件的存储目录:修改core-site.xml文件

<!-- 指定HADOOP所使用的文件系统(HDFS):HDFS的老大(NameNode)的地址 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://hadoop01:9000</value>
</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/home/hadoop/app/hadoop-2.4.1/temp</value>
</property>

③对HDFS的配置:修改hdfs-site.xml文件

<!-- 指定HDFS副本的数量 -->
<property>
	<name>dfs.replication</name>
	<value>1</value>
</property>

由于是伪分布式环境,所以副本数量超过1时毫无意义。

④对MapReduce的配置:修改mapred-site.xml文件,该文件在etc目录下通过:mv mapred-site.xml.template mapred-site.xml得到。

<!-- 指定MapReduce运行在yarn上 -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

⑤对Yarn的配置:修改yarn-site.xml文件

<!-- 指定ResourceManager节点的主机名(YARN的老大) -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>hadoop01</value>
</property>

<!-- reducer获取数据的方式 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

至此,Hadoop伪分布式配置结束。

2、启动Hadoop

为了方便起见,在启动之前可以将HADOOP_HOME加到path下,然后刷新:source /etc/profile。

Hadoop的启动分为两个过程:启动HDFS和启动Yarn,分别对应sbin目录下的start-dfs.sh和start-yarn.sh脚本。步骤如下:

1)格式化namenode

在core-site.xml配置文件中指定了Hadoop使用HDFS作为自己的默认文件系统。第一次使用HDFS时,首先要格式化namenode。
格式化命令为:$HADOOP_HOME/bin/hadoop namenode -format

注意,这儿不是格式化硬盘,而是在temp目录下建一些子文件夹并写入一些特定的信息。

当看到:common.Storage: Storage directory /home/hadoop/app/hadoop-2.4.1/temp/dfs/name has been successfully formatted. 表示格式化成功。

2)启动HDFS

02. Hadoop基础及伪分布式环境搭建3736

可以发现,start-dfs.sh脚本先后启动了namenode、datanode和secondarynamenode三个进程(角色),每次启动都需要输入密码才能进行下一步。这是因为start-dfs.sh脚本是通过ssh方式登录一台主机,然后启动进程的。在通过ssh方式登录主机时就会提示输入密码,在一个大型集群中,一次次的输入密码极不灵活,下一小节将会讲解如何配置ssh免密码登录。

当HDFS成功启动后,登录http://hadoop01:50070/可看到HDFS管理界面(Namenode information)。

注意:

①HDFS的9000端口对外提供文件读写服务(hdfs://hadoop01:9000),50070端口对外提供Web服务(http://hadoop01:50070),可以查看HDFS上的文件列表等信息。

②上传一个文件到HDFS上有两种方式:命令行(hadoop fs -put)和Java程序;查看HDFS上的文件也有两种方式:命令行(hadoop fs -ls hdfs://hadoop01:9000/)和web界面(http://hadoop01:50070)。注意,这里说的是通常情况,因为通过Java程序也可以读取HDFS上的文件列表,但是一般不这么干。

3)启动Yarn

02. Hadoop基础及伪分布式环境搭建4304

不难看出,Yarn中包含resourcemanager和nodemanager两个角色(主从)。

当Yarn成功启动后,登录http://hadoop01:8088/可看到MapReduce任务管理界面(All applications)。

至此,Hadoop启动完毕,你可以在伪分布式环境下运行你的MapReduce任务了~~

3、配置ssh免密码登录

在启动HDFS时我们说过start-dfs.sh脚本是通过ssh方式登录一台主机,然后启动进程的,这种方式的缺点就是每次登录时都会提醒你输入密码,当扩展到一个很大的集群时,这种方式肯定是不合适的。因此,需要对这种登录方式进行改造,这就涉及到ssh无密码登录的配置。

ssh远程登录时有两种身份验证方式:

①输入密码(默认情况)

②持有密钥:目标主机只要验证该密钥是匹配的,那就可以登录进来。下图对密钥验证的原理进行了说明,需要注意的是,在A主机上ssh远程登录B主机之前,首先要在A主机生成密钥对(公钥/私钥),并将公钥添加到B主机的授权列表中。

02. Hadoop基础及伪分布式环境搭建4800

上图展示了采用密钥方式的身份验证过程,当然这些都是由ssh自动完成的,在配置ssh无密码登录时只有两步:生成密钥对和加入授权列表。

1)生成密钥对:

Linux中可以使用ssh-keygen命令生成ssh密钥对(公钥 / 私钥):ssh-keygen -t rsa(指定加密解密算法为rsa)。这条命令会在 ~/.ssh目录下生成两个文件:id_isa(私钥)和id_isa.pub(公钥),如下图:

02. Hadoop基础及伪分布式环境搭建5004

这个过程中会询问你存放密钥的路径,保持默认即可,即~/.ssh。

接下来会询问你要不要为密钥创建口令(passphrase),如果你对安全性要求不是特别高,可以直接回车设为空。

结束后,控制台会打印出密钥的指纹(finger print),以及随机字符画(randomart image)。指纹就是你的密钥的md5码,是为了防止”中间人攻击”,用来确认远程主机身份的。

2)加入授权列表:

由于是伪分布式环境,客户端和目标主机相同,因此执行命令:cat id_rsa.pub > authorized_keys即可将公钥加入到授权列表中,最后还需要修改authorized_keys的权限为600:chmod 600 authorized_keys (强制规定)。

02. Hadoop基础及伪分布式环境搭建5340

但是这样的操作实际上太复杂了,因为在一个集群环境下,将公钥加入到目标主机的授权列表时,还需要切换到目标主机操作。其实有个更简单的命令:ssh-copy-id destHost,这条命令只需在客户端上操作就行。如下图:

02. Hadoop基础及伪分布式环境搭建5451

至此,ssh免密码登录配置结束,这时再执行start-dfs.sh脚本,便不需要输入密码了,Yo~

注意:如果你按照这种方式还是没有成功,请参考下面检查authorized_keys及其父目录的权限:

  • authorized_keys 文件必须是600权限,即-rw——-
  • .ssh目录必须是700权限,即drwx——
  • /home/work目录必须是755权限 即drwxr-xr-x

三、附录

附录1 Hadoop生态圈

图来源于网络:http://nosql.mypopescu.com/post/17715359030/hadoop-ecosystem-map,有些古老了。

02. Hadoop基础及伪分布式环境搭建5754

对上图的解释如下:

①这一切是如何开始的:Web上庞大的数据!

②使用Nutch抓取Web数据

③要保存Web上庞大的数据:HDFS应运而生

④如何使用这些庞大的数据?

⑤编码并进行分析:MapReduce

⑥如何获取Web日志,点击流,Apache日志,服务器日志等非结构化数据:flume、Scribe

⑦Hiho和sqoop将数据加载到HDFS中,关系型数据库也能够加入到Hadoop队伍中

⑧MapReduce编程需要的高级接口——Pig, Hive, Jaql

⑨具有先进的UI报表功能的BI工具- Intellicus

⑩Map-Reduce处理过程使用的工作流工具及高级语言

⑪监控、管理hadoop,运行jobs/hive,查看HDFS的高级视图—Hue, karmasphere, eclipse plugin, cacti, ganglia

⑫支持框架—Avro (进行序列化)、Zookeeper (用于协同)

⑬更多高级接口——Mahout, Elastic map Reduce

⑭同样可以进行OLTP——Hbase


留下一个回复

你的email不会被公开。