这篇文章介绍的是简单的配置Hadoop集群的方法,适合实验和小型项目用,正式运行的集群需要用更正规的方法和更详细的参数配置,不适合使用这篇文章。

相关随笔:

安装 JDK

在终端输入

$ java -version

如果有反应,说明已安装过jdk。如果显示的信息里出现了类似OpenJDK的字样,如

java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.2) (6b20-1.9.2-0ubuntu1~10.04.1)
OpenJDK Server VM (build 19.0-b09, mixed mode)

则需要卸载OpenJDK,改用Hadoop使用的Sun JDK。

关于如何卸载OpenJDK和安装Sun JDK,参考 How to correctly remove OpenJDK/OpenJRE and set SunJDK/SunJRE as Default

*注:如果不想用ppa安装,也可以用解压缩-加链接-配置环境变量的办法,网上教程很多,具体google “sun jdk install”即可,此处不赘述

安装完成后检查

$ java -version

如果出现

java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

说明java安装成功。

$ echo $JAVA_HOME

出现java的安装目录,说明环境变量添加成功。同理需要查看$CLASSPATH,并查看java安装目录下的bin文件夹是否添加进了$PATH

设置专用账户

hadoop会利用用户名来配置目录结构,为了配置方便最好保证每台机子上都有一个给hadoop使用的账户,且名字相同(如果每台机子账户不同,需要做很多多余的配置)。

添加用户与用户组

假设需要添加hd用户组,再在其中添加hadoop用户

$ sudo addgroup hd
$ sudo adduser --ingroup hd hadoop

添加 sudo 权限

$ sudo visudo

打开etc/sudoers为新添加的用户添加sudo权限。

找到

# User privilege specification
root ALL=(ALL:ALL) ALL

在下面加上

hadoop  ALL=(ALL:ALL) ALL

就能让hadoop这个用户拥有sudo的权限。其他用户名类推。

注意这个文件只能用visudo打开,且绝对不能修改其权限。

切换用户

$ su hadoop

即可切换到hadoop这个用户。以下操作最好都在为hadoop预留的账户中进行(因为ssh的钥匙都是保存在用户文件夹中的)

配置 host 与打通连接

修改 /etc/hostname

为了方便管理,可以将每台机器的hostname修改掉。比如,根据为每台机器设置的不同角色,分别命名为master,slave1,slave2……

ubuntu上需要

$ sudo vi /etc/hostname

默认是机器的名字(比如ubuntu),将其修改成对应的hostname,比如master,slave1等

修改后不会立即生效,需要重启。如果想立刻生效,直接在终端敲类似命令:

$ hostname master

想要检查当前hostname,可以直接敲

$ hostname

修改 /etc/hosts

为了方便记忆和管理,最好将每台机器的ip在hosts文件内做映射

$ sudo vi /etc/hosts

检查防火墙

如果开启了防火墙,建议关闭或打开需要联通的端口。

ubuntu一般自带的是ufw防火墙,如何查看与关闭防火墙、配置特定端口请看 Ubuntu中文wiki上的文档

关闭 ipv6

请看 Micheal Noll的教程中关于禁用ipv6的步骤

检查联通状况

为每台机器设置好hosts文件和hostname后,在每台机器上ping其他机器即可。

如果机器比较多,可以写个脚本帮忙。同样地,hosts文件可以在一台机器上配置好后复制到其他机器上,对涉及到127.0.1.1和自己的ip的部分稍作修改即可。

配置无密码 ssh

检查 openssh-server

ubuntu下

$ sudo apt-get install openssh-server

即可。有则提示已经是最新版,没有或版本太老则安装或更新。

修改配置与生效

配置无密码SSH过程中可能会出现Host key verification failed错误。最简单的解决办法之一就是在每台机的/etc/ssh/ssh_config中设置

StrictHostKeyChecking no

如果这项已经设置过,修改之。如果没有设置过(默认应该是设置为ask且注释掉的),可以在下面添加,或取消注释并修改为no。

  • 注意这里一般是对Host *设置的StrictHostKeyChecking no,会对所有SSH key的检查都放宽要求。如果不想这么做,可以google其他解决方案。

在/etc/ssh/sshd_config中设置

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

同样可以修改、取消注释或在下面添加。

然后

service ssh restart

令配置生效。

生成密钥

如果之前机子上生成过密钥可以跳过这一步,否则需要生成密钥。 使用

$ ssh-keygen -t rsa -P ''

一路回车,在~/.ssh目录下生成一对没有passphrase的密钥。

这里不设置passphrase是为了后面认证登陆的时候不用每台机子都输入,会方便一些。

接着

cat id_rsa.pub >> authorized_keys

对生成的公钥进行授权

检查权限

$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh

保证关键的文件和文件夹权限正确(太高或太低的权限会导致无法无密码ssh)

分发公钥

为了方便我们可以让所有机器都能互相无密码ssh。在每台salve用

$ ssh-copy-id -i id_rsa.pub master

将公钥汇总到master的authorized_key中,再让master将公钥分发到每台机器上即可。比如使用

$ scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/authorized_keys

即可将master的authorized_keys覆盖掉slave1的authorized_keys(注意这是覆盖,如果只是想追加,可以用cat+管道,具体google即可)

安装 Hadoop

获取及解压 (每台)

去到官网下载安装包,安装路径随意,按照Linux的惯例可以自己看着装到/opt或者/usr/local,或者直接安装在用户文件夹。

这里将安装包解压到/usr/local/hadoop,然后在/usr/local目录下

chown -R hd:hadoop hadoop

确保能够随意操作这个文件夹。

配置环境变量 (每台)

再配置环境变量,指明Hadoop所在路径,将路径下的bin文件夹加入PATH以使用Hadoop提供的各种脚本 编辑hadoop用户的.bashrc文件

$ vi ~/.bashrc

添加

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

注:$HADOOP_HOME是旧版Hadoop用的环境变量名,所以如果你用这个名字,在运行Hadoop的时候会得到

$HADOOP_HOME is deprecated

的警告。但是这里设成$HADOOP_HOME也不会有什么大碍。如果你觉得这个警告很烦不想看到,也可以用$HADOOP_PREFIX这个新版的名字。

接下来还需要配置hadoop-env.sh中的JAVA_HOME为对应jdk安装目录。

$ vi $HADOOP_HOME/conf/hadoop-env.sh

找到

export JAVA_HOME=....

这一行,将等号后的东西改成你JAVA的实际安装目录。

配置 masters 及 slaves (master上)

配置conf下的masters及slaves文件为对应分配好的hostname。

如masters

master

slaves

slave1
slave2
...

配置 *-site.xml (每台)

配置core-site.xml。有一些配置是最好要改的,参见[YDN] Hadoop 配置注意事项 的Important Directories一节。这里修改两个比较重要的配置,默认dfs.name.dir、dfs.data.dir和mapred.system.dir均放在hadoop.tmp.dir下,这些文件夹存有NameNode和DataNode的数据和各种系统资料,而hadoop.tmp.dir却默认放在/tmp/hadoop-${user.name},这意味着重启之后这些东西很可能全都没了。在正式的集群中,这些子文件夹最好放在不依赖于hadoop.tmp.dir的地方。这里为了方便,我们直接先修改hadoop.tmp.dir来改变其他子文件夹,将它放在hadoop安装目录的tmp文件夹,并且显式指明默认的Namenode位置fs.default.name为master的9000端口。

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>

参数意义参见http://hadoop.apache.org/docs/r1.0.4/core-default.html,往右拖可以看到description(这令人无力的表格列宽……)

配置hdfs-site.xml,这里修改dfs.replication即备份多少副本,1的话就是不备份。注意这个值不能超过Datanode的数目。

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<configuration>

参数意义参见http://hadoop.apache.org/docs/r1.0.4/hdfs-default.html

配置mapred-site.xml,这里指明所有的node在找jobtracker时都要去找master的9001端口。

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>

参数意义参见http://hadoop.apache.org/docs/r1.0.4/mapred-default.html
在实际运行的时候也建议将mapred.tasktracker.reduce.tasks.maximum的值增大以增加reducer slots的数目,提高效率。一般指定mapred-site.xml为所在机子的CPU核数-1比较合理。

添加路径

在hadoop目录下新建tmp文件夹(这里是为了配合上一步中core-site.xml中指定的hadoop.tmp.dir。如果你没有用上一步一样的路径也可以,只要确保这个文件夹存在就行)。

运行 Hadoop

格式化 HDFS

先确保tmp文件夹下都是空的(否则spaceID不一致又不去手动改的话会各种报错),然后`

$ hadoop namenode -format

启动 Hadoop

启动时分开启动,start-all是给单节点用的

$ start-dfs.sh
$ start-mapred.sh

检查 jps

这时候可以检查守护进程是否启动。master上运行

$ jps

应该会看到NameNode,SecondaryNameNode,JobTracker。slave上运行jps则会看到DataNode和TaskTracker。 如果无法执行jps,可以检查一下java安装目录下的bin文件夹是否在$PATH环境变量中。如果没有,需要修改.bashrc或/etc/profile配置好环境变量。

检查 HDFS

$ hadoop dfsadmin -report

会看到整个hdfs的状态,可以检查一下datanode是否都检测到了。

检查 Web UI

可以在master的浏览器上访问

http://localhost:50070/ 检查namenode,也可以查看HDFS
http://localhost:50030/ 可以检查job的运行状态
http://localhost:50060/ 检查task的运行状态

测试运行 example

pi

在hadoop安装目录下

$ hadoop jar hadoop-examples-1.0.4.jar pi 10 100

wordcount

参见[Michael Noll系列教程] 单节点配置

Hadoop Streaming with python

参见[Michael Noll系列教程] 使用 python 编写 Hadoop 程序

参考链接

相关资源

Troubleshooting

Datanode 无法启动

很常见的一个原因是在tmp文件夹非空的时候执行了hadoop namenode -format。解决方案有两个:

  1. 删掉hadoop.tmp.dir(可能还有dfs.name.dir和dfs.data.dir,如果你有自己设定)指定路径下的东西,然后hadoop namenode -format
  2. 修改spaceID,参见http://www.youtube.com/watch?v=jJmOAvxE2GU

Tips

如何在运行时撤下 Slave

参见http://www.youtube.com/watch?v=jJmOAvxE2GU,简单来说就是

  1. 配置hdfs-site.xml里的dfs.hosts.exclude为一个文件
  2. 在这个文件里写上要撤下的slave的host name
  3. 执行 hadoop dfsadmin -refreshNodes

Hadoop-1.0.4集群搭建笔记的更多相关文章

  1. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  2. Redis 5.0.5集群搭建

    Redis 5.0.5集群搭建 一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):s ...

  3. 28.zookeeper单机(Standalones模式)和集群搭建笔记

    zookeeper单机(Standalones模式)和集群搭建: 前奏: (1).zookeeper也可以在windows下使用,和linux一样可以单机也可以集群,具体就是解压zookeeper-3 ...

  4. 25.redis集群搭建笔记

    ###Redis集群### 0.准备 软件: redis-3.0.0.gem redis-3.0.0.tar.gz#源码   1.安装ruby环境 redis基于ruby槽位计算,hash算法技术,k ...

  5. Hadoop2.0 HA集群搭建步骤

    上一次搭建的Hadoop是一个伪分布式的,这次我们做一个用于个人的Hadoop集群(希望对大家搭建集群有所帮助): 集群节点分配: Park01 Zookeeper NameNode (active) ...

  6. CDH 6.0.1 集群搭建 「After install」

    集群搭建完成之后其实还有很多配置工作要做,这里我列举一些我去做的一些. 首先是去把 zk 的角色重新分配一下,不知道是不是我在配置的时候遗漏了什么在启动之后就有报警说目前只能检查到一个节点.去将 zk ...

  7. CDH 6.0.1 集群搭建 「Before install」

    从这一篇文章开始会有三篇文章依次介绍集群搭建 「Before install」 「Process」 「After install」 继上一篇使用 docker 部署单机 CDH 的文章,当我们使用 d ...

  8. 高可用Hadoop平台-HBase集群搭建

    1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...

  9. Hadoop HA高可用集群搭建(2.7.2)

    1.集群规划: 主机名        IP                安装的软件                            执行的进程 drguo1  192.168.80.149 j ...

随机推荐

  1. Java初学者笔记四:按行读写文件和输入处理

    一.我们来看python的很简单: 1.读文件: with open("/path/file","r") as fr: for line in fr.readl ...

  2. 【BZOJ3678】wangxz与OJ Splay

    [BZOJ3678]wangxz与OJ Description 某天,wangxz神犇来到了一个信息学在线评测系统(Online Judge).由于他是一位哲♂学的神犇,所以他不打算做题.他发现这些题 ...

  3. Jenkins之构建执行脚本权限问题

    Jenkins需要执行的脚本不在本机需要ssh免密码登陆到远程主机执行 Jenkins部署机ip地址为192.168.56.12 需要远程执行脚本的主机为192.168.56.11 设置好密钥可以使用 ...

  4. pandas的merge方法

    数据合并时可以使用merge方法,对两个dataFrame根据某一个series合并,这个方法非常好用,只要找到了合并的标准,新的数据就可以重构出来. 1.命令: pd.merge() on:列名,j ...

  5. rk3188 双屏异显分析

      首先是android层: PhoneWindow.java 中加入了GestureDetector成员, 来实现全局滑屏手势监听 onFling方法中,调用了mDecor.getRootWindo ...

  6. Django - rest - framework - 下

    一.视图三部曲 https://www.cnblogs.com/wupeiqi/articles/7805382.html 使用混合(mixins) 之前得视图部分 # urls.py from dj ...

  7. python基础之迭代器协议和生成器

    迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...

  8. Python开发【Tornado】:简介与使用

    Tornado框架 简介: Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和 ...

  9. Java-idea-FindBugs、PMD和CheckStyle对比

    一.对比 工具 目的 检查项 备注 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode (.class文件)中的潜在bug 主要检查bytecode中的 ...

  10. django之中间件、缓存、信号、admin内置后台

    目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...