Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任 务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
ip | 用途 | 操作系统 | 主机名 |
192.168.142.128 | 主 | CentOS7.6 | master |
192.168.142.129 | 从1 | 192.168.142.128 | slave1 |
192.168.142.130 | 从2 | 192.168.142.128 | slave2 |
修改三台服务器的hosts配置,新增如下三条内容:
vi /etc/hosts
192.168.142.128 master
192.168.142.129 slave1
192.168.142.130 slave2
可以使用 ping 命令测试三台机器的连通性
(1)jdk
(2)hadoop
为三个节点分别创建相同的用户hadoop,并在以后的操作均在此用户下操作,操作如下:
useradd hadoop
passwd hadoop
设置密码
为hadoop添加sudo权限
visudo
在该行root ALL=(ALL) ALL下添加hadoop ALL=(ALL) ALL保存后退出
注:接下来操作基本都是在hadoop用户下进行
centos7默认的hostname是localhost,为了方便将每个节点hostname分别修改为master、slave1、slave2(以下以master节点为例)
sudo hostnamectl set-hostname master
查看
hostname
a.首先生成master的rsa密钥:
sudo hostnamectl set-hostname master
查看
hostname
设置全部采用默认值进行回车
生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/用户名/.ssh"目录下。
b. 接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
给授权文件权限
chmod 600 ~/.ssh/authorized_keys
进行本机ssh测试:$ssh maste 正常免密登陆后所有的ssh第一次都需要密码,此后都不需要密码
c.使用ssh-copy-id命令将公钥传送到远程主机上(这里以Slave1.Hadoop为例)
ssh-copy-id hadoop@slave1
登陆到slave1操作
chmod 600 ~/.ssh/authorized_keys
然后测试是否无密码登录其它机器成功
ssh slave1
slave2也是同样的
所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以"root"的身份进行。
首先用root身份登录"Master.Hadoop"后将jdk复制到"/usr/local/src"文件夹中,然后解压即可。查看"/usr/local/src"下面会发现多了一个名为"jdk-7u25-linux-i586"文件夹,说明我们的JDK安装结束,进入下一个"配置环境变量"环节。
然后将jdk文件夹移动到”/usr/local/“目录下。
(1)编辑"/etc/profile"文件
编辑"/etc/profile"文件,在后面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"内容如下:
# set java environment
export JAVA_HOME=/usr/local/jdk1.8.0_171/
export JRE_HOME=/usr/local/jdk1.8.0_171/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
(2)使配置生效
保存并退出,执行下面命令使其配置立即生效。
source /etc/profile或. /etc/profile
3.3验证安装成功
配置完毕并生效后,用下面命令判断是否成功。
java -version
从上图中得知,我们确定JDK已经安装成功
进入 /usr/local目录下
cd /usr/local wget http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-3.0.2/hadoop-3.0.2.tar.gz tar –zxvf hadoop-3.0.2.tar.gz
注:hadoop有32位和64位之分,官网默认二进制安装文件是32位的,但是本文操作系统是64位,会在后面hadoop集群使用中产生一个warning但是不影响正常操作。
最后在"/usr/local/hadoop-3.0.2"下面创建tmp文件夹.
打开/etc/profile,增加hadoop环境变量
vi /etc/profile
# set hadoop path
export HADOOP_INSTALL=/usr/local/hadoop-3.0.2
export PATH=${HADOOP_INSTALL}/bin:${HADOOP_INSTALL}/sbin:${PATH}
export HADOOP_MAPRED_HOME=${HADOOP_INSTALL}
export HADOOP_COMMON_HOME=${HADOOP_INSTALL}
export HADOOP_HDFS_HOME=${HADOOP_INSTALL}
export YARN_HOME=${HADOOP_INSTALLL}
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_INSTALL}/lib/natvie
export HADOOP_OPTS="-Djava.library.path=${HADOOP_INSTALL}/lib:${HADOOP_INSTALL}/lib/native"
重启配置使其生效
source /etc/profile
我们先在master.hadoop中进行配置,配置完成后再将hadoop复制到slave1和slave2中。
(1)设置hadoop-env.sh中的java环境变量
cd /usr/local/hadoop-3.0.2/etc/hadoop/
vi hadoop-env.sh
JAVA_HOME=/usr/java/jdk1.8.0_191
( 2)配置core-site.xml文件
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.0.2/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删掉,必须重新执行format才行,否则会出错。
( 3 )配置hdfs-site.xml文件
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop-3.0.2/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop-3.0.2/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>hadoop-cluster1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
(4)配置mapred-site.xml文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<property>
<name>mapreduce.jobtracker.http.address</name>
<value>master:50030</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>
<property>
<name>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>
(5)配置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>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
(1) 将Master中配置好的hadoop传入两个Slave中
scp -r /usr/local/hadoop-3.0.2 hadoop@slave1:/usr/local/
scp -r /usr/local/hadoop-3.0.2 hadoop@slave2:/usr/local/
(2) 修改Master主机上的workers文件
cd /usr/local/hadoop/etc/hadoop-3.0.2
vi workers
// 将以下内容写入
slave1
slave2
(3) 格式化HDFS文件系统
hdfs namenode -format
(4)启动hadoop
start-dfs.sh
start-yarn.sh
(5) 验证hadoop启动是否成功
jps
master中的结果:
slave中的结果:
还可以用hadoop自带的例子查看是否成功
hadoop jar /usr/local/hadoop-3.0.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.2.jar wordcount /input /outputhadoop jar /usr/local/hadoop-3.0.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.2.jar pi 10 10
出现如下结果说明成功:
注:过程中如果有需要关闭防火墙和selinux,命令如下:
$sudo systemctl stop firewalld.service
$sudo systemctl disable firewalld.service
$sudo vim /usr/sbin/sestatus
将SELinux status参数设定为关闭状态
SELinux status: disabled