在 Linux 服务器上搭建和配置 Hadoop 集群
实验条件:3台centos服务器,jdk版本1.8.0,Hadoop 版本2.8.0
注:hadoop安装和搭建过程中都是在用户lb的home目录下,master的主机名为host98,slave的主机名分别是host99和host101。
1. ssh远程连接服务器
ssh [username]@hostname
2. 创建新用户并创建用户的home主目录
useradd -d /home/lb lb -m
3. 将当前用户加入sudo用户组中,方便在不修改当前用户组权限的情况下,对某些文件和目录做修改
vi /etc/sudoers
在 root ALL = (ALL) ALL 下添加一行 lb ALL = (ALL) ALL
4. 下载jdk并配置环境变量
1. 用sudo权限创建存放目录
sudo mkdir /etc/java
2. 用curl命令从官网下载最新的jdk
curl -L "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O
从浏览器上得到的下载链接并不是最终的压缩包位置,在这其中经过了3次重定向,所有使用-L参数可以自动对链接进行重定向,第一个-H命令传递了同意证书的cookie,第二个-H命令保持连接的稳定,否则下载速度可能很慢。-O命令才能下载文件,否则只是将内容输出到控制台。
3. 将压缩包解压到当前目录下
sudo tar -zxvf jdk-8u131-linux-x64.tar.gz
4. 配置环境变量
#set Java Environment
export JAVA_HOME=/usr/java/jdk1.8.0
export CLASSPATH=".:$JAVA_HOME/lib:$CLASSPATH"
export PATH="$JAVA_HOME/bin:$PATH"
export JRE_HOME=$JAVA_HOME/jre
修改完成后,在命令行执行source /etc/profile命令使文件生效。使用java -version可察看当前java版本。
5. 手动设置系统默认JDK(不知是否必要)
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk/bin/javac 300
sudo update-alternatives --config java
5. 在CentOS上安装openssh服务并配置免密钥登陆
1. 安装openssh服务
yum install openssh
yum install openssh-server
yum install openssh-clients
对应的删除命令将install改为remove。
2. 修改 sshd_config 配置文件
vi /etc/ssh/sshd_config 启用以下三行
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile
保存并退出,使用 service sshd start 启用ssh服务。
3. 设置当前用户免密钥登陆
进入用户主目录应该存在 .ssh 子目录,否则创建。
执行 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 在 ~/.ssh 子目录下生成公钥和私钥文件。ssh-keygen 代表生成密钥;-t 表示指定生成的密钥类型,rsa 和 dsa 均可;-P 用于提供密语,为空;-f 指定生成的密钥文件。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 将用于认证的公钥加到保存的公钥文件中,密钥和公钥就像是钥匙和锁的关系,公钥加入到在被连接的主机的authorized_keys文件中,私钥自己保存。
注意修改 authorized_keys 文件和 .ssh 子目录的访问权限,很重要!
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
完成以上操作后就可以通过 ssh localhost 完成本机的无密钥访问。
6. 安装并配置hadoop
1. 下载并解压hadoop
通过 http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz 在本机上下载hadoop压缩文件后,使用scp命令进行远程拷贝到服务器。
scp /Users/hope/Downloads/hadoop-2.8.0.tar.gz lb@10.3.242.98:/home/lb
将本地路径下的 hadoop-2.8.0.tar.gz 拷贝到远程服务器 [[用户名 @ ] 主机地址 : 路径
tar -zxvf hadoop-2.8.0.tar.gz 进行解压
2. 伪分布 Hadoop 配置
可以把伪分布式的Hadoop看作是只有一个节点的集群,在这个集群中,这个节点既是Master,也是Slave;既是Namenode,也是DataNode;既是JobTracker,也是TaskTracker。
需要修改hadoop安装目录下 ./etc/hadoop 中的配置文件。
1. 指定 jdk 的安装位置
修改 hadoop-env.sh 文件,加上 export JAVA_HOME=/usr/java/java1.8.0 为jdk的安装路径。
2. 配置 HDFS 的地址及端口号
修改 hadoop 核心的配置文件 core-site.xml :
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
上述配置增加了property,这样就可以通过指定的web访问hdfs的地址。
3. 配置 HDFS 的具体属性
修改 hdfs-site.xml 文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
原本每个数据块默认的备份数为3,在单机版的hadoop中,需要将其改为1。
4. 配置 MapReduce 的相关信息
修改 mapred-site.xml 文件:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
5. 格式化 hadoop 的文件系统 HDFS
进入 hadoop 安装目录下的二进制可执行文件夹,执行格式化文件
bin/hadoop namenode -format
返回结果如上图所示,Exiting with status 0 表示格式化成功,如果是1的话代表存在错误。倒数第五行也有说 successfully formatted 。
6. 启动 NameNode 和 DataNode
跟启动有关的可执行二进制文件都在hadoop安装目录的sbin子目录下。
sbin/hadoop-daemon.sh start namenode 用于启动namenode
sbin/hadoop-daemon.sh start datanode 用于启动datanode
用 jps 命令可以察看这两种进程的启动情况。
然后就可以用 Web 浏览器察看dfs的情况了,默认端口是50070。如果是本机访问,就是 http://localhost:50070;如果通过公网访问,就是 http://ip地址:50070。
7. 启动 hadoop
sbin/start-all.sh 命令可用于启动整个hadoop服务
3. hadoop 集群的配置
1. hadoop 集群的配置至少需要三台 Linux 服务器,首先给集群中的每台机器分配角色
10.3.242.98-master, namenode, jobtracker-host98(主机名)
10.3.242.99-slave, datanode, tasktracker-host99(主机名)
10.3.242.103-slave, datanode, tasktracker-host101(主机名)
2. 在三台主机上创建相同的用户 lb (这是 hadoop 的基本要求),普通用户即可,加入 sudoer 用户组
3. 安装 jdk ,配置环境变量
4. 修改 /etc/hosts 文件,用于定义局域网内主机名与IP地址的映射关系,可以通过主机名进行远程连接
127.0.0.1 localhost
10.3.242.98 host98
10.3.242.99 host99
10.3.242.101 host101
5. 安装ssh,配置不用主机间的免密钥登陆
在重新安装ssh后,一定要记得修改/etc/ssh/sshd_config文件,使用service sshd start命令启动服务。否则中断当前连接后可能无法使用ssh重新连接服务器。
比如要从host98主机免密钥登陆host99,就将host98主机生成的公钥加入到host99的authorized_keys文件中:
scp lb@host98:~/.ssh/is_rsa.pub lb@host99:~/.ssh/host99_rsa.pub
在host98主机下, cat ~/.ssh/host99_rsa.pub >> ~/.ssh/authorized_keys 即可。
对三台主机两两执行上述操作,使得每两台主机间都可以实现免密钥登陆。因为有可能 jobtracker 不是 master。
6. 配置三台主机的hadoop配置文件
1. etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0 加上java的环境变量
2. etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://host98:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp</value>
</property>
</configuration>
第一个资源声明的是访问hdfs的web浏览器地址,host98是master主机名,也可以用ip地址替换。
第二个资源声明的是在格式化分布式文件系统时所产生的临时文件的存储地址,有时不能重新格式化文件系统是因为临时文件夹下有同名文件,需要将文件夹清空后才可以正常格式化。(通过报错信息可以知道)
3. etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
声明数据块的备份个数
4. etc/hadoop/mapred.site.xml.template
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>host98:9001</value>
</property>
</configurantion>
声明jobtracker节点,为master主机host98,端口为9001
5. etc/hadoop/slaves
在slaves文件中添加作为slave的主机名
host99
host101
7. 启动hadoop服务(均是在主机host98执行命令,会自动调用slave节点完成相应操作)
1. 格式化hdfs系统
bin/hadoop namenode -format
会完成hdfs文件系统的格式化,在临时文件的文件夹下会生成很多临时文件,在下一次格式化之前,一定要把这些临时文件夹清空,否则会格式化失败。
2. 启动dfs服务
sbin/start-dfs.sh
会在master主机运行namenode进程,在所有的datanode节点运行datanode进程。
在启动服务的过程中,出现了部分slave节点没有运行datanode进程的情况,在slave节点单独开启datanode服务会出现问题的反馈,原因是由于其他进程占用了50010端口。解决的方式有两种:1. 结束原本占用50010端口的进程;2. 更改datanode的端口。
使用 netstat -a -t --numeric-ports -p 命令察看正在占用50010端口的进程号,使用kill 进程号杀死该进程后重新启动dfs服务,所有的slave节点都启动了datanode进程。
3. 启动yarn服务
sbin/start-yarn.sh
新版的hadoop2.*不存在 jobtracker 进程和 tasktarcker 进程,取而代之的是 sourcemanager 和 nodemanager。
在这个过程中出现了slave节点成功运行 nodemanager 进程,但是master节点没有运行 sourcemanager 进程,出现问题的原因不会在终端界面显示,需要自己去察看 logs 子目录中的日志记录。显示如下:
NodeStatusUpdaterImpl failed in state STARTED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.ConnectException: Call From host99/10.3.242.99 to 0.0.0.0:8031 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
可以看到问题与之前的一样,是8031端口被占用,使用同样的方法查找占用8031端口的进程号后杀死进程,重新启动服务后成功。
4. 成功的标识
host98主机(master):
[lb@host98 ~]$jps
5904 ResourceManager
21028 SecondaryNameNode
20743 NameNode
1225 Jps
host99和host101主机(slave):
[lb@host99 ~]$jps
11316 Jps
12568 DataNode
11117 NodeManager
至此,在服务器上从 添加用户 到 安装jdk并配置环境变量 到 安装并配置ssh免密钥登陆 到 安装配置hadoop单机模式、伪分布模式和集群模式的所有过程 均已有所呈现。
在 Linux 服务器上搭建和配置 Hadoop 集群的更多相关文章
- PHP网站在Linux服务器上面的安全配置
本文详细总结了PHP网站在Linux服务器上面的安全配置,包含PHP安全.mysql数据库安全.web服务器安全.木马查杀和防范等,很好很强大很安全. PHP安全配置 1. 确保运行php的用户为一般 ...
- Linux中安装配置hadoop集群
一. 简介 参考了网上许多教程,最终把hadoop在ubuntu14.04中安装配置成功.下面就把详细的安装步骤叙述一下.我所使用的环境:两台ubuntu 14.04 64位的台式机,hadoop选择 ...
- 基于Docker快速搭建多节点Hadoop集群--已验证
Docker最核心的特性之一,就是能够将任何应用包括Hadoop打包到Docker镜像中.这篇教程介绍了利用Docker在单机上快速搭建多节点 Hadoop集群的详细步骤.作者在发现目前的Hadoop ...
- 搭建简单的hadoop集群(译文)
本文翻译翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html 具体的实 ...
- Ubuntu16.04.1上搭建分布式的Redis集群
为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...
- Ubuntu16.04.1上搭建分布式的Redis集群,并使用C#操作
为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...
- 阿里云CentOS Linux服务器上搭建邮件服务器遇到的问题
参考文章: 阿里云CentOS Linux服务器上用postfix搭建邮件服务器 Linux系统下邮件服务器的搭建(Postfix+Dovecot) 本来想自己搭建邮件服务器,但是看到一篇资料表示阿里 ...
- 在linux服务器上搭建相对安全的FTP服务器
一.如何在Linux服务器上安装vsftp不在多说,直接介绍如何进行安全性配置: 二.编辑vsftp.conf文件 关键配置项如下: anonymous_enable=NO /禁止匿名用户登录 loc ...
- Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo
近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,因此这里实际使用一次. 先看一下通过hadoop分析后的结果吧,最终通过hadoop分析 ...
随机推荐
- 5.2 - ToDoList
一.ToDoList需求 参考链接http://www.todolist.cn/ 1.将用户输入添加至待办项 2.可以对todolist进行分类(待办项和已完成组),用户勾选既将待办项分入已完成组 3 ...
- SpringBoot 与 Web开发
1. SpringBoot 静态资源映射规则 webjars:以JAR包的方式引入静态资源; 所有/webjars/**,都去classpath:/META-INF/resources/webjars ...
- Django 框架搭建入门案例
1. 什么是 web 框架 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端; # 示例: import socket def handle_re ...
- JS获取浏览器信息及屏幕分辨率
因为vue有自己的生命周期,初始化数据的时候,可以在钩子函数created()函数里初始化数据,也可以在mounted()函数里获取,但是两者是不同的,获取浏览器和屏幕分辨率的时候,不能在create ...
- Linux下的内核抢占
2017-03-03 很遗憾之前在介绍进程调度的文章中,虽然涉及到了内核抢占,但是却没有对其进行深入介绍,今天就稍微总结下内核抢占. 内核抢占在一定程度上减少了对某种事件的响应延迟,这也是内核抢占被引 ...
- python常见模块之序列化(json与pickle以及shelve)
什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flatte ...
- Flask使用SQLAlchemy连接mysql
表操作 models.py from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column ...
- javascrpt 页面格式化页面
下面这个页面,格式化javaScript <html> <head> <title>JS格式化工具 </title> <meta http-equ ...
- RocketMQ 单机安装
本章快速入门指南是在本地机器上设置 RocketMQ 消息传递系统以发送和接收消息的详细说明. 在这先对RocketMQ 做一个简单介绍. RocketMQ是一个纯java.分布式.队列模型的开源消息 ...
- Wilcoxon符号秩+秩和检验学习[转载]
参数检验就是已知数据的精确分布模型,根据数据来求出模型中的未知参数:而非参数检验就是无需对样本总体分布(比如满足正态分布)做出假设. 1.符号检验 转自:https://baike.baidu.com ...