This website requires JavaScript.

Hadoop 群集部署

本教程使用CentOS 6.5 64位作为系统环境.基于Hadoop 2.6.3 . 本教程使用三个节点一个为Master 节点局域网IP  192.168.3.153 ;另外两个Slave节点分别是Slave1 192.168.3.156 ,Slave2 192.168.3.157.

主要参考了Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS 和Hadoop:The Definitive Guide一书

准备工作

  1. 选定一台机器作为 Master
  2. 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
  3. 在 Master 节点上安装 Hadoop,并完成配置
  4. 在其他 Slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境 具体可以参考之前的文章Hadoop 单机/伪分布式安装

网络配置

关闭防火墙

CentOS6.X

sudo service iptables stop   # 关闭防火墙服务 sudo chkconfig iptables off  # 禁止防火墙开机自启,就不用手动关闭了
CentOS7.X
systemctl stop firewalld.service    # 关闭firewall systemctl disable firewalld.service # 禁止firewall开机启动
修改所有机器的主机名

sudo vim /etc/sysconfig/network

修改所有机器hosts 设置IP映射

sudo vim /etc/hosts
192.168.3.153 Master
192.168.3.156 Slave1
192.168.3.157 Slave2
注意如果修改过主机名,因此需要重启一次

SSH无密码登陆节点

这个操作是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上。

首先生成 Master 节点的公匙,在 Master 节点的终端中执行(因为改过主机名,所以还需要删掉原有的再重新生成一次):

cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost rm ./id_rsa*            # 删除之前生成的公匙(如果有) ssh-keygen -t rsa       # 一直按回车就可以
让 Master 节点需能无密码 SSH 本机,在 Master 节点上执行:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
完成后可执行 `ssh Master` 验证一下(可能需要输入 yes,成功后执行 `exit` 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 和Slave2节点
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@Slave2:/home/hadoop/
接着在 Slave1 ,Slave2 节点上,将 ssh 公匙加入授权:
mkdir ~/.ssh       # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 .ssh/
chmod 600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub    # 用完就可以删掉了
**解释:**

Hadoop控制脚本(非守护进程)依赖SSH来执行针对整个群集的操作.例如某个脚本能够终止并重启群集中所有守护进程.(当然用户可以利用其他方式执行群及范围的操作,如分布式shell)

为了支持无缝式工作.SSH安装好以后允许hadoop用户无需输入密码即可登录群集内机器.简单的方法就是创建公钥/私钥 并存放在NFS中,让整个集群共享该秘钥对.

以某hadoop用户账号登录后,键入以下指令来产生一个RSA密钥对.

%ssh-keygen –t rsa –f ~/.ssh/id_rsa

尽管期望无密码登陆,但是无口令的秘钥并不是一个好的选择(伪分布式群集的时候我们建立了一个空口令) 因此,当系统提示输入口令时,用户最好指定一个口令.可以使用ssh-agent以免为每个连接逐一输入密码.

-f选项指定秘钥存放的文件,例如~/.ssh/id_rsa.存放公钥的文件名与秘钥类似,但是以”.pub”作为后缀,例如~/.ssh/id_rea.pub

接下来只要把公钥存放在用户打算连接的所有机器的 ~/.ssh/authorized_keys 文件中.  如果hadoop用户的home目录是在NFS文件系统中则可以输入一下命令在整个群集内共享秘钥.

% cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果home 目录并没有通过NFS共享,则需要利用其他方式共享密钥(比如ssh-copy-id)

测试是否可以从主服务器SSH到工作机.若可以.则标明ssh-agent正在运行.再运行ssh-add来存储口令,这样的话用户就可以不用在输入口令.

Hadoop配置

文件名称 格式 描述
hadoop-env.sh Bash 脚本 记录了运行Hadoop的环境变量
mapred-env.sh Bash 脚本 记录了运行MapReduce的环境变量,会覆盖hadoop-env.sh中的设置
yarn-env.sh Bash 脚本 记录了运行YARN的环境变量,会覆盖hadoop-env.sh设置
core-site.xml Hadoop 配置XML Hadoop Core的配置项,例如HDFS和MapReduce常用的I/O设置等
hdfs-site.xml Hadoop配置XML Hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等
mapred-site.xml Hadoop配置XML MapReduce 守护进程的配置项,包括jobtracker 和 tasktracker
yarn-site.xml Hadoop 配置XML 配置YARN守护进程: resource manager ,proxy server , node managers
slaves 纯文本 datanode和node manager的清单(一行一个)
hadoop-metrics2.properties Java属性 控制如何在Hadoop上发布度量的属性
log4j.properties Java属性 系统之日属性,JVM进程的namenode 审计日志,任务日志等
hadoop-policy.xml Hadoop 配置XML 配置当Hadoop运行在安全模式下的时候进行访问控制
所有配置文件均可在 etc/hadoop 目录下找到,如果配置文件放到了其他地方,启动的时候加上 –config 参数来指定 或者声明 HADOOP_CONF_DIR环境变量

Hadoop并没有将所有配置信息放在一个单独的全局位置中.反之,群集的每个Hadoop节点都各自保存一系列的配置文件,并由管理员完成这些配置文件的同步工作.

Hadoop内置一些脚本来运行指令、在群集内启动和终止守护进程。为了运行这些脚本,需要预先知道群内所有机器。有两个文件能达成该目标。即masters和slaves。各个文件逐行记录一些机器的名称或IP地址。masters文件这个名字有点误导人,实际上记录运行辅助namenode的所有机器。slaves文件则记录了运行datanode和tasktracker的所有机器。两个文件存放在配置目录之中。用户也可以改变hadoop-env.sh的HADOOP_SLAVES的值,将slaves文件放在其他地方.此外,这些文件无需分发到各个工作节点,因为只有运行在namenode或者jobtracker上的控制脚本能使用这些文件.

环境配置

默认情况下Hadoop为每个守护进程分配1G内存.该内存值由hadoop-env.sh文件的HADOOP_HEAPSIZE参数控制.此外tasktracker启动独立的JVM以分别运行map和reduce任务.

1.修改slaves文件

vim /usr/local/hadoop/etc/hadoop/slaves
slaves文件用来启动DataNode 只要把主机名写入即可,每行一个,默认是localhost,这里我们把他删掉,把两个slave节点加进去

2.core-site.xml

fs.defaultFS 默认文件系统.URI 定义主机名和namenode 的 RPC服务器工作的端口号,默认值是8020.

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://Master</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration>

3.hdfs-site.xml

dfs.replication 因为我们只有两个节点所以这里设置成了2 dfs.namenode.secondary.http-address  第二个namenode节点 dfs.namenode.name.dir 和 dfs.datanode.data.dir  存放 name table 和data 文件的目录

<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>

4. mapred-site.xml

mapreduce.framework.name 使用框架

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>Master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>Master:19888</value> </property> </configuration>

5.yarn-site.xml

<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>Master</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

部署执行

配置修改完毕以后复制将Hadoop复制到各个节点

Maser上进行打包

cd /usr/local sudo rm -r ./hadoop/tmp     # 删除 Hadoop 临时文件 sudo rm -r ./hadoop/logs/*   # 删除日志文件 tar -zcvf ~/hadoop.master.tar.gz ./hadoop   # 先压缩再复制 scp ~/hadoop.master.tar.gz Slave1:/home/hadoop
Slave上进行解压
sudo rm -r /usr/local/hadoop    # 删掉旧的(如果存在) sudo tar -zxvf ~/hadoop.master.tar.gz -C /usr/local sudo chown -R hadoop:hadoop /usr/local/hadoop
启动前格式化一下namenode

hdfs namenode –format
出现一堆信息,不过注意图中两点即可

image

启动Hadoop群集

start-dfs.sh start-yarn.sh mr-jobhistory-daemon.sh start historyserver
启动后用jps 来判断是否成功

image

image

image

以上缺少任意一个进程皆表示有问题

在Master执行hdfs dfsadmin –report  可以查看datanotes,我们有两个节点,因此Live datanodes显示2

image

当然我们也可以直接通过Web页面查看 http://192.168.3.153:8088

伪分布式、分布式配置切换时的注意事项

  1. 从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;

  2. 在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能启动,但后来启动不了,特别是 DataNode 无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 /usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfs namenode -format,再次启动试试。

实例测试

以Hadoop:The Definitive Guide 第二章的例子为例

先放一个文件上去

hadoop fs -put ~/hadoop-book-master/input/ncdc/sample.txt /
Datanode本来是28KB的现在成了48KB,Blocks用了1

image

image

执行MapReduce程序

export HADOOP_CLASSPATH=hadoop-examples.jar hadoop MaxTemperature /sample.txt output
执行成功

image

在Web页面也可以查看处理结果

http://192.168.3.153:8088/cluster

image

查看结果

hadoop fs -cat /user/hadoop/output/part-r-00000

运行程序时,输出目录不能存在

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:

Configuration conf = new Configuration();

Job job = new Job(conf);

/* 删除输出目录 */

Path outputPath = new Path(args[1]);

outputPath.getFileSystem(conf).delete(outputPath, true);  

关闭Hadoop集群

mr-jobhistory-daemon.sh stop historyserver stop-yarn.sh stop-dfs.sh

参考

Hadoop参数汇总

0条评论
avatar