背景

之前的时间里对 Hadoop 的使用都是基于学长所搭建起的实验环境的,没有完整的自己部署和维护过,最近抽时间初体验了在集群环境下装机、配置、运行的全过程,梳理总结到本文中。

配置

  • 内存:8G
  • CPU:i5-2400 3.1GHz;
  • 硬盘:960G
  • 系统:windows 7 旗舰 64bits

  • 虚拟机:VMware7.1.1
  • 虚拟集群:
    • T (master 节点)Ubuntu11.04 32 bits 内存 512MB;硬盘 100G;单核;
    • T2(slave 节点) Ubuntu11.04 32 bits 内存 512MB;硬盘 100G;单核;
    • T3(slave 节点) Ubuntu11.04 32 bits 内存 512MB;硬盘 100G;单核;
    • T4(slave 节点) Ubuntu11.04 32 bits 内存 512MB;硬盘 100G;单核;

环境准备

1.节点机器的配置

配置固定 IP:修改/etc/nerwork/interfaces

1
2
3
4
5
6
auto lo
iface lo inet loopback
address 192.168.108.131
gateway 192.168.108.2
netmask 192.168.108.0
broadcast 192.168.108.0

为了便于管理,建议按统一约定修改 hostname:修改/etc/hostname;同时,Hadoop 集群要求每个节点使用同一个账号来管理、运行,所以,也需要设置好公用账号。

2.集群 ssh 配置

ssh 相关原理和操作,参见博文《SSH 原理和使用》

在每台机器上生成密钥对,并将所有机器的公钥集成到 master 的~/.ssh/authorized_keys中,之后将这个文件分发到集群所有机器上。
这样,所有机器之间都可以实现免密码的 ssh 访问了。

使用如下指令,可以将本机的公钥添加到 master 的 authorized_keys 文件末尾。当所有节点都执行一遍以后,再将 master 的 authorized_keys 发布到各个节点上。

1
#cat .ssh/id_rsa.pub | ssh T 'cat >> ~/.ssh/authorized_keys'
3.工具脚本

在分布式的环境里,运维工作的自动化很有必要。为了方便集群的运维,我写了两个简单的 batch 脚本。

统一执行脚本

在所有节点上执行同样的动作。使用时,在 master 节点上调用 batch 脚本,参数为对应的 batch 执行语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#Program:
# Execute instructions in hosts in slaveslist.
#Description:
#2013/5/8 biaobiaoqi First Release
if [ $# -lt 1 ]; then
echo "usage: $0 COMMAND"
exit 0
fi for i in `cat slaveslist`
do
ssh biaobiaoqi@$i "$1"
done

脚本中使用的 slaveslist 文件保存着所有 slave 节点的 hostname,需要与脚本放在同一个工作目录下。

统一替部署脚本

将主节点的某文件或目录统一的更新部署替换到所有节点上(注意,所有节点拥有相同的目录结构,即替换的文件路径相同)。

遇到 hadoop 集群中节点的增删改动需要修改配置文件的,都可以通过这个脚本便捷的部署。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#Program:
# Put the dirctory into all nodes of the cluster as the same path.
#Description:
#2013/5/10 biaobiaoqi First Release
if [ $# -lt 1 ]; then
echo "Usage $0 DIR_PATH"
exit 0
fi for i in `cat slaveslist`
do
ssh $i "rm ~/tmp -rf"
scp -r $1 $i:~/tmp
ssh $i "rm -rf $1; mv ~/tmp $1"
done
4.配置 hosts 文件

由于 hadoop 体系在处理节点时,是使用的 hostname,而非 IP,所以必须先配置好 hostname 和 IP 的关系。
在一台机器上修改/etc/hosts

1
2
3
4
5
6
#/etc/hosts
127.0.0.1 localhost
192.168.108.128 T3
192.168.108.129 T2
192.168.108.130 T
192.168.108.131 T4

然后使用统一执行脚本,将它发布到所有节点上。

值得注意的是,在/etc/hostsname中修改了 host name 之后,如果不同步的修改/etc/hosts中的相关信息,则在 sudo 操作时出现 sudo: unable to resolve host 的提示。原因是机器无法解析主机名。

修改/etc/hosts时也要特别注意,如果改成127.0.0.1 localhost HOSTNAME (其中 HOSTNAME 是主机名)的形式,在开启 hadoop 集群时,会出现 datanode 无法正常访问 namenode,算是个小 bug 吧。所以得把 hosts 文件写成如上的形式。

5.配置 Java 环境

Hadoop 需要 Java1.6 或更高版本,记住 Java 的安装目录,之后需要在 hadoop 配置过程中用到。

安装 Hadoop

1.下载 Hadoop

从官网下载 Hadoop 发布版(博主使用的是较早的稳定版 0.20.2)

关于版本选择,推荐阅读:Hadoop 版本选择探讨

2.部署

解压下载好的 Hadoop,后放到合适的目录下。这里假定放置在/home/USER/ 的目录下

/home/USER/.bashrc(其中 USER 为集群的用户名)文件中,增加如下语句,设定 Hadoop 相关的路径信息:

1
2
3
4
5
6
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export HADOOP_HOME=/home/hadoop/Hadoop
export HADOOP_CONF=$HADOOP_HOME/conf
export HADOOP_PATH=$HADOOP_HOME/bin
export PATH=$HADOOP_PATH:$PATH
export CLASSPATH=.:$JAVA_HOME/bin:$PATH:$HADOOP_HOME:$HADOOP_HOME/bin
Hadoop 核心配置修改

配置文件在$HADOOP_HOME/conf目录下,其中基础配置比较重要的有三个:core-site.xml, hdfs-site.xml, mapred-site.xml。(当然,每个配置文件都有其细节作用,不过在初步实践 hadoop 时,理解这三个配置文件中的几个重要配置项就够了)

一般的,有三种可选模式。即本地模式、伪分布式模式和全分布式模式。前两种只是在单机环境下,后一种才是生产环境下的常用方式。《Hadoop 权威指南》和《Hadoop 实战》等书中都有讲到不同方式的配置,这里博主仅描述实验环境下 4 节点的全分布式配置。

core-site.xml 整个 hadoop 的顶层配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/biaobiaoqi/UDMS/hadoop-data/tmp-base</value>
<description>
存放临时目录的路径,默认也被用来存储 hdfs 的元数据和文件数据,值得注意的是,hadoop 账户对所设定的本地路径是否有足够的操作权限。之后再 hdfs-site.xml 中设定的 dfs.data.dir 和 dfs.name.dir 也要注意同样的问题
</description>
</property> <property>
<name>fs.default.name</name>
<value>hdfs://T:9000/</value>
<description>
默认文件系统的标记。这个 URI 标记了文件系统的实现方式。UIR 的协议决定了文件系统的实现类,而后面的值决定了文件系统的地址、端口等信息。
</description>
</property> </configuration>

hdfs-site.xml 存储 HDFS 相关的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>默认的块的副本数量。实际的副本数量可以在文件写入的时候确定,默认的副本数则是在没有指定写入副本时被使用。 </description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop-data/meta-data</value>
<description>
设定 hdfs 的元数据信息存储地址。在 namenode 上。
</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop-data/data</value>
<description>
设定 hdfs 的数据存储地址。在 datanode 上。
</description>
</property> </configuration>

mapred-site.xml 存储 mapreduce 作业相关配置

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration>
<property>
<name>mapred.job.tracker</name>
<value>T:9001</value>
<description> Mapreduce 的 job tracker 所在的节点和端口。</description>
</property>
</configuration>

hosts 文件存储了 master 节点

1
T

slaves 文件存储着所有的 slaves 节点

1
2
3
T2
T3
T4

启动集群

1.格式化 namenode

如果是第一次起动集群,需要先格式化 HDFS。

namenode 存放了 HDFS 的元数据,故可以看成是对 HDFS 的格式化。

1
$HADOOP_HOME/bin/hadoop namenode -format
2.启动守护进程
1
$HADOOP_HOME/bin/start-all.sh 

等价于如下命令执行:

1
2
3
4
5
# start dfs daemons
$"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR # start mapred daemons
$"$bin"/start-mapred.sh --config $HADOOP_CONF_DIR

如果成功,打开 http://T:50070 (T 为集群 master 节点),可以看到 HDFS 的运行情况,包括节点数量、空间大小等。这是 Hadoop 自带的 HDFS 监控页面;同样的,http://T:50030 是 Mapreduce 的监控界面。

如果没有成功,根据$HADOOP_HOME/logs 目录下的日志文件信息 debug。

3.常见问题
  • namenode 无法启动:
    • 删除掉本地文件系统中 HDFS 的目录文件,重新格式化 HDFS。
    • HDFS 目录的权限不够,更改权限设置等。
  • namenode 启动成功,datanode 无法连接:检查 hosts 文件是否设置正确;检查各个配置文件中地址值是否使用了 IP 而不是 hostname。
  • namenode 启动成功,datanode 无法启动:Incompatible namespaceIDs,由于频繁格式化,造成 dfs.name.dir/current/VERSION 与 dfs.data.dir/current/VERSION 数据不一致。
  • SafeModeException: 分布式系统启动时,会进入安全模式,安全模式下,hadoop 是无法执行的。一般的等待一会儿,就可以正常使用了。如果是由于之前集群崩溃造成的无法自动退出安全模式的情况,则需要如下特殊处理了
1
$/$HADOOP_HOME/bin/hadoop dfsadmin -safemode leave 

初体验

最简单的尝试就是使用 Hadoop 自带的 wordcount 程序了,参照这篇文章,描述很详细。

其他的一些尝试: 动态增删节点修改备份数量

参考

offical document: Cluster Setup

 原文地址:http://biaobiaoqi.github.com/blog/2013/05/12/touch-hadoop/
 版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0

全分布式的Hadoop初体验的更多相关文章

  1. Hadoop 初体验

    Hadoop 是一个基于谷歌发表的几篇论文而开发的一个分布式系统基础架构,用户可在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop现在已经成了大数据的代 ...

  2. Hadoop初体验(续)--YARN

    1.Hadoop已经安装完成并启动成功 复制mapred-site.xml.template重命名为mapred-site.xml /etc/hadoop/mapred-site.xml.templa ...

  3. Hadoop初体验

    1.首先准备环境 系统:Linux(centOS) jdk:1.7 这里jdk要安装配置完成,具体步骤参考:Linux环境下安装JDK 注意:本次没有配置免密登录,所以在启动和停止的时候回让你输入多次 ...

  4. 全分布式的Hadoop虚拟机安装

    在集群环境下装机.配置.运行的全过程,梳理总结到本文中. 第一部分:环境规划 •用户 hadoop 密码 hadoop •机器 机器名称 IP地址 Master.Hadoop 192.168.1.10 ...

  5. 分布式存储系统GlusterFS初体验

    摘要: GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端.GlusterFS ...

  6. 分布式任务调度XXL-JOB初体验

    简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 官方文档很完善,不多赘述.本文主要是搭建XX ...

  7. hadoop备战:一台x86计算机搭建hadoop的全分布式集群

    主要的软硬件配置: x86台式机,window7  64位系统 vb虚拟机(x86的台式机至少是4G内存,才干开3台虚机) centos6.4操作系统 hadoop-1.1.2.tar.gz jdk- ...

  8. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  9. 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

随机推荐

  1. 关于mysql事务行锁for update实现写锁的功能

    关于mysql事务行锁for update实现写锁的功能 读后感:用切面编程的理论来讲,数据库的锁对于业务来说是透明的.spring的事务管理代码,业务逻辑代码,表锁,应该是三个不同的设计层面. 在电 ...

  2. Android5.0(Lollipop) BLE蓝牙4.0+浅析code(二)

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/23347612来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Android5.0(L ...

  3. css 单行图片文字水平垂直居中汇总

    (1) 水平居中 a. 行内元素水平居中 因为img是行内元素(行内块级元素也一样)父级元素设置text-align:center即可,例如: <div style="width: 6 ...

  4. jQuery 中 is() 函数常见使用方法

    依据选择器.DOM元素或 jQuery 对象来检測匹配元素集合.假设当中至少有一个元素符合这个给定的表达式就返回true. 假设没有元素符合,或者表达式无效.都返回'false'. '''注意:''' ...

  5. HDU - 3078 Network(暴力+LCA)

    题目大意:给出n个点的权值.m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上第k大的权值点 解题思路:该点的话直接该,找第k大的话直接暴力 #include ...

  6. cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系

    CPU的物理封装,一个物理封装使用独立的一个CPU物理插槽,共享电源和风扇: CPU物理核心:在一个物理封装中封装了多个独立CPU核心,每一个CPU核心都有自己独立的完整硬件单元. CPU逻辑核心:一 ...

  7. 怎样收缩超大的SharePoint_Config数据库

    前言 在已经执行了2年多的SharePointserver上,发现SharePoint_Config的数据库文件越来越大,已经达到90几个GB,收缩能够减小20几个GB,可是一周以后又会恢复到90几个 ...

  8. php实现二叉树遍历

    php实现二叉树遍历 一.总结 关注输入输出 二.php实现二叉树遍历 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串 ...

  9. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(8)枚举、补码

    一.枚举 # include <stdio.h> enum WeekDay //定义了一个数据类型(值只能写以下值) { MonDay, TuesDay, WednesDay, Thurs ...

  10. 【32.89%】【codeforces 719A】Vitya in the Countryside

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...