hadoop 初始
1. 前言
本文的目的是让一个从未接触Hadoop的人,在很短的时间内快速上手,掌握编译、安装和简单的使用。
2. Hadoop家族
截止2009-8-19日,整个Hadoop家族由以下几个子项目组成:
成员名
|
用途
|
Hadoop Common
|
Hadoop体系最底层的一个模块,为Hadoop各子项目提供各 种工具,如:配置文件和日志操作等。
|
Avro
|
Avro是doug cutting主持的RPC项目,有点类似Google的protobuf和Facebook的thrift。avro用来做以后hadoop的RPC,使hadoop的RPC模块通信速度更快、数据结构更紧凑。
|
Chukwa
|
Chukwa是基于Hadoop的大集群监控系统,由yahoo贡献。
|
HBase
|
基于Hadoop Distributed File System,是一个开源的,基于列存储模型的分布式数据库。
|
HDFS
|
分布式文件系统
|
Hive
|
hive类似CloudBase,也是基于hadoop分布式计算平台上的提供data warehouse的sql功能的一套软件。使得存储在hadoop里面的海量数据 的汇总,即席查询简单化。hive提供了一套QL的查询语言,以sql为基础,使用起来很方便。
|
MapReduce
|
实现了MapReduce编程框架
|
Pig
|
Pig是SQL-like语言,是在MapReduce上构建的一种高级查询语言,把一些运算编译进MapReduce模型的Map和Reduce中,并且用户可以定义自己的功能。Yahoo网格运算部门开发的又一个克隆Google的项目Sawzall。
|
ZooKeeper
|
Zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、 分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
|
3. 演练环境
3.1. 操作系统
SuSE10,Linux2.6.16,32位版本。
3.2. Hadoop
Hive通过SVN直接从网上下载原代码,其它采用hadoop-0.20.0.tar.gz二进制安装包,所以只需要编译Hive。
另外,请注意不要下载2009-8-19号的Hive,2009-8-19提交的Hive版本在hadoop-0.20.0.tar.gz上编译通不过,原因是:
Hive源代码根目录\ql\src\java\org\apache\hadoop\hive\ql\exec\FileSinkOperator.java文件中多了一行:
import org.apache.hadoop.io.compress.LzoCodec;
而应当下载2009-8-4号和2009-8-19之间的版本,或2009-8-19之后的版本。
3.3. Hive
在0.20.0版本的Hadoop二进制安装包中,并没有集成Hive,所以Hive需要自己编译,编译时需要使用到ant和ivy两个工具,而且依赖于Hadoop。
3.4. Java
运行Hadoop和编译Hive,都需要使用到Java,所以需要第一个安装的是Java。
3.5. 机器
演练时,在3台机器上搭建Hadoop集群,假设这3台机器如下表所示:
机器名
|
机器IP
|
用途
|
Hadoop-A
|
192.168.0.1
|
用作Master
|
Hadoop-B
|
192.168.0.2
|
用作Slave
|
Hadoop-C
|
192.168.0.3
|
用作Slave
|
注意事项:机器名中不能包括下划线“_”,但可以包括横线。另可使用不带参数的hostname来查看机器名,修改机器名方法为:hostname 机器名,如:hostname Hadoop-A。 另外,集群内所有的机器登录用户名和密码要保 持相同。
3.6. 安装列表
安装
|
说明
|
Java 1.6
|
A、B和C三台机器都需要安装
|
Hadoop 0.20.0
|
A、B和C三台机器都需要安装
|
Hive
|
只需要在B和C两台机器上安装,也就是Slave机器不需要安装
|
ant
|
只需要在B和C两台机器上安装,也就是Slave机器不需要安装
|
ivy
|
只需要在B和C两台机器上安装,也就是Slave机器不需要安装
|
注意事项:为求简单所有操作均以root用户完成,实际上可以使用非root用户,但环境变量就不能直接在/etc/profile文件中添加了。
4. 配置ssh2和修改/etc/hosts
需要在所有机器上配置ssh2和修改/etc/hosts。
4.1. 配置ssh2
1) mkdir ~/.ssh2 # 如果~/.ssh2目录已经存在,则这一步可以跳过
2) cd ~/.ssh2
3) ssh-keygen2 -t rsa
4) echo "IdKey id_rsa_2048_a" > identification
5) echo "key id_rsa_2048_a.pub" > authorization
4.2. 修改/etc/hosts
1) 在/etc/hosts文件中增加如下三行:
192.168.0.1 Hadoop-A
192.168.0.2 Hadoop-B
192.168.0.3 Hadoop-C
并根据上述关系,使用hostname命令修改三台机器的机器名。
5. 安装Java
1) 从http://www.java.com/zh_CN/download/manual.jsp 下载jre,请注意是Java1.6版本,原因是Hadoop和Hive使用到了模板等特性
2) 下载“Linux (自解压文件)”这个版本的jre,如下图所示
3) 将下载的Java二进制安装包jre-6u15-linux-i586.bin上传到/usr/local目录
4) 为jre-6u15-linux-i586.bin文件增加可执行权限:chmod +x jre-6u15-linux-i586.bin
5) 运行jre-6u15-linux-i586.bin:./jre-6u15-linux-i586.bin
6) 用户协议接受,选择yes
7) 安装成功后,在/etc/profile增加如下一行:
export PATH=/usr/local/jdk/bin:$PATH
6. 安装Hadoop
1) 从http://hadoop.apache.org/common/releases.html 下载Hadoop二进制安装包hadoop-0.20.0.tar.gz
2) 将hadoop-0.20.0.tar.gz上 传到/usr/local目录
3) 在/usr/local目录,将hadoop-0.20.0.tar.gz解压
4) 为hadoop-0.20.0建一个软链接:ln -s hadoop-0.20.0 hadoop
5) 在/etc/profile文件中,增加如下两 行:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
完成以上步骤后,Hadoop就安装好了。
7. 配置HDFS
7.1. 修改hadoop-env.sh
所有机器做同样操作。
hadoop-env.sh位于/usr/local/hadoop/conf目录下,需要在这个文件中设置环境变量JAVA_HOME,增加如下一行即可:
export JAVA_HOME=/usr/local/jre
7.2. 修改core-site.xml
所有机器做同样操作。
在hadoop-0.20.0.tar.gz安装包中,conf目录下的core-site.xml默认是空的,但src/core目录下有一个缺省的配置文 件core-default.xml,所以只需要将它复制到conf目录下,并重命名成core-site.xml即可,下述操作都是基于此操作的。
core-site.xml文件位于/usr/local/hadoop/conf目录下。
7.2.1. hadoop.tmp.dir
设置临时文件目录参数hadoop.tmp.dir,默认情况下master会将元数据等存在这个目录下,而slave会将所有上传的文件放在这个目录下,在这里数据目录统一为/usr/local/hadoop/data:
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data</value>
<description>A base for other temporary directories.</description>
</property>
注意事 项:由于上传到Hadoop的所有文件都会被存放在hadoop.tmp.dir所指定的目录,所以要确保这个目录是足够大的。
7.2.2. fs.default.name
master用这个参数,提供基于http协议的状态上报界面,而slave通过这个地址连接master,设置如下:
<property>
<name>fs.default.name</name>
<value>hdfs://Hadoop-A:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>