节点目录

HDFS daemon: NameNode, SecondaryNameNode, DataNode
YARN damones: ResourceManager, NodeManager, WebAppProxy
MapReduce Job History Server

环境配置

host IP 角色
master 192.168.111.140 NameNode、DataNode
slaver1 192.168.111.141 DataNode、ResourceManager、NodeManager
slaver2 192.168.111.142 DataNode、SecondaryNameNode

同步时间

  1. yum install ntpdate
  2. ntpdate cn.pool.ntp.org

下载并安装hadoop

# 方式一:
下载地址: https://hadoop.apache.org/releases.html
# 方式二:下载(比较慢)
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz
# 解压
tar -zxvf hadoop-2.9.2.tar.gz 
# 重命名
mv hadoop-2.9.2 hadoop

在各节点上设置主机名及创建hadoop组和用户

配置hosts文件

vi /etc/hosts
192.168.111.140 master
192.168.111.141 slave1
192.168.111.142 slave2
# scp拷贝 hosts到其他服务器
scp /etc/hosts root@slave1:/etc/
scp /etc/hosts root@slave2:/etc/
#注意:修改hosts中,是立即生效的,无需source或者.

修改主机名

# 三台机子对应修改
hostnamectl set-hostname master
exec bash

创建hadoop组和用户

groupadd hadoop 
useradd -d /usr/hadoop -g hadoop -m hadoop
passwd hadoop
# 设置权限
su root
chown -R hadoop:hadoop /opt/*

在各节点上设置SSH无密码登录

su hadoop
cd /usr/hadoop
ssh-keygen -t rsa -P ""
# 查看生成的文件
cd .ssh
ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts

本机无密钥登录

cat id_rsa.pub >> authorized_keys
cd ~
chmod 700 .ssh
chmod 600 .ssh/*
# 验证
ssh master(ssh slave1  ssh slave2)
Last login: Wed Dec 18 19:21:28 2019 from hadoop-master

master与其他节点无密钥登录

#执行cd ~.ssh发现ssh目录找不到
这是因为没有用root用户ssh登录过,执行一下ssh操作就会自动生成这个文件夹了
执行 ssh 主机名
然后按照步骤输入yes  密码就可以了
#从master中把authorized_keys分发到各个结点上
scp /usr/hadoop/.ssh/authorized_keys hadoop@slave1:/usr/hadoop/.ssh
scp /usr/hadoop/.ssh/authorized_keys hadoop@slave2:/usr/hadoop/.ssh
#然后在各个节点对authorized_keys执行(一定要执行该步,否则会报错):chmod 600 authorized_keys
#保证.ssh 700,.ssh/authorized_keys 600权限
chmod -R 700 .ssh
cd .ssh
chmod 600 authorized_keys
# 在master分发公钥,分别分发给三台主机。
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2

设置hadoop环境变量

#修改配置文件
vim /etc/profile
#set hadoop
HADOOP_HOME=/opt/hadoop
PATH=$JAVA_HOME/bin:$PATH/bin:$HADOOP_HOME/bin
export JAVA_HOME  CLASSPATH PATH HADOOP_HOME
#重启配置
source /etc/profile
#校验
hadoop version
# scp拷贝 profile到其他服务器
scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/

修改hadoop-env.sh 、mapred-env.sh 、yarn-env.sh 设置JAVA_HOME地址

cd /opt/hadoop/etc/hadoop
vim hadoop-env.sh 
vim mapred-env.sh 
vim yarn-env.sh

配置core-site.xml

fs.defaultFS为NameNode的地址。
hadoop.tmp.dir为hadoop临时目录的地址,默认情况下,NameNode和DataNode的数据文件都会存在这个目录下的对应子目录下。应该保证此目录是存在的,如果不存在,先创建

<configuration> 
  <property> 
    <name>fs.defaultFS</name>  
    <value>hdfs://master:8020</value> 
  </property>  
  <property> 
    <name>hadoop.tmp.dir</name>  
    <value>/opt/hadoop/data/tmp</value> 
  </property> 
</configuration>

配置hdfs-site.xml

dfs.namenode.secondary.http-address是指定secondaryNameNode的http访问地址和端口号,因为在规划中,我们将slave2规划为SecondaryNameNode服务器。

<configuration> 
  <property> 
    <name>dfs.namenode.secondary.http-address</name>  
    <value>slave2:50090</value> 
  </property> 
</configuration>

配置yarn-site.xml

根据规划yarn.resourcemanager.hostname这个指定resourcemanager服务器指向hadoop-slave1。
yarn.log-aggregation-enable是配置是否启用日志聚集功能。
yarn.log-aggregation.retain-seconds是配置聚集的日志在HDFS上最多保存多长时间。

<configuration> 
  <property> 
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</value> 
  </property>  
  <property> 
    <name>yarn.resourcemanager.hostname</name>  
    <value>slave1</value> 
  </property>  
  <property> 
    <name>yarn.log-aggregation-enable</name>  
    <value>true</value> 
  </property>  
  <property> 
    <name>yarn.log-aggregation.retain-seconds</name>  
    <value>106800</value> 
  </property> 
</configuration>

配置mapred-site.xml

复制mapred-site.xml.template 为 mapred-site.xml

cp mapred-site.xml.template mapred-site.xml

配置mapred-site.xml

<configuration> 
  <property> 
    <name>mapreduce.framework.name</name>  
    <value>yarn</value> 
  </property>  
  <property> 
    <name>mapreduce.jobhistory.address</name>  
    <value>slave2:10020</value> 
  </property>  
  <property> 
    <name>mapreduce.jobhistory.webapp.address</name>  
    <value>slave2:19888</value> 
  </property> 
</configuration>

master节点配置从节点

vim /opt/hadoop/etc/hadoop/slaves
slave1
slave2

拷贝到其他机子

# 拷贝hadoop到其他服务器
scp -r /opt/hadoop root@slave1:/opt
scp -r /opt/hadoop root@slave2:/opt
# 设置权限
su root
chown -R hadoop:hadoop /opt/*

格式化NameNode

注意:只在master节点使用
如果需要重新格式化NameNode,需要先将原来NameNode和DataNode下的文件全部删除,不然会报错,NameNode和DataNode所在目录是在core-site.xml中hadoop.tmp.dir、dfs.namenode.name.dir、dfs.datanode.data.dir属性配置的。

# 只能执行一次 相当于初始化操作(master节点)
hdfs namenode -format

启动hdfs和yarn进程

# 切换到hadoop用户
su hadoop
#master
sbin/start-dfs.sh 
#slave1
sbin/start-yarn.sh

浏览器访问

http://192.168.111.140:50070

http://192.168.111.141:8088

测试wordcount

# 创建目录
hdfs dfs -mkdir -p /wordcountdemo/input 
# 上传文件
hdfs dfs -put /opt/1.txt /wordcountdemo/input
hdfs dfs -put /opt/2.txt /wordcountdemo/input
#运行WordCount MapReduce Job

java 调用hdfs

建立maven项目,引入依赖

<properties>
    <hadoop.version>2.9.2</hadoop.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
</dependencies>

拷贝core-site.xml、hdfs-site.xml和log4j.properties到resources

运行出现 以下异常解决方法

java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.
git 下载 winuntil
https://github.com/steveloughran/winutils