hadoop可以使用不同的模式部署,适用于不同的场景。
单机模式:无需任何守护进程,所有的程序都运行在同一个JVM上执行,一般用于调试MapReduce程序时使用(多用在Windows环境下)。
伪分布式模式:守护进程运行在本地机器上,模拟一个小规模的集群,只有一个NameNode和一个DataNode实例,数据都存放在同一个节点上。“伪”体现在如何本节点出现故障,则数据丢失,而完全分布式可以使用副本机制保证一个节点故障时数据正常访问。伪分布模式也多用在程序调试中。
完全分布式模式:守护进程运行在一个集群上,有一个NameNode和多个DataNode,利用副本机制可以保证当其中一个DataNode节点故障时数据还能正常访问。利用SecondaryNameNode和高可用机制,还可保证整个集群不间断地提供服务。企业应用中hadoop的部署必然是完全分布式模式。
伪分布模式的优势
(1)节省硬件资源:使用一个节点就可以完成集群的搭建。
(2)便于调试:在程序调试阶段可以省去很多服务维护工作,专注于业务研发。
Linux:CentOS 7.2(如果没有实体机可使用虚拟机代替)
JDK:1.8(openjdk或oracle jdk均可,能运行java命令即可)
java -version
命令输出如下:
[root@node1 hadoop]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
设置节点名称为node1
hostnamectl set-hostname node1
在/etc/hosts
文件中写入节点名称和ip的对应信息
192.168.21.20 node1
hostname
命令执行结果为node1
systemctl stop firewalld
setenforce 0
# 等效于手动修改/etc/sysconfig/selinux,将其中的SELINUX=enforcing改成SELINUX=disabled
sed 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
配置免密的目的是让Hadoop的NameNode和DataNode能在没有密码的情况下互相通信。
# 有提示的地方一路按回车
ssh-keygen -t rsa
# 提示输入root用户密码
ssh-copy-id node1
测试:如果执行ssh node1
不需要密码,即为成功。
记住apache软件统一下载地址,apache系列所有软件、所有版本再也不用在百度上搜了!
https://archive.apache.org/dist/
根据项目需要下载相应的版本,本文以2.7.3版本作为示例。下载地址:
https://archive.apache.org/dist/hadoop/core/hadoop-2.7.3/hadoop-2.7.3.tar.gz
将hadoop安装包通过远程传输工具(如xftp),上传至linux的/root目录。
进入/root目录,并解压tar.gz,解压后将hadoop-2.7.3目录移动到/usr/local/目录下(不绝对,也有人喜欢放在/opt目录下,但最好不要放在/root目录下,因为容易被误删)
cd /root
tar -zxvf hadoop-2.7.3.tar.gz
mv hadoop-2.7.3 /usr/local/
推荐移动至/usr/local/目录的理由:
/usr/local/目录下存放的是linux的本地链接库、运行命令等,一是将hadoop也作为linux的本地程序维护,二是防止被其他用户误删。
修改/etc/profile
文件,在末尾写入
# java的路径根据实际路径填写
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
测试,如果执行hadoop version
,出现以下结果则为成功。
hadoop version
Hadoop 2.7.3
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r baa91f7c6bc9cb92be5982de4719c1c8af91ccff
Compiled by root on 2016-08-18T01:41Z
Compiled with protoc 2.5.0
From source with checksum 2e4ce5f957ea4db193bce3734ff29ff4
This command was run using /usr/local/hadoop-2.7.3/share/hadoop/common/hadoop-common-2.7.3.jar
进入到/usr/local/hadoop/etc/hadoop进行hadoop配置文件修改
配置java的路径,根据实际修改。
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre
配置NameNode访问地址、临时目录、访问代理等(用于权限认证)。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
配置DataNode的数据目录、NameNode的数据目录、副本数、是否开启dfs认证权限等。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>/var/lib/hadoop/datanode</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/var/lib/hadoop/namenode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
配置DataNode节点的名称。
node1
使用以下命名开启DFS服务
start-dfs.sh
如果成功,则正常输出
Starting namenodes on [node1]
node1: starting namenode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-root-namenode-node1.out
node1: starting datanode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-root-datanode-node1.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-root-secondarynamenode-node1.out
hdfs dfs -ls /
hdfs dfs -mkdir /input
hdfs dfs -put /usr/local/hadoop-2.7.3/etc/hadoop/* /input/
hdfs dfs -ls /input