Hadoop的搭建

前言

Hadoop的搭建此次分为伪分布式和分布式,伪分布式分为windows和mac Os、Linux

伪分布式

Hadoop的伪分布式搭建需要提前安装好jdk1.8,选用hadoop3.0.0版本,官方提供的二进制和源码下载网址:https://archive.apache.org/dist/hadoop/common/hadoop-3.0.0/ ,此次的搭建使用二进制包安装,不涉及源码的编译,所以下载的文件为hadoop-3.0.0.tar.gz。

Windows

首先将下载好hadoop-3.0.0.tar.gz压缩包,解压到合适的目录下(目录位置用于配置环境变量,用户可以自行选择),为了接下来方便配置的讲解,假设本次例子解压目录为:E:\hadoop-3.0.0,后文的hadoop的xx目录都是该目录下的子目录。

windows启动脚本

在windows下安装hadoop,需要额外添加hadoop的window启动脚本,下载位置为:https://github.com/steveloughran/winutils ,选择相应的hadoop大版本,如本次安装为hadoop3.0.0。则需将winutils中hadoop-3.0.0\bin下的所有文件复制,粘贴到hadoop的bin目录下,即例子中的 E:\hadoop-3.0.0\bin中。

环境变量配置

  • 修改hadoop-env.cmd文件

    修改hadoop的etc\hadoop目录下hadoop-env.cmd文件,将文件中的set JAVA_HOME=%JAVA_HOME% 替换成 set JAVA_HOME=C:/Progra~1/Java/jdk1.8.0_144,用系统的JAVA_HOME的路径代替文件中JAVA_HOME的路径。

    注意:本文只的jdk安装目录实际上为默认的C:/Program Files/Java/jdk1.8.0_144,但是该文件中参数的配置是不能出现空格的,如果含有空格,必须按照Windows 8.3 Pathname的路径规范书写,所以建议可以适当改变jdk的安装路径尽量不要包括空格等特殊符号。

  • 添加环境变量

    我的电脑 –> 属性 –> 高级系统设置中添加系统变量HADOOP_HOME,变量值为E:\hadoop-3.0.0,在path变量中添加%HADOOP_HOME%\bin; %HADOOP_HOME%\sbin;

Hadoop配置文件

  • 修改hadoop的etc\hadoop目录下core-site.xml文件,添加以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
    </property>
    <!-- 配置Hadoop临时目录文件 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>file:///E:/hadoop-3.0.0/data/tmp</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///E:/hadoop-3.0.0/data/name</value>
    </property>
    </configuration>
  • 修改hadoop的etc\hadoop目录下hdfs-site.xml文件,添加以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <configuration>
    <property>
    <!-- hdfs的文件的默认副本数 -->
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///E:/hadoop-3.0.0/data/dfs/namenode</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///E:/hadoop-3.0.0/data/dfs/datanode</value>
    </property>
    <!-- 关闭权限检查-->
    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>
    </configuration>
  • 修改hadoop的etc\hadoop目录下mapred-site.xml文件,添加以下配置

    1
    2
    3
    4
    5
    6
    7
    <configuration>
    <property>
    <!-- mapreduce 运行在yarn上 -->
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>
  • 修改hadoop的etc\hadoop目录下yarn-site.xml文件,添加以下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>127.0.0.1</value>
    </property>
    </configuration>

启动hadoop

第一次需要格式化hdfs,使用命令hadoop namenode -format

打开cmd,输入start-dfs和start-yarn命令分别启动hdfs和yarn。

访问http://localhost:8088http://localhost:9870 可以看到hdfs和yarn的web界面

运行wordcount

运行hadoop自带的wordcount例子,首先可以通过web界面向hdfs上传一个example.txt文件在新建的/input目录下,内容如下:

1
2
3
4
5
A Grain of Sand
To see a world in a grain of sand
And a heaven in a wild fllower
Hold infinity in the palm of your hand
And eternity in an hour

运行wordcount的jar(在hadoop的share\hadoop\mapreduce目录下的hadoop-mapreduce-examples-3.0.0.jar)来统计本件中单词的数量

1
E:\java\hadoop-3.0.0\share\hadoop\mapreduce>hadoop jar hadoop-mapreduce-examples-3.0.0.jar wordcount /input/example.txt /out

最后可以看到hdfs上/out目录下part-r-00000的文件,内容为example文件的单词的统计

1
2
3
4
A	1
And 2
Grain 1
...

Mac和Linux

下载解压安装包tar -zxvf hadoop-3.0.0.tar.gz

环境变量配置

  • 修改hadoop-env.cmd文件

    修改hadoop的etc\hadoop目录下hadoop-env.cmd文件,将文件中的set JAVA_HOME=%JAVA_HOME% 替换成 set JAVA_HOME=,用系统的JAVA_HOME的路径代替文件中JAVA_HOME的路径。

  • 添加环境变量

    修改~/.bash_profile文件,在最后添加hadoop的环境变量

    1
    2
    3
    vim ~/.bash_profile
    export HADOOP_HOME=/Users/Cyan/coding/hadoop/hadoop-2.8.2
    export PATH=$PATH:$HADOOP_HOME/bin

Hadoop配置文件

配置文件几乎和windows的一样,除了路径的书写,根据mac和linux的路径书写来

启动Hadoop和运行wordcount

和windows的一样,不重复了

遇到问题

  • 针对mac,启动HDFS时,start-dfs.sh,报错“connection refused”,则需要在计算机系统设置中打开远程登录许可。

    点击 Sharing(共享):

    Sharing

    勾选 Remote Login(远程登录),然后添加当前用户:

    Sharing

  • 运行mapreduce程序。如wordcound,报错“错误:“找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster”

    在yarn-site.xml中添加名为yarn.application.classpath的属性,值为hadoop classpath命令的输出结果

    1
    2
    hadoop  classpath
    /Users/zhongyue/hadoop-3.0.0/etc/hadoop:/Users/zhongyue/hadoop-3.0.0/share/hadoop/common/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/common/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/mapreduce/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn/*
    1
    2
    3
    4
    5
    6
    vim yarn-site.xml
    <property>
    <name>yarn.application.classpath</name>
    <value>/Users/zhongyue/hadoop-3.0.0/etc/hadoop:/Users/zhongyue/hadoop-3.0.0/share/hadoop/common/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/common/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/hdfs/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/mapreduce/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn/lib/*:/Users/zhongyue/hadoop-3.0.0/share/hadoop/yarn/*
    </value>
    </property>

分布式

hadoop分布式运行环境搭建是使用virtual Box创建三台Ubuntu虚拟机上进行的,所以会有一些ubuntu的一些配置,方便后续Hadoop的安装

更改apt源

由于apt原来的源太慢,改为国内阿里的源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 备份原来的文件
sudo mv /etc/apt/sources.list /etc/apt/source.list.bak
# 编辑源列表文件
sudo vim /etc/apt/sources.list
# 添加内容
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main
# 更新源
sudo apt-get update
sudo apt-get upgrade

固定IP地址

由于虚拟机使用的是桥接网络,固定ip方便以后ssh连接

首先查看虚拟机的网卡

1
2
3
4
5
6
7
8
9
10
11
12
13
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:42:48:cc brd ff:ff:ff:ff:ff:ff
inet 192.168.31.112/24 brd 192.168.31.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe42:48cc/64 scope link
valid_lft forever preferred_lft forever

可以看到这里的网卡编号为enp0s3,接下来编辑文件 sudo vi /etc/network/interfaces,写入静态ip地址(address),子网掩码(netmask)和网(gateway),配置固定的DNS,dns-nameserver后面接DNS服务器地址,可根据不同地域和网络网上查询得到,8.8.8.8万能的dns,修改sudo vim /etc/resolv.conf可以改变dns,但是重启失效。最后重启网络服务

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet static
address 192.168.31.112
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameservers 8.8.8.8
# 重启网络服务
sudo /etc/init.d/networking restart

ssh安装启动

1
2
3
4
5
6
7
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
sudo /etc/rc.local
# /etc/rc.local中exit 0前加入/etc/init.d/ssh start设置
/etc/init.d/ssh start
# 生产ssh key
ssh-keygen

将集群之间的公钥保存在authorized_keys中,形成集群机器之间的免密登陆

JDK配置

下载jdk文件,jdk-8u191-linux-x64.tar.gz

解压该文件到指定目录

1
2
mkdir /usr/lib/Java
tar -zxf jdk-8u191-linux-x64.tar.gzz -C /usr/lib/Java/

接下来配置java的环境变量,在/etc/profile的最后添加环境变量

1
2
3
4
5
6
vim /etc/profile

export JAVA_HOME=/usr/lib/Java/jdk1.8.0_191
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

最后查看是否配置成功

1
2
3
4
java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Hadoop安装

下载解压Hadoop 3.0的安装包

1
2
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz
tar -zxvf hadoop-3.1.1.tar.gz

添加环境变量

修改/etc/profile,根据hadoop解压后的位置添加HADOOPCONF_DIR、HADOOP_HOME、HADOOP_HDFS_HOME,并将$HADOOP_HOME/bin$HADOOP_HOME/sbin`追加入到path中,

1
2
3
4
5
$ vim /etc/profile
export HADOOPCONF_DIR=/usr/hadoop3.1/hadoop-3.1.1/etc/hadoop
export HADOOP_HOME=/usr/hadoop3.1/hadoop-3.1.1
export HADOOP_HDFS_HOME=/usr/hadoop3.1/hadoop-3.1.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

使修改的环境变量生效

1
$ source /etc/profile

修改host

集群域名和ip映射,方便之后配置

1
2
3
4
5
6
7
$ cat /etc/hosts
127.0.0.1 localhost
# 127.0.1.1 hdp-3

10.1.16.111 hdp-1
10.1.16.112 hdp-2
10.1.16.113 hdp-3

这里是三台机器组成集群,ip分别是10.1.16.111/112/113,对应域名hdp-1/hdp-2/hdp-3(分别是三台机器的hostname,也可以随意取名 ),这个需要按照实际ip和hostname 来

修改hadoop的配置文件

修改hadoop-env.sh

${HADOOP_HOME}/etc/hadoop/hadoop-env.sh,增加JAVA_HOME,同java环境变量中的相同

1
export JAVA_HOME=/usr/lib/Java/jdk1.8.0_191
core-site.xml配置

${HADOOP_HOME}/etc/hadoop/core-site.xml配置hdfs中NameNode的URI(包括协议、主机名称、端口号),从上述选取一台作为namenode的节点

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdp-1:9000</value>
</property>
</configuration>
hdfs-site.xml配置

${HADOOP_HOME}/etc/hadoop/hdfs-site.xml,配置hafs中文件的备份数,以及namenode,datanode的存储位置,需要先创建namenode,datanode的存储位置,即下面的/data/hdp/namenode和/data/hdp/datanode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hdp/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hdp/datanode</value>
</property>
</configuration>
yarn-site.xml配置

${HADOOP_HOME}/etc/yarn-site.xml,配置resourcemanager运行的机器,为了能够运行MapReduce程序,需要让各个NodeManager在启动时加载shuffle server,接着是resourcemanager和jobhistory的UI界面的地址,开启日志聚集和保存时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hdp-1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hdp-1:8088</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hdp-1:19888</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>640800</value>
</property>
</configuration>
mapred-site.xml

${HADOOP_HOME}/etc/mapred-site.xml,配置mapreduce运行在yarn上

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

workers

${HADOOP_HOME}/etc/worker,将集群中的所有机器添加上去

1
2
3
hdp-1
hdp-2
hdp-3

启动Hadoop

首次启动需要格式化namenode

1
2
3
4
5
6
7
8
# 格式化
hdfs namenode -format
# 启动hdfs,可以使用start-all.sh来启动hdfs和yarn
start-dfs.sh
# 启动yarn
start-yarn.sh
# 如果想看jobhistory,可以启动一下服务
mr-jobhistory-daemon.sh start historyserver

可以通过jps查看启动了哪些组件

1
2
3
4
5
6
7
8
9
10
11
12
# hdp-1,由于namenode和resourcemanager在其上运行
11939 Jps
10756 SecondaryNameNode
11173 NodeManager
11045 ResourceManager
10581 DataNode
10454 NameNode
7148 JobHistoryServer
# hdp-2,hdp-3
28848 NodeManager
29491 Jps
28719 DataNode

通过配置的yarn.resourcemanager.webapp.addressmapreduce.jobhistory.webapp.address,可以看到yarn的信息界面,hdfs的信息界面默认在运行namenode机器的9870端口。

以上配置只是能让Hadoop够运行以及能看到基本信息,实际生产中还需要进行更多配置,有兴趣可以从官方查看各个配置参数。

0%