hadoop集群的搭建与使用
安装前准备
- 配置yum源:即将linux自身的yum源替换为阿里的yum源,以便于快速下载软件包等。
- 下载阿里的yum源
#wget http://mirrors.aliyun.com/repo/Centos-7.repo
下面标红的是新下载的阿里yum源: - 将原来的repo进行备份:
#mv CentOS-Base.repo CentOS-Base.repo.bak
将下载的阿里的repo文件覆盖原来的repo#mv Centos-7.repo CentOS-Base.repo
- 执行yum源更新命令
#yum clean all #yum makecache #yum update
Hadoop集群搭建
1. 必备软件包
VMware 12、Centos 7 64bit、hadoop 2.7.4、jdk 1.8
2. 集群简介
HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。
HDFS集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNode
YARN集群:负责海量数据运算时的资源调度,集群中的角色主要有ResourceManager /NodeManager
这里,我们使用虚拟机来搭建hadoop集群。集群搭建的三个节点(虚拟机)的描述如下:
192.168.52.128 master => NameNode SecondaryNameNode ResourceManager
192.168.52.129 node1 => DataNode NodeManager
192.168.52.130 node2 => DataNode NodeManager
3. 搭建步骤
-
3.1 linux服务器配置
- 配置三个节点的ip地址
#vim /etc/sysconfig/network-scripts/ifcfg-ens33
- 配置三个节点的主机名
#vim /etc/hostname
- 配置内网域名的映射
# vim /etc/hosts
- 配置主机之间的ssh免密登录
- 在master上生成key,并依次拷贝到各个主机上
#ssh-******
- 复制从master复制到node1、node2上:
#ssh-copy-id node1 #ssh-copy-id node2
- 验证:在master主机上ssh其他节点,如果无需输入密码,则表示配置成功
#ssh node1
- 在master上生成key,并依次拷贝到各个主机上
- 配置三个节点的ip地址
-
3.2 jdk环境安装
首先在master节点上安装jdk环境。- 解压jdk安装包,并配置环境变量
#tar -zxvf jdk-8u151-linux-x64.tar.gz #vim /etc/profile
在文件尾部添加如下内容:
export JAVA_HOME=/opt/jdk1.8.0_151 export PATH=$PATH:$JAVA_HOME/bin
- 使环境变量生效
#source /etc/profile
-验证jdk是否安装成功#java -version
- 将jdk包传送到其他两个节点上
#scp -r /opt/jdk1.8.0_151/ node1:/opt/jdk1.8.0_151/ #scp -r /opt/jdk1.8.0_151/ node2:/opt/jdk1.8.0_151/
- 同样要在其他节点上,使得配置jdk环境变量。
-
3.3 hadoop的安装部署
先在master节点上配置相关文件。- 3.3.1 将hadoop-2.7.4.tar.gz上传并解压到/opt/下
#cd /opt #tar -zxvf hadoop-2.7.4.tar.gz
- 3.3.2 将hadoop添加到环境变量中
#vim /etc/profile
在文件尾部添加下面内容:
使环境变量生效:#source /etc/profile
注意:#echo $HADOOP_HOME
就是没有结果,现在只能配置~/.bash_profile,在PATH加上hadoop的路径
使环境变量生效:# source ~/.bash_profile
参考:http://blog.****.net/tucailing/article/details/9162011/ - 3.3.3 将master节点上的/etc/profile文件传送到其他两个节点上
#scp -r /etc/profile node1:/etc/profile #scp -r /etc/profile node2:/etc/profile
- 3.3.4 修改6个相关配置文件
- 1)修改/opt/hadoop-2.7.4/etc/hadoop/hadoop-env.sh文件
#vim hadoop-env.sh
将export JAVA_HOME=${ JAVA_HOME } 修改成下面jdk的安装地址 - 2)修改/opt/hadoop-2.7.4/etc/hadoop/core-site.xml文件
#vim core-site.xml
<configuration> <!--HDFS默认路径名称--> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!--Hadoop临时存放路径--> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/tmp</value> </property> </configuration>
- 3)修改/opt/hadoop-2.7.4/etc/hadoop/yarn-site.xml文件
#vim yarn-site.xml
<configuration> <!--Site specific YARN configuration properties--> <!--指定主机名标识符--> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
- 4)修改/opt/hadoop-2.7.4/etc/hadoop/hdfs-site.xml文件
#vim hdfs-site.xml
<configuration> <!--数据副本数量,根据HDFS台数设置,默认3份--> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.secondary.http.address</name> <value>master:50090</value> </property> </configuration>
- 5)修改/opt/hadoop-2.7.4/etc/hadoop/mapred-site.xml文件
由于没有mapred-site.xml文件,则需将mapred-site.xml.template的内容复制到mapred-site.xml中#cp mapred-site.xml.template mapred-site.xml
#vim mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- 6)修改/opt/hadoop-2.7.4/etc/hadoop/slaves文件
#vi slaves
- 1)修改/opt/hadoop-2.7.4/etc/hadoop/hadoop-env.sh文件
- 将配置好的hadoop分别传送到其他两个节点上
#scp -r /opt/hadoop-2.7.4 node2:/opt/hadoop-2.7.4
#scp -r /opt/hadoop-2.7.4 node2:/opt/hadoop-2.7.4
- 使node1和node2的
/etc/profile
环境变量生效
-
3.4 启动集群并查看集群是否部署成功
- 1)在master节点上对namenode节点进行初始化
# cd /opt/hadoop-2.7.4
# bin/hdfs namenode -format
- 2)分别启动HDFS和YARN
#sbin/start-dfs.sh #sbin/start-yarn.sh
-
3)使用jps查看hadoop是否启动成功
# jps
在master(即namenode节点)上使用jps查看:
在其他两个节点(即datanode节点)上使用jps查看: -
4)查看集群状态
#hdfs dfsadmin -report
-
5)在浏览器上访问hadoop集群的web页面
http://192.168.52.128:50070 (HDFS管理界面) http://192.168.52.128:8088 (MR管理界面)
上面结果已经表明hadoop集群部署成功。
- 1)在master节点上对namenode节点进行初始化
-
3.5 集群测试
- 上传文件到hadoop集群上、从集群上下载文件
-
1.1 在node1节点上上传文件到hadoop的根目录
如果出现出现下面的情况:
①INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.NoRouteToHostException: No route to host
解决办法:关闭所有节点的防火墙
②INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.ConnectException: Connection refused
这说明node1上datanode没有运行。使用jps查看了,果然没有运行。
解决办法:
方法1:启动节点node1上的datanode# hadoop-daemon.sh start datanode
方法2:在master节点上关闭所有节点的进程,然后再重新启动 -
1.2 上传的两个文件都可以在浏览器客户端上显示和下载
-
1.3 从hadoop集群上下载文件
# hadoop fs -get /xxx
- 使用hadoop自带的mapreduce程序案例(wordcount)来统计文本单词数量
1)在hadoop根目录下创建一个文件夹,即将使用的文件#hadoop fs -mkdir -p /WordCount/input
2)创建并上传文件# hadoop fs -put a.txt b.txt /WordCount/input
在web页面上可以看到刚刚上传的文件
3)运行一个统计文本中单词数的mapreduce程序
# /opt/hadoop-2.7.4/share/hadoop/mapreduce
# hadoop jar hadoop-mapreduce-examples-2.7.4.jar wordcount /WordCount/input /WordCount/output
查看统计的结果:
HDFS的shell常用操作命令
<![if supportMisalignedColumns]> <![endif]>-help | 功能:输出这个命令参数手册 |
-ls | 功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注:这些参数中,所有的hdfs路径都可以简写 -->hadoop fs -ls / 等同于上一条命令的效果 |
-mkdir | 功能:在hdfs上创建目录 示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd |
-moveFromLocal | 功能:从本地剪切粘贴到hdfs 示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd |
-moveToLocal | 功能:从hdfs剪切粘贴到本地 示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt |
--appendToFile | 功能:追加一个文件到已经存在的文件末尾 示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt 可以简写为: Hadoop fs -appendToFile ./hello.txt /hello.txt |
-cat | 功能:显示文件内容 示例:hadoop fs -cat /hello.txt |
-tail | 功能:显示一个文件的末尾 示例:hadoop fs -tail /weblog/access_log.1 |
-text | 功能:以字符形式打印一个文件的内容 示例:hadoop fs -text /weblog/access_log.1 |
-chgrp-chmod-chown | 功能:linux文件系统中的用法一样,对文件所属权限 示例:hadoop fs -chmod 666 /hello.txt hadoop fs -chown someuser:somegrp /hello.txt |
-copyFromLocal | 功能:从本地文件系统中拷贝文件到hdfs路径去 示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/ |
-copyToLocal | 功能:从hdfs拷贝到本地 示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz |
-cp | 功能:从hdfs的一个路径拷贝hdfs的另一个路径 示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 |
-mv | 功能:在hdfs目录中移动文件 示例: hadoop fs -mv /aaa/jdk.tar.gz / |
-get | 功能:等同于copyToLocal,就是从hdfs下载文件到本地 示例:hadoop fs -get /aaa/jdk.tar.gz |
-getmerge | 功能:合并下载多个文件 示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,… hadoop fs -getmerge /aaa/log.* ./log.sum |
-put | 功能:等同于copyFromLocal 示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 |
-rm | 功能:删除文件或文件夹 示例:hadoop fs -rm -r /aaa/bbb/ |
-rmdir | 功能:删除空目录 示例:hadoop fs -rmdir /aaa/bbb/ccc |
-df | 功能:统计文件系统的可用空间信息 示例:hadoop fs -df -h / |
-du | 功能:统计文件夹的大小信息 示例:hadoop fs -du -s -h /aaa/* |
-count | 功能:统计一个指定目录下的文件节点数量 示例:hadoop fs -count /aaa/ |
-setrep | 功能:设置hdfs中文件的副本数量 示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz <这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量> |
参考链接
http://blog.****.net/codepeak/article/details/13170147
https://www.jianshu.com/p/1b0ef092bc08
http://blog.****.net/wl0909/article/details/53354999
https://www.cnblogs.com/dopeter/p/4612232.html
http://www.linuxidc.com/Linux/2016-11/137547.htm
http://blog.****.net/pucao_cug/article/details/71698903
其中,部分内容来自传播博客培训班的大数据课程视频