查看操作系统版本
$ sudo lsb_release -a
一. 准备工作 (可选)
1.1 添加教育网的镜像
首先,对原来的/etc/apt/sources.list进行备份。
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
然后,用$ sudo vim /etc/apt/sources.list
命令,将/etc/apt/sources.list中全部的内容替换为
# 清华大学镜像,默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
或者
#上海交通大学更新服务器
deb http://ftp.sjtu.edu.cn/ubuntu/ lucid main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ lucid-backports main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ lucid-proposed main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ lucid-security main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ lucid-updates main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ lucid main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ lucid-backports main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ lucid-proposed main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ lucid-security main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ lucid-updates main multiverse restricted universe
最后,进行数据源的更新。
$ sudo apt-get update #更新数据源
$ sudo apt-get upgrade #更新软件版本,可以不执行
1.2 修改主机名
ubuntu 18.04需要先修改/etc/cloud/cloud.cfg文件
$ sudo vim /etc/cloud/cloud.cfg #找到preserve_hostname: false修改为preserve_hostname: true
三台计算机名分别为:Master, Slave01, Slave02。使用命令
$ sudo vim /etc/hostname #永久修改主机名(需要重新启动$ sudo reboot)
进行修改、保存。然后必须重新启动计算机,才能够更改计算机名称。或者使用命令
$ sudo hostname Master #临时修改主机名
注意:执行了这个命令后,临时性地修改主机名(在新建的终端才能看到主机名已经修改了),重启后主机名又恢复原来的了。
1.3 配置IP地址
Ubuntu 18.04配置/etc/netplan/50-cloud-init.yaml
$ sudo vim /etc/netplan/50-cloud-init.yaml #双网卡地址配置
$ sudo netplan apply #配置生效
配置三台计算机的静态IP地址(此处的网卡默认称为eth0,有的也有默认被称为ens160、ens32的,可以使用$ ifconfig命令进行查看)。
$ sudo vim /etc/network/interfaces
1.4 修改/etc/hosts
利用$ ifconfig
命令查看计算机的IP地址。
依次在三台计算机中输入$sudo vim /etc/hosts
命令,修改如下内容(注意IP地址根据实际情况来定):
修改完成后,使用ping命令测试三台计算机局可以连通。
$ ping Slave01
$ ping Slave02
$ ping Master
1.5 创建hadoop用户
在三台计算机中都设置一个hadoop用户,名为miles账号(可以根据具体情况设置hadoop用户名)
$ sudo useradd -m miles -s /bin/bash #创建hadoop用户叫做miles,并使用/bin/bash作为shell
$ sudo passwd miles #为hadoop用户设置密码,之后需要连续输入两次密码(例如:密码为0123456789)
$ sudo adduser miles sudo #为hadoop用户增加管理员权限
$ su - miles #切换当前用户为用户miles(hadoop用户)
$ sudo apt-get update #更新hadoop用户的apt,方便后面的安装
1.6 安装SSH,设置SSH无密码登陆
如果已经由ssh服务的话,可以跳过这一步,直接设置SSH无密码。
$ sudo apt-get install openssh-server #安装SSH server
设置SSH无密码登录。
$ ssh localhost #登陆SSH,第一次登陆输入yes
$ exit #退出登录的ssh localhost
$ cd ~/.ssh/ #如果没法进入该目录,执行一次ssh localhost
$ ssh-keygen -t rsa
输入完 $ ssh-keygen -t rsa
语句以后,需要连续敲击三次回车,如下图:
其中,第一次回车是让KEY存于默认位置,以方便后续的命令输入(注意记录)。第二次和第三次是确定passphrase,相关性不大。两次回车输入完毕以后,如果出现类似于下图所示的输出,即成功:
其中文件id_rsa为私钥(privite key),id_rsa.pub为公钥(public key)。默认情况下这两个秘钥都在目录~/.ssh/中,用$ cd ~/.ssh/命令进入该目录。然后再输入:
$ cat ./id_rsa.pub >> ./authorized_keys #将id_rsa.pub追加到授权的key中,创建authorized_keys文件
$ chmod 600 authorized_keys #修改authorized_keys的权限为:拥有者读写权
$ ssh localhost
此时已不需密码即可登录localhost,并可见下图。如果失败则可以重复上述步骤,或者搜索“SSH免密码登录”来寻求答案。
每台计算机上重复步骤1.6(安装SSH,设置SSH无密码登陆),实现在Slave01和Slave02上分别生成公钥id_rsa.pub和authorized_keys。然后,分别在两个子节点上执行如下命令:
$ scp miles@Master:~/.ssh/id_rsa.pub ./master_rsa.pub #将Master上的公钥id_rsa.pub复制到子节点上,并命名为master_rsa.pub
显示如下界面,回答“yes”和miles用户的密码。
$ cat master_rsa.pub >> ./authorized_keys #将master_rsa.pub追加到子节点上授权的key中
回到主节点Master,输入命令$ ssh Slave01
测试是否能够直接登录。此时,发现Master可以直接登录两台Slave节点(无需密码)。
问:如何实现Slave节点之间的不密码登录?
二. 安装jdk8
关于软件包下载的问题,请查阅https://www.cnblogs.com/gbyukg/p/3326825.html
截止2018.11.8,发现Hadoop3.1.1尚不支持最新的jdk11
Hadoop体系内的计算机都需要安装。首先在oracle官网下载jdk8 http://www.oracle.com/technetwork/java/javase/downloads/index.html 接下来进行安装与环境变量配置,根据个人电脑系统选择对应版本,我选的是jdk-8u191-linux-x64.tar.gz
$ sudo mkdir /usr/lib/jvm #创建jvm文件夹
$ sudo tar -zxvf Downloads/jdk-8u191-linux-x64.tar.gz -C /usr/lib/jvm
#解压到/usr/lib/jvm目录下,jdk下载后默认路径为~/Downloads中
$ cd /usr/lib/jvm #进入该目录
$ sudo mv jdk1.8.0_191 java #将jdk1.8.0_191目录重命名为java
$ vim ~/.bashrc #给JDK配置环境变量
注:
- 其中如果权限不够,无法在相关目录下创建jvm文件夹,那么可以使用
$ sudo -i
命令进入root账户来创建文件夹。 - 另外推荐使用vim来编辑环境变量,如果没有安装,用
$sudo apt-get install vim
来安装。
在.bashrc文件结尾处添加如下指令:
export JAVA_HOME=/usr/lib/jvm/java
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
如:
在文件修改完毕以后,输入命令:
$ source ~/.bashrc #使新配置的环境变量生效
$ java -version #检测是否安装成功,查看java版本
如果出现如下图所示的内容,即为安装成功。
三.安装hadoop-3.1.1
Hadoop体系内的计算机都需要安装。
可以从http://mirrors.hust.edu.cn/apache/hadoop/common/下载hadoop-3.1.1.tar.gz,进行安装:
$ sudo tar -zxvf hadoop-3.1.1.tar.gz -C /usr/local #解压到/usr/local目录下
$ cd /usr/local
$ sudo mv hadoop-3.1.1 hadoop #将hadoop-3.1.1目录重命名为hadoop
$ sudo chown -R miles ./hadoop #修改文件权限,属于用户miles
给hadoop配置环境变量,使用$ vim ~/.bashrc
命令,将下面代码添加到.bashrc文件:
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
如下图所示
执行source ~/.bashrc
使设置生效。然后使用$ hadoop version
命令查看hadoop是否安装成功,如果成功,则返回如下信息,如图所示。
四. Hadoop操作模式
操作Hadoop集群有三种模式,分别是:
- 本地/独立模式:默认情况下使用该模式,用于运行Java程序。
- 模拟分布式模式(也称为伪分布模式):在一台计算机上的分布式模拟。Hadoop守护每一个进程,包括hdfs、yarn、MapReduce等,都将作为一个独立的Java程序运行,适合开发使用。
- 完全分布式模式:在两台以上(含)的多台计算机集群使用Hadoop,适合实际使用。本文使用该模式。
另外,Hadoop 2.x和Hadoop 3.x有所不同,具体阅读《大数据Hadoop2.x与Hadoop3.x相比较有哪些变化》一文(https://blog.csdn.net/wshyb0314/article/details/82184680)。其中,它们默认使用的的端口号是不同,具体如下表所示。
五. 完全分布式配置
5.1 创建目录(只在Master上配置)
在hadoop用户(用户名为miles)主目录下创建dfs和tmp目录分别用作数据存储和交换,并在dfs目录下创建name和data子目录,命令如下:
$ mkdir -p ~/dfs/name #在普通用户主目录下同时创建dfs目录及其子目录name
$ mkdir ~/dfs/data #创建dfs的子目录data
$ mkdir ~/tmp #在普通用户主目录下创建目录tmp
5.2 修改配置文件
配置文件的路径(根据HADOOP_HOME的设置)为/usr/local/hadoop/etc/hadoop/目录中,切换到该目录。
$ cd /usr/local/hadoop/etc/hadoop/
-
执行
$ sudo vim workers
,添加三台计算机的主机名。 -
执行
$ sudo vim core-site.xml
,将文件最后的<configuration> </configuration>
替换为
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/miles/tmp</value>
</property>
</configuration>
- 执行
$ sudo vim hadoop-env.sh
,将JAVA_HOME设置为JDK的安装路径。
Java主目录:JAVA_HOME=/usr/lib/jvm/java
Hadoop主目录:HADOOP_HOME=/usr/local/hadoop(这个不用设置)
具体如下:
- 执行
$ sudo vim hdfs-site.xml
,将文件最后的 替换为
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<!-- Master为当前机器名或者IP地址 -->
<value>hdfs://Master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<!-- 以下为存放节点命名的路径 -->
<value>/home/miles/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<!-- 以下为存放数据命名的路径 -->
<value>/home/miles/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<!-- 备份次数,因为有2台DataNode-->
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<!-- Web HDFS-->
<value>true</value>
</property>
</configuration>
- 执行
$ sudo vim mapred-site.xml
,将文件最后的<configuration> </configuration>
替换为
<configuration>
<property>
<name>mapreduce.framework.name</name>
<!-- MapReduce Framework -->
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<!-- MapReduce JobHistory, 当前计算机的IP -->
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<!-- MapReduce Web App JobHistory, 当前计算机的IP -->
<value>Master:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
</configuration>
- 执行
$ sudo vim yarn-site.xml
,将文件最后的<configuration> </configuration>
替换为
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<!-- Master为当前机器名或者ip号 -->
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<!-- Node Manager辅助服务 -->
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<!-- Node Manager辅助服务类 -->
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<!-- CPU个数,需要根据当前计算机的CPU设置-->
<value>2</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<!-- Resource Manager管理地址 -->
<value>Master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<!-- Resource Manager Web地址 -->
<value>Master:8088</value>
</property>
</configuration>
六. 复制Hadoop配置文件
Master配置完成后,需要将Master的/usr/local/hadoop(HADOOP_HOME)目录中的配置文件复制到所有Slave节点上。首先,在Master上执行如下命令:
$ cd /usr/local
$ sudo rm -r ./hadoop/tmp #删除Hadoop临时文件
$ sudo rm -r ./hadoop/logs/* #删除Hadoop日志文件
$ tar -zcf ~/hadoop.master.tar.gz ./hadoop #将Hadoop的配置目录压缩成一个文件到用户主目录下
$ cd ~
$ scp ./hadoop.master.tar.gz miles@Slave01:~/ #将压缩包文件复制到Slave01主机上miles用户的主目录下
然后,在Slave节点上执行如下命令:
$ sudo rm -r /usr/local/hadoop #删除原来的Hadoop文件和目录
$ sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local #解压缩都/usr/local目录中
$ sudo chown -R miles /usr/local/hadoop #修改/usr/local/hadoop目录的拥有者为Hadoop用户miles
七. 启动Hadoop
1. 启动HDFS
● 初始化namenode
Master是namenode,Slave是datanode,所以只需要在Master上对HDFS进行格式化,命令如下:
$ hdfs namenode -format #初始化namenode
格式化会产生多条信息,其中倒数第三行如果出现
……Storage directory /home/miles/hdfs/name has been successfully formatted,则说明格式化HDFS成功。
不报错返回 “Exiting with status 0” 为成功,“Exiting with status 1”为失败。
● 测试启动HDFS
在Master上执行如下命令
$ start-dfs.sh #启动dfs
$ start-yarn.sh #启动yarn
$ mapred --daemon start historyserver #启动historyserver,它不是必须的步骤
在Master上执行$jps
命令,可以看到5个进程。
NameNode
SecondaryNameNode
NodeManager
ResourceManager
Jps
JobHistoryServer
在Slave上执行$jps
命令,可以看到3个进程。
DataNode
NodeManager
Jps
注意:缺少任何一个进程都表示出错。可以通过浏览器访问http://Master:9870(Hadoop3)或者http://Master:50070(Hadoop2)查看日志Logs,或者名称节点和数据节点。
2. 查看Hadoop集群情况
在Master上执行$ hdfs dfsadmin -report
命令,查看数据节点是否正常启动。如果正常启动,返回如下图所示信息。其中Live datanodes不为0,说明集群启动成功。下图说明集群中有3个datanode。
也可以在浏览器中输入http://master:9870或者用IP地址http://192.168.1.10:9870,通过Web查看集群的状态,如下图所示。
八. Hadoop平台测试
- WordCount
在Hadoop的安装目录下(/usr/local/hadoop/),提供了一个单词统计程序——WordCount。WordCount程序运行于Hadoop计算平台之上,充分利用了MapReduce和HDFS。它可以对文件中单词出现次数进行统计,然后给出统计结果。我们通过运行WordCount程序,可以检测Hadoop平台是否能够正常运行。
1 在HDFS上建立相应的目录和相应的文本文件。在主目录下(/home/miles/)建立文件夹input,并进入文件夹input,执行命令如下:
$ mkdir /home/miles/input
$ cd /home/miles/input
建立文件file01和file02,并分别写入要统计的内容,命令如下:
$ echo "hello world bye world" > file01 #写内容到文件file01中
$ echo "hello hadoop goodbye hadoop" >file02 #写内容到文件file02中
2 在HDFS上建立目录input,将file01和file02上传至hdfs的input目录,执行命令如下
$ cd /home/miles/input
$ hadoop fs -mkdir /hadoopusers/miles/input #创建HDFS的/hadoopusers/miles/input目录
$ hadoop fs -put * /hadoopusers/miles/input #将/home/miles/input目录下的文件上传到HDFS的/hadoopusers/miles/input目录
$ hadoop fs -ls /hadoopusers/miles/input #/查看HDFS的/hadoopusers/miles/input目录下文件的状态
当终端显示:
-rw-r--r-- 4 miles supergroup 22 2018-11-09 21:43 input/file01
-rw-r--r-- 4 miles supergroup 28 2018-11-09 21:43 input/file02
则表示文件上传到HDFS成功。
3 运行WordCount程序
进入(根据HADOOP_HOME的设置)为/usr/local/hadoop/etc/hadoop//share/hadoop/mapreduce目录。然后执行WordCount程序,命令如下
#进入目录
$ cd /usr/local/hadoop/share/hadoop/mapreduce
#执行Wordcount程序
$ hadoop jar hadoop-mapreduce-examples-3.1.1.jar wordcount /hadoopusers/miles/input /hadoopusers/miles/output
注意:output必须是没有创建过的空目录。
终端会产生较多的系统运行信息,若显示如下信息:
18/11/09 21:56:18 INFO mapreduce.Job: map 0% reduce 0%
18/11/09 21:56:29 INFO mapreduce.Job: map 100% reduce 0%
18/11/09 21:56:38 INFO mapreduce.Job: map 100% reduce 100%
18/11/09 21:56:38 INFO mapreduce.Job: Job job_1410242637907_0001 completed successfully
18/11/09 21:56:38 INFO mapreduce.Job: Counters: 43
表明程序在运行过程中执行了mapreduce分布式编程模式。
4 程序的运行结果输出
WordCount程序运行完成后,统计的结果会输出到HDFS的output 目录下的part-r-00000文件中。输入以下命令可以查看单词的统计结果。
$ hadoop fs -cat /hadoopusers/miles/output/part-r-00000
在terminal终端显示的输出结果为:
bye 1
goodbye 1
hadoop 2
hello 2
world 2
从结果中可以看到,Hadoop集群能够成功地将文件file01和file02中各单词出现的次数统计出来,说明Hadoop平台能够成功运行。
问:如何获知、设置和修改hadoop用户的默认目录?
- 查看Hadoop集群信息
在执行过程中,在浏览器中输入http://master:8088或者http://192.168.1.10:8080,通过Web界面查看Hadoop集群信息,如下图所示。
上述说明Hadoop集群都正常启动了。如果需要关闭Hadoop集群,可以在Master上执行命令:
$ stop-yarn.sh
$ stop-dfs.sh
$ mapred --daemon stop historyserver #关闭历史记录服务
问:自学使用Docker(容器)配置如本实验所述的Hadoop集群。
九.报错
“2018-10-30 13:30:40,855 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”
在/etc/profile中,添加下面配置:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
使配置生效:$ source /etc/profile
- 如果Hadoop之前启动过,但是现在无法正常启动,特别是datanode无法启动时。可以删除Master上存放集群的name名称、data名称的文件,执行如下命令:
$ rm -r /home/miles/hdfs/name/*
$ rm -r /home/miles/hdfs/data/*
以及包括Master和所有Slave在内所有节点的临时文件,执行如下命令:
$ rm -r /home/miles/tmp/*
在重新执行$ hdfs namenode -format
命令,重新进行Hadoop集群格式化。
3.如果遇到如下错误“java.net.ConnectException: Call From Master/192.168.1.10 to Master:8032 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
”,可能的原因是ResourceManager没有启动。
参考文献
- Apache Hadoop 3.1.1官方文件https://hadoop.apache.org/docs/r3.1.1/
- Hadoop集群安装英文版https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html
- Hadoop 3.x新特性剖析https://www.cnblogs.com/smartloli/p/9028267.html
- xfce4和VNCServer配置https://www.howtoing.com/how-to-install-and-configure-vnc-on-ubuntu-18-04
- Ubuntu16.04 下 hadoop的安装与配置(伪分布式环境)https://www.cnblogs.com/87hbteo/p/7606012.html
- 完全分布式Hadoop集群搭建https://blog.csdn.net/u014636511/article/details/80171002
- Hadoop3.1.0完全分布式集群部署超详细记录https://blog.csdn.net/weixin_42142630/article/details/81837131
- Hadoop3.1.0完全分布式集群部署超详细记录https://blog.csdn.net/dream_an/article/details/80258283?utm_source=blogxgwz0
- Hadoop环境搭建(单机)https://blog.csdn.net/qazwsxpcm/article/details/78637874?utm_source=blogxgwz0
- Hadoop3.0稳定版的安装部署https://blog.csdn.net/rlnLo2pNEfx9c/article/details/78816075