Hadoop 群集部署
Hadoop
2020-01-15
393
0
本教程使用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一书
准备工作
- 选定一台机器作为 Master
- 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
- 在 Master 节点上安装 Hadoop,并完成配置
- 在其他 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运行在安全模式下的时候进行访问控制 |
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/slavesslaves文件用来启动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/hadoopSlave上进行解压
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出现一堆信息,不过注意图中两点即可
启动Hadoop群集
start-dfs.sh start-yarn.sh mr-jobhistory-daemon.sh start historyserver启动后用jps 来判断是否成功
以上缺少任意一个进程皆表示有问题
在Master执行hdfs dfsadmin –report 可以查看datanotes,我们有两个节点,因此Live datanodes显示2
当然我们也可以直接通过Web页面查看 http://192.168.3.153:8088
伪分布式、分布式配置切换时的注意事项
从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;
在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能启动,但后来启动不了,特别是 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
执行MapReduce程序
export HADOOP_CLASSPATH=hadoop-examples.jar hadoop MaxTemperature /sample.txt output执行成功
在Web页面也可以查看处理结果
http://192.168.3.153:8088/cluster
查看结果
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