1 安装JDK
首先是安装和配置JDK环境变量.
我这里使用的是jdk-8u191-linux-x64.tar.gz.可以自己到oracle的官网下载合适的jdk版本.
- 解压到指定目录
我这里是/usr/lib/jvm/
,解压后的java文件夹是jdk1.8.0_191.安装目录可以自己设定.
$ sudo mkdir /usr/lib/jvm/
$ sudo tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/lib/jvm/
- 设置java环境变量
在终端输入
$ sudo vim /etc/profile
在打开的profile文件中设置JAVA_HOME和PATH变量:
#set JAVA environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_192
export PATH=$JAVA_HOME/bin:$PATH
在终端中输入source /etc/profile
使之生效.
- 检验是否配置成功
在终端输入
$ 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)
2 安装hadoop
从hadoop官网上下载hadoop包,我这里使用的是hadoop-2.9.2.tar.gz.
输入以下命令,解压到安装目录中,我这里的安装目录是/opt/hadoop
.
$ mkdir /opt/hadoop
$ sudo tar -zxf /home/xxx/Downloads/hadoop-2.9.2.tar.gz -C /opt/hadoop/
主要,这里创建的/opt/hadoop,以及解压后的hadoop文件是属于root用户的.而我日常是用个人用户登录的,所以为了方便使用,我用以下命令将hadoop的所有者权限改为个人用户usr1.
$ sudo chown -R usr1:usr1 /opt/hadoop/
3 配置hadoop
3.1 配置hadoop环境变量
用`vim /etc/profile'打开配置文件,和配置java环境变量一样,在/etc/profile文件上增加以下内容:
# set Hadoop environment
export HADOOP_HOME=/opt/hadoop/hadoop-2.9-2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
注意sbin
文件夹中包含运行hadoop daemonds的脚本,因此应该被添加到环境变量中.
3.2 在hadoop环境文件中设置java路径
我们需要在hadoop-env.sh,mapred-env.sh和yarn-env.sh文件中设置java的路径,以使hadoop能找到安装的java虚拟机.
用如下命令打开相应的xxx-env.sh文件:
$ sudo vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
在打开的xxx-env.sh文件中,修改JAVA_HOME,如下:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191
hadoop有单机模式(standalone or local model),伪分布式模式(pseudodistributed mode)和真实分布式模式(fully distributed mode)三种部署方式.单机模式是指仅在一台计算机上部署,不采用计算机群;伪分布式模式是通过多进程模拟出一种计算机群组的假象,但仍然是在同一台计算机上部署,由于单个计算机进程数目有限,因此其模拟的计算机集群数目也比较小.真实分布式模式是在有多台计算机组成的计算机群组中进行部署,也是实际生产中采用的模式.单机模式和伪分布式模式由于在一台计算机上部署,比较适合用于hadoop的学习和开发调试.
上述过程就已经完成了单机模式的部署.下面的介绍是伪分布式模式需要进行的过程.而对于真实分布式模式,本篇不做介绍.
4 伪分布式模式配置hadoop
首先,我们进入hadoop的etc/hadoop/目录:
$ cd $HADOOP_HOME/etc/hadoop
我们需要对该目录下的core-site.xml,hdfs-site.xml,mapred-site.xml和yarn-site.xml文件进行配置.
4.1 配置core-site.xml
打开core-site.xml文件:
$ vim core-site.xml
在<configuration></configuration>
对中添加一下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data/tmp</value>
</property>
其中fs.defaultFS表示默认的文件系统,这里设置为hdfs://localhost,表示配置在本机的hdfs系统.
hadoop.tmp.dir指定hadoop的临时文件夹,默认在/tmp/hadoop-${user.name}文件夹下,我这里设置为/opt/hadoop/data/tmp.如果没有这个文件夹,需要通过以下命令创建:
$ mkdir -p /opt/hadoop/data/tmp/
至于为什么要修改默认的tmp目录,我看到的说法是NameNode会将HDFS的元数据存储在tmp文件夹下.如果采用默认的/tmp/hadoop-username,系统默认的/tmp文件夹在操作系统重启后会被清空,这样会导致Namenode元数据丢失,因此应该予以修改.
4.2 配置hdfs-site.xml
vim打开hdfs-site.xml文件,在<configuration></configuration>
对中添加一下内容:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
dfs.replication配置的是HDFS存储是的备份数量,这里设置为1.
4.2.1 格式化namenode
上述配置完成后,需要对namenode进行格式化,格式化命令如下:
$ hdfs namenode -format
格式化后,查看core-site.xml里hadoop.tmp.dir(这里是/opt/hadoop/data/tmp)文件夹下有没有dfs目录,如果有,说明格式化成功.
4.2.2 启动节点
- 启动namenode
$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/hadoop/hadoop-2.9.2/logs/hadoop-xxx-namenode-ubuntu.out
- 启动datanode
$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/hadoop/hadoop-2.9.2/logs/hadoop-xxx-datanode-ubuntu.out
- 启动secondarynamenode
$ hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /opt/hadoop/hadoop-2.9.2/logs/hadoop-xxx-secondarynamenode-ubuntu.out
第一行是终端输入的命令,第二行是终端给出的输出反馈.第二行的xxx是你的用户名.
然后我们可以通过jps命令查看各个节点是否开启:
$ jps
82113 Jps
81892 DataNode
82007 SecondaryNameNode
81785 NameNode
五位数字代表进程号,后面跟着的是进程名.可以看到DataNode,SecondaryNameNode和NameNode已成功开启.五个相应进程没有出现在jps命令的输出中,说明该节点没有被成功打开.
4.3 配置mapred-site.xml
默认没有mapred-site.xml文件,但有个mapred-site.xml.template配置模板文件.复制模板生成mapred-site.xml,命令如下:
$ cd $HADOOP_HOME/etc/hadoop/
$ cp mapred-site.xml.template mapred-site.xml
vim打开mapred-site.xml,在<configuration></configuration>
块中添加以下内容:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
指定mapreduce运行在yarn框架上.
4.4 配置yarn-site.xml
vim打开yarn-site.xml,<configuration></configuration>
块中添加以下内容:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
yarn.nodemanager.aux-services配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。
yarn.resourcemanager.hostname指定了Resourcemanager运行在哪个节点上。
- 启动Resourcemanager
$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/hadoop/hadoop-2.9.2/logs/yarn-xxx-resourcemanager-ubuntu.out
- 启动nodemanager
$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/hadoop/hadoop-2.9.2/logs/yarn-xxx-nodemanager-ubuntu.out
- 通过jps查看是否启动成功
$ jps
84576 ResourceManager
81892 DataNode
82007 SecondaryNameNode
81785 NameNode
85021 Jps
84861 NodeManager
- yarn的web页面
yarn的web客户端端口号是8088,可以通过http://localhost:8088/查看.
5 一些操作
5.1 HDFS上测试创建目录,上传,下载文件
- HDFS上创建目录
$ hdfs dfs -mkdir /demo1
$ hdfs dfs -ls /
Found 2 items
drwxr-xr-x - yourusername supergroup 0 2018-12-04 22:03 /demo1
drwx------ - yourusername supergroup 0 2018-12-04 22:48 /tmp
可以看见,刚刚创建的/demo1已经存在.
- 上传本地文件到HDFS上
这里我们把上面用到过的core-site.xml文件上传到刚刚创建的/demo1目录下.
$ hdfs dfs -put $HADOOP_HOME/etc/hadoop/core-site.xml /demo1
$ hdfs dfs -ls /demo1
Found 1 items
-rw-r--r-- 1 yourusername supergroup 954 2018-12-04 22:03 /demo1/core-site.xml
- 读取HDFS上的文件内容
这里我们读取刚刚上传的core-site.xml文件
$ hdfs dfs -cat /demo1/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data/tmp</value>
</property>
</configuration>
- 从HDFS上下载文件到本地
$ mkdir test
$ hdfs dfs -get /demo1/core-site.xml ./test
$ ls ./test
core-site.xml
5.2 运行一个MapReduce Job
在Hadoop的share目录里,自带了一些jar包,里面带有一些mapreduce实例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以运行这些例子体验刚搭建好的Hadoop平台,我们这里来运行最经典的WordCount实例。
- 创建测试用文件
在本地/opt/data/目录下创建一个wc.input文件,内容如下:
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
- 创建输入目录,命令如下:
$ hdfs dfs -mkdir -p /wordcountdemo/input
- 将wc.input上传到输入目录中,命令如下:
$ hdfs dfs -put /opt/data/wc.input /wordcountdemo/input
- 运行wordcount
$ cd $HADOOP_HOME
$ yarn jar share/hadoop/mapreduce/hadoop-mapraduce-examples-2.9.2.jar wordcount /wordcountdemo/input /wordcountdemo/output/
- 查看输出结果
$ hdfs dfs -ls /wordcountdemo/output
-rw-r--r-- 1 yourusername supergroup 0 2018-12-04 22:50 /wordcountdemo/output/_SUCCESS
-rw-r--r-- 1 yourusername supergroup 60 2018-12-04 22:50 /wordcountdemo/output/part-r-00000
output目录中有两个文件,_SUCCESS文件是空文件,有这个文件说明Job执行成功.
part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果,mapreduce程序执行时,可以没有reduce阶段,但是肯定会有map阶段,如果没有reduce阶段这个地方是-m-.
一个reduce会产生一个part-r-开头文件.
part-r-00000文件内容如下:
$ hdfs dfs -cat /wordcountdemo/output/part-r-00000
hadoop 3
hbase 1
hive 2
mapreduce 1
spark 2
sqoop 1
storm 1
5.3 停止hadoop
$ hadoop-daemon.sh stop namenode
stopping namenode
$ hadoop-daemon.sh stop datanode
stopping datanode
$ yarn-daemon.sh stop resourcemanager
stopping resourcemanager
$ yarn-daemon.sh stop nodemanager
stopping nodemanager
参考
- 史上最详细的Hadoop环境搭建
- Hadoop: The Definitive Guide, 4th Edition, 679-682