单机模式
Hadoop默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单Java进程,方便进行调试。
Prerequisites
- Ubuntu 20.04
- Java 8
- SSH
# 安装ssh
$ sudo apt-get install openssh-server
# 配置ssh key
$ cd ~
$ mkdir .ssh # 如果该文件存在则忽略此命令,不影响
$ cd ~/.ssh
$ ssh-keygen -t rsa
$ cat id_rsa.pub >> authorized_keys
Install Hadoop
# 下载Hadoop软件压缩包
$ cd ~/Desktop
$ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
$ sudo tar -zxvf hadoop-3.3.1.tar.gz # 将软件压缩包解压到当前文件夹
检测是否安装成功
如果出现$ cd ~/Desktop/hadoop-3.3.1 # 进入hadoop文件目录
# 查看hadoop版本,正确输出版本号则安装成功
$ ./bin/hadoop version
JAVA_HOME is not set and could not be found
报错执行以下命令:
- 查找jdk包名:
$ ls /usr/lib/jvm
- 打开
.bashrc
文件:$ vim ~/.bashrc
在打开文件的末尾追加以下几行内容
export JAVA_HOME=/usr/lib/jvm/<此处填写第一步找到的jdk包名>
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存并退出,输入
source ~/.bashrc
更新即可。重新检测hadoop是否安装成功。
运行示例
hadoop单机模式提供了很多例子供我们尝试
# 输入如下命令会显示hadoop自带的各种例子
$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
wordcount例子演示
$ cd ~/Desktop/hadoop-3.3.1 # 进入hadoop文件目录下
$ mkdir input # 创建input文件夹保存需要传入Hadoop中处理的数据
$ cp etc/hadoop/*.xml input # 将文件拷贝到input文件夹中,也可以自己生成一些文本文件
$ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount input output # 运行Hadoop处理input中的数据
$ ls output # output文件夹下可以看到运行结果情况
$ cat output/part-r-00000 # 查看运行结果
伪分布式模式
Hadoop可以在单个主机上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,该主机既作为NameNode也作为DataNode。同时,Hadoop系统现在读取的是HDFS中的文件。
注意:伪分布式模式是在单机模式基础上进行开发,单机模式必须安装测试成功后才能进行伪分布式模式配置。配置步骤(在hadoop-3.3.1文件目录下运行)
修改配置文件
etc/hadoop/core-site.xml
, 用于设置HDFS访问路径<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改配置文件
etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:Your_Hadoop_Folder_Dir/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:Your_Hadoop_Folder_Dir/tmp/dfs/data</value>
</property>
</configuration>
修改配置文件
etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/<你电脑上所安装的jdk包名>
# 如果不知道包名可通过 ls /usr/lib/jvm 查看
启动Hadoop
$ bin/hdfs namenode -format # namenode格式化
$ sbin/start-dfs.sh # 开启守护进行
# 判断是否启动成功。若成功启动则会列出如下进程: NameNode、DataNode和SecondaryNameNode。
$ jps
此时打开Ubuntu自带浏览器,输入URL
http://localhost:9870
可以查看NameNode,DataNode信息,还可以在线查看HDFS中的文件。
运行示例
创建当前用户的HDFS目录
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<your_username>
在HDFS中创建input文件夹并上传数据
$ bin/hdfs dfs -mkdir input
$ bin/hdfs dfs -put etc/hadoop/*.xml input
运行wordcount程序
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount input output
在HDFS中查看运行结果或将结果拷贝至本地
# 在HDFS中查看运行结果
$ bin/hdfs dfs -cat output/*
# 将运行结果拷贝至本地查看
$ bin/hdfs dfs -get output output
$ cat output/*
运行结束终止进程
$ sbin/stop-dfs.sh
分布式模式
Prerequisites
- 选定master节点, 在master节点上安装Hadoop, java环境, SSH, 并修改Hadoop配置信息
- 在其他slave节点上安装java环境, SSH
- 将master节点上的hadoop文件夹复制到其他slave节点上
- 在master节点上启动Hadoop, 查看运行状态
网络配置
- 因为我们是虚拟机安装的系统, 所以需要更改网络连接方式为桥接(Bridge)模式, 才能实现多个节点互联
- 确保各个节点的MAC地址不同 (可以点右边的按钮随机生成 MAC 地址,否则 IP 会冲突)
- Linux查看节点IP地址的命令为
ifconfig
或hostname -I
, 即下图所示的inet地址
- 为了便于区分每个节点, 我们可以修改各个节点上的主机名, 以方便区分
- 执行命令
sudo vim /etc/hostname
修改主机名 - 修改hostname中的配置信息, 更换为你想换成的节点名称即可
- 执行命令
sudo vim /etc/hosts
修改自己所用节点的IP映射 - 重启系统
- 执行命令
- 如上所述是单个结点的网络配置, 我们还需要再其他所有节点上完成类似修改
配置成功检验方法: 在各个
ping
其他节点, 如果ping
的通, 说明配置成功$ ping master -c 5 # -c指定ping的次数
$ ping slave1 -c 5
注意: 网络配置成功后, 每次关闭虚拟机不要选择直接关闭, 选择保存当前状态关闭, 不然下次重新打开可能会更换IP, 所有网络配置都需要重新进行!
SSH无密码登录节点
这个操作是要让master节点可以无密码SSH登录到各个slave节点上
首先生成master节点的公钥 (因为改过主机名, 所以还需要删除原有的再重新生成一次), 在master节点上执行如下操作
$ cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
$ rm ./id_rsa* # 删除之前生成的公匙(如果有)
$ ssh-keygen -t rsa # 一直按回车就可以
让master节点能无密码SSH本机, 在master节点上执行:
$ cat ./id_rsa.pub >> ./authorized_keys
完成后可以尝试
ssh master
验证一下 (成功后执行exit返回原来的终端), 接着在master节点上将公钥传输到各个slave节点$ scp ~/.ssh/id_rsa.pub root@slave1:/home/fudan/
接着在各个slave节点上将ssh公钥加入授权
$ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub # 用完就可以删掉了
在master节点上验证是否可以无密码ssh到各个slave节点
$ ssh slave1
$ ssh slave2
配置集群环境
概述
配置集群环境只需要在master节点中修改即可, 修改完之后复制hadoop文件夹到各个slave节点。
- 配置集群环境需要修改hadoop目录下
etc/hadoop
下的5个配置文件, 本文仅设置正常启动所必须的设置项, 更多设置可点击查看官方说明 - 配置好master节点的hadoop配置后, 删除hadoop文件夹中的tmp文件夹和logs文件夹(如果存在), 打包hadoop文件夹分发至slave节点上
master节点配置文件修改
workers
文件: 将DataNode
的主机名写入该文件, 每行一个slave1
slave2
core-site.xml
文件: 修改HDFS访问URL<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>Your_Hadoop_Folder_Dir/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml
文件: 修改replication, secondary namenode URL, datanode和namenode数据存储路径<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:Your_Hadoop_Folder_Dir/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:Your_Hadoop_Folder_Dir/tmp/dfs/data</value>
</property>
</configuration>
mapred-site.xml
: 配置MapReduce执行框架, JobHistory信息<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
yarn-site.xml
: 配置yarn框架ResourceManager和NodeManager<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
处理打包并分发到slave节点
删除hadoop文件夹目录下的logs文件夹和tmp文件夹(如果有)
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
执行namenode的格式化
$ ./bin/hdfs namenode -format
打包hadoop文件夹并分发
在master节点上启动Hadoop即可
$ ./sbin/start-dfs.sh
$ ./sbin/start-yarn.sh
$ ./sbin/mr-jobhistory-daemon.sh start historyserver
通过
jps
查看各个节点所启动的进程
master节点:
slave1节点
slave2节点
- 在master节点通过
./bin/hdfs dfsadmin -report
查看DataNode是否启动正常