Hadoop笔记
实验环境
- Ubuntu 18.04
- jdk1.8.251
- Hadoop3.1.3
1、Hadoop的三种运行模式(启动模式)
1.1、单机模式(独立模式)(Local或Standalone Mode)
-
默认情况下,Hadoop即处于该模式,用于开发和调式。
-
不对配置文件进行修改。
-
使用本地文件系统,而不是分布式文件系统。
-
Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行的。
-
用于对MapReduce程序的逻辑进行调试,确保程序的正确。
1.2、伪分布式模式(Pseudo-Distrubuted Mode)
- Hadoop的守护进程运行在本机机器,模拟一个小规模的集群
- 在一台主机模拟多主机。
- Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在同一台机器上运行,是相互独立的Java进程。
- 在这种模式下,Hadoop使用的是分布式文件系统,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试Hadoop程序的执行是否正确。
- 修改3个配置文件:core-site.xml(Hadoop集群的特性,作用于全部进程及客户端)、hdfs-site.xml(配置HDFS集群的工作属性)、mapred-site.xml(配置MapReduce集群的属性)
- 格式化文件系统
1.3、全分布式集群模式(Full-Distributed Mode)
- Hadoop的守护进程运行在一个集群上
- Hadoop的守护进程运行在由多台主机搭建的集群上,是真正的生产环境。
- 在所有的主机上安装JDK和Hadoop,组成相互连通的网络。
- 在主机间设置SSH免密码登录,把各从节点生成的公钥添加到主节点的信任列表。
- 修改3个配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml,指定NameNode和JobTraker的位置和端口,设置文件的副本等参数
- 格式化文件系统
参考:
https://www.cnblogs.com/zhangyinhua/p/7647686.html
https://hadoop.apache.org/docs/stable/index.html
2、Hadoop单例模型搭建
默认情况下,Hadoop被配置为在非分布式模式下作为单个Java进程运行。这对于调试很有用。
2.1 安装SSH和JDK
-
更新apt包
sudo apt-get update
-
安装SSH server
sudo apt-get install openssh-server
通过以下命令登录本机和退出
ssh localhost exit
-
安装JDK
-
检查是否已经安装
java -version
-
官网下载JDK
这里选择的是: jdk-8u251-linux-x64.tar.gz -
先在
/usr/local/
路径下创建名为java
的文件夹,将下载好的包移到改文件夹下,并解压mkdir /usr/local/java sudo mv 下载的包的路径/jdk-8u251-linux-x64.tar.gz /usr/local/java sudo tar -xvzf jdk-8u251-linux-x64.tar.gz
-
配置环境变量
编辑/etc/bash.bashrc
文件sudo vim /etc/bash.bashrc
在末尾加上如下语句
JAVA_HOME=/usr/local/java/jdk1.8.0_251 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH
使配置文件生效
source /etc/bash.bashrc
-
2.2 安装Hadoop
-
下载安装镜像
可以去镜像:https://mirrors.cnnic.cn/apache/hadoop/common/
这里选择:hadoop0-3.1.3 -
解压到
/usr/local/
文件夹下sudo tar -xvzf 镜像位置/hadoop-3.1.3.tar.gz /usr/local
-
解压的文件夹名为
hadoop-3.1.3
,可以重命名sudo mv hadoop-3.1.3 hadoop
-
检测
./usr/local/hadoop/bin/hadoop version
如果在hadoop文件夹下 可以直接使用hadoop命令
-
设置环境变量
如果没有设置环境变量使用hadoop需要进入到/usr/local/hadoop/bin
或/usr/local/hadoop/sbin
目录下,设置环境变量后可以直接使用hadoop命令。-
编辑
/etc/bash.bashrc
文件vim /etc/bash.bashrc
-
修改之前配置的内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/jre export HADOOP_HOME=/usr/local/hadoop export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
-
是文件生效
source /etc/bash.bashrc
-
2.3 测试hadoop自带wordcount程序
-
进入到
hadoop
文件夹,创建一个文件test1.txt
用于作为wordcount程序的输入cd /usr/local/hadoop touch test1.txt vim test1.txt
-
在hdfs中创建input文件夹
bin/hadoop fs -mkdir input
-
将
test1.txt
文件放到hdfs的input目录下bin/hadoop fs -put test1.txt input
-
查看是否正确传入
bin/hadoop fs -ls input
-
在
share/hadoop/mapreduce/
目录下有很多jar包,其中我们需要执行的wordcount程序就在hadoop-mapreduce-examples-3.1.3.jar
中
-
执行wordcount程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input/ output
-
输出结果在output目录下
bin/hadoop fs -cat output/part-r-00000
结果截图:
参考:
https://blog.csdn.net/weixin_42001089/article/details/81865101
https://www.pianshen.com/article/4237698469/
3、Hadoop伪分布式模型搭建
伪分布式需要修改2个配置文件core-site.xml
和hdfs-site.xml
,路径为/usr/local/hadoop/etc/hadoop
3.1 修改配置文件
-
编辑
core-site.xml
文件vim core-site.xml
在
<configuration>
标签中添加如下配置<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
-
编辑
hdfs-site.xml
文件vim hdfs-site.xml
在
<configuration>
标签中添加如下配置<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
这里的dfs.replication就是指备份的份数
配置说明:(这里粘贴一下原博主的话吧)
Hadoop的运行方式是由配置文件决定的(运行Hadoop时会读取配置文件),因此如果需要从伪分布模式切换到非分布式模式,需要删除core-site.xml中的配置项。
此外,伪分布式虽然只需要配置fs.defaultFS和dfs.replication就可以运行(官方教程如此),不过若没有配置hadoop.tmp.dir参数,则默认使用的临时目录为/tmp/hadoop-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行format才行。所以进行了设置,同时也指定dfs.namenode.name.dir和dfs.datanode.data.dir,否则在接下来的步骤中可能会处错
3.2 设置无密码SSH
-
进入
.ssh
文件夹cd ~/.ssh
-
使用rsa算法生成秘钥和公钥对
ssh-keygen -t rsa
然后一路回车,其中默认秘钥和公钥对的保存位置为
.ssh/id_rsa
,直接回车即选择默认,之后输入ssh登录密码生成秘钥和公钥对。
-
把公钥加入授权
公钥保存位置为~/.ssh/id_rsa.pub
cat ./id_rsa.pub >> ./authorized_keys
3.3 启动集群
-
格式化文件系统
./bin/hdfs namenode -format
-
启动NameNode守护程序和DataNode守护程序
./sbin/start-dfs.sh
-
验证
jps
同时出现以上四个即成功
参考:
https://blog.csdn.net/weixin_42001089/article/details/81865101
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
4、Hadoop集群模式部署
4.1 在非安全模式下配置Hadoop
Hadoop的Java配置由两种重要的配置文件驱动:
- 只读默认配置-
core-default.xml
,hdfs-default.xml
,yarn-default.xml
和mapred-default.xml中
。 - 特定于站点的配置-
etc / hadoop / core-site.xml
,etc / hadoop / hdfs-site.xml
,etc / hadoop / yarn-site.xml
和etc / hadoop / mapred-site.xml
。
此外,您可以通过在etc / hadoop / hadoop-env.sh
和etc / hadoop / yarn-env.sh中
设置特定于站点的值,来控制在发行版的bin /目录中找到的Hadoop脚本。
要配置Hadoop集群,您将需要配置Hadoop守护程序执行的环境
以及Hadoop守护程序的配置参数
。
HDFS守护程序是NameNode,SecondaryNameNode和DataNode。
YARN守护程序是ResourceManager,NodeManager和WebAppProxy。
如果要使用MapReduce,则MapReduce Job History Server也将运行。
对于大型安装,它们通常在单独的主机上运行
4.2 准备工作
准备三台虚拟机
-
先配置一台新的ubuntu虚拟机,安装配置jdk和hadoop,然后直接克隆两个虚拟机。
参考2.1和2.2 -
修改三个虚拟机的主机名
sudo vim /etc/hostname
修改、保存、重启即可
-
通过主机名Ping通三台虚拟机
如果不成功,修改/etc/hosts
文件sudo vim /etc/hosts
将三台虚拟机的ip地址和主机名加入到文件末尾,每个一行。
-
SSH无密码验证配置
参考3.2完成本机无密码登录
-
主服务器SSH无密码登录从服务器
在从服务器上,通过一下命令将主服务器的公钥
id_rsa.pub
拷贝到从服务器中,并授权cd ~/.ssh scp parallels@xiangyoulin001:~/.ssh/id_rsa.pub ./master_rsa.pub cat master_rsa.pub >> authorized_keys
两台从服务器都操作完后,主服务器就可以无密码登录从服务器了。
-
注意
登录其他主机时,如果两台虚拟机用户名相同,可以直接通过主机名登录;如果用户名不相同,需要以用户名@主机名
的方式连接登录。
4.3 配置Hadoop
4.3.1 配置主服务器
-
需要配置的文件共有5 个,都在
/usr/local/hadoop/ect/hadoop
目录下- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
- workers
-
配置core-site.xml
<configuration>
<property>
<!-- 主机名:9000 -->
<name>fs.defaultFS</name>
<value>hdfs://xiangyoulin001:9000</value>
</property>
<property>
<!-- Hadoop临时文件夹,需要自行创建 -->
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
</property>
<property>
<!-- 删除的文件在垃圾桶中保存时间为10080s -->
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
根据配置的临时文件目录,在相应目录先创建文件夹
cd /usr/local/hadoop
sudo mkdir -p data/tmp
- 配置hdfs-site.xml
<configuration>
<property>
<!-- 将secondarynamenode放在第三台机器上 -->
<name>dfs.namenode.secondary.http-address</name>
<value>xiangyoulin003:50090</value>
</property>
</configuration>
- 配置mapred-site.xml
<configuration>
<property>
<!--指定Mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!-- 将jobhistory放在第一台机器上 -->
<name>mapreduce.jobhistory.addres</name>
<value>xiangyoulin001:10020</value>
</property>
<property>
<!-- 网络访问地址 -->
<name>mapreduce.jobhistory.webapp.address</name>
<value>xiangyoulin001:19888</value>
</property>
</configuration>
- 配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<!-- nodemanager分发到各节点 -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- resourcemanager放在第二台机器上 -->
<name>yarn.resourcemanager.hostname</name>
<value>xiangyoulin002</value>
</property>
<property>
<!-- 日志聚合 -->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
- 配置workers
localhost
xiangyoulin001
xiangyoulin002
xiangyoulin003
添加三台机器的主机名或ip,每个一行。
!注意:
这里我用的是hadoop3.1.3,3以前的workers文件叫salves。如果配置不对,其他从节点无法分配到datanode。
这里是官方教程的说明
4.3.2 配置子节点
根据以下命令,将配置好的Hadoop复制到子节点
cd /usr/local
scp -r hadoop/ parallels@xiangyoulin002:/usr/local
scp -r hadoop/ parallels@xiangyoulin003:/usr/local
4.3.3 格式化
hadoop namenode -format
三台机器都执行一次格式化
4.4 启动Hadoop集群
- 启动集群
start-all.sh
- 启动jobhistoryserver
mr-jobhistory-daemon.sh start historyserver
-
分别使用jps命令查看部署情况
-
关闭hadoop集群
stop-all.sh
- 关闭jobhistoryserver
mr-jobhistory-daemon.sh stop historyserver
参考
https://blog.csdn.net/u014636511/article/details/80171002
https://www.cnblogs.com/zhangyinhua/p/7652686.html
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html