大数据分析与挖掘环境配置(Hadoop、Java、SSH免密互连)
说明:很多网页超链接因为未知原因无法正常显示。可以复制关键字搜索,基本可以搜索到。
第 0 步 基本配置规划
各软件配置
工具 | 版本 |
---|---|
Linux平台:Ubuntu | 24.04.1 |
虚拟机平台:VMware Workstation Pro | 16.1.2 |
Hadoop | 2.7.3 |
Java | 1.8.0_172 |
Spark | 2.4.8 |
Scala | 2.11.12 |
Python | 3.7.9 |
说明:
-
默认是在 Windows 上进行配置(不是用 Mac 或 Linux )。
-
Linux平台和虚拟机平台没有什么讲究,用centOS做Liunx平台,选Virtual Box做虚拟机平台都是ok的。本人对Ubuntu比较熟,故选择该平台。
-
Hadoop版本现在已经到了3.x.x版本(截至2024年10月,是3.3.6版本)了,之所以还是选择2.x.x版本,是出于
稳定性考虑(当时老师给的参考文件是这个版本,现在的3.x.x版本已经足够稳定了,完全可以使用;但是已经配置得差不多了,就没改了)。- jdk版本也是出于同样考虑。且后续本人还需要安装Spark等(Scala2.11 及 jdk1.8),因此Hadoop建议选择Hadoop2.6.0及以上版本。
-
后面的3项不一定需要。Ubuntu自带的python版本是3.12,3.7版本的python要另外安装配置并设为默认。
Hadoop 节点规划
master(192.168.107.36) | slave1(192.168.107.37) | slave2(192.168.107.38) | |
---|---|---|---|
NameNode | ✔ | ||
Secondary Namenode | ✔ | ||
DataNode | ✔ | ✔ | ✔ |
ResourceManager | ✔ | ||
NodeManager | ✔ | ✔ | ✔ |
或者这样展示:
master(192.168.107.36) | slave1(192.168.107.37) | slave2(192.168.107.38) | |
---|---|---|---|
HDFS | NameNode DataNode | SecondaryNameNode DataNode | DataNode |
YARN | ResourceManager NodeManager | NodeManager | NodeManager |
说明:
-
各节点在Hadoop集群的作用现在不太清楚不要紧,后面配置相关xml文件时再考虑(master多承担一些责任)
-
也可以根据自己需要进行规划。(建议先跑通,再修改)
-
所有的软件包都安装在
/usr/local
目录里,方便后续 master主机 分发到 从主机(使用scp
命令)- 这个暂时看不懂不要紧,后面到了安装软件环节还会再提。
-
后面有参考资料,考虑到行文简洁一点,参考资料统一放到后面了
-
统一说法:主节点(也称为 master主机);从节点(也称为 子节点、slave主机)
第 1 步 下载软件
下载 Ubuntu
直接搜索 Ubuntu download 即可。
Download Ubuntu Desktop | Ubuntu
下载 VMware Workstation Pro
该公司这两年好像被收购了,看的很多博文的下载链接都失效了,都会跳转到Broadcom网站。
VMware17版本在注册登录后可以免费下载(不过感觉很麻烦);以前的版本需要自己去网上找资源(包括密钥/许可证)。
下载安装好后,创建3台主机,用户名及主机名如下:
username@hostname | |
---|---|
master(192.168.107.36) | hadoop@master |
slave1(192.168.107.37) | hadoop@slave1 |
slave2(192.168.107.38) | hadoop@slave2 |
之后运行以下命令(3台主机都需要):
sudo apt update
sudo apt upgrade
sudo apt install open-vm-tools open-vm-tools-desktop openssh-server openssh-client gedit
说明:
- username可以一样,也建议一样,以免可能的问题;hostname不能一样。
open-vm-tools open-vm-tools-desktop
两个包用于替代VM ware tools
的安装(否则需要另外安装);openssh-server openssh-client
用于后续的 ssh 免密登录;gedit
是比较好用的图形化文本编辑器。(也可以用 vi 或 nano)
下载 Hadoop&Java
Hadoop
Index of /dist/hadoop/common (apache.org)
v2.7.3
Java8
huaweicloud
Index of java-local/jdk/8u171-b11 (huaweicloud.com)
能在虚拟机里直接下载当然很好,如果不行,可以先在本机上先下载,再上传至虚拟机(U盘、xftp、wenshushu在线传,等等方法)。
第 2 步 实现 SSH 免密互连
添加 IP 地址
编辑 /etc/hosts
(3台主机都需要)。
192.168.107.36 master
192.168.107.37 slave1
192.168.107.38 slave2
说明:
-
使用
ip a
查看相关的网络信息(更多的查看网络信息的命令自行搜索)。 -
使用 VM ware 的虚拟网络编辑器的DHCP设置,设计相应的IP地址、网关、掩码(使用NAT);也可以设计静态的网络信息(自行搜索)。
- 本人还尝试过 VMware Workstation Pro for Linux (不是 for Windows);
- VMware Workstation Pro for Linux 在这个地方没有DHCP设置,因为 Linux 自带DHCP设置,即可能只能使用静态配置,或者关闭 Linux 自带的 DHCP 设置。
-
参考如下。这里从33开始,是因为开始3台主机(33、34、35)没配好,重新配了3台(即36、37、38)。
生成 RSA 密钥
运行一下命令(3台主机都需要)。
ssh-keygen -t rsa -b 4096
说明:
-t
指定 RSA 密钥;默认好像不是RSA,是ED25519。当然也可以使用默认的了,看个人。以下提到的密钥、公钥等,默认指RSA。-b
指定密钥长度。- 更多参数,自行搜索。
密钥分发
有2种思路:
- 使用
ssh-copy-id
(参考后面的资料); - 使用
scp
复制各自的公钥。
这里采用后一种。这也有2种方法。
- 3台主机各自发送公钥给另外2台,再各自将公钥加入各自的
authorized_keys
; - 2台 slave 主机先将自己的公钥发送给 master 主机,master 主机 将3个公钥一起加入
authorized_keys
,再分发给2台 slave主机。
这里采用后一种方法。
slave 主机 发送公钥
使用 scp
来发送 RSA 公钥
use
scp
to sendid_rsa.pub
slave1 主机
hadoop@slave1:~$ scp /home/hadoop/.ssh/id_rsa.pub master:/home/hadoop/.ssh/id_rsa_slave1.pub
slave2 主机
hadoop@slave2:~$ scp /home/hadoop/.ssh/id_rsa.pub master:/home/hadoop/.ssh/id_rsa_slave2.pub
如果有问题,试试下面的(即使用完整的username@hostname):
slave1 主机
hadoop@slave1:~$ scp /home/hadoop/.ssh/id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa_slave1.pub
slave2 主机
hadoop@slave2:~$ scp /home/hadoop/.ssh/id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa_slave2.pub
master 主机 生成 authorized_keys
generate
authorized_keys
master主机
hadoop@master:~/.ssh$ cat id_rsa.pub >> authorized_keys
hadoop@master:~/.ssh$ cat id_rsa_slave1.pub >> authorized_keys
hadoop@master:~/.ssh$ cat id_rsa_slave2.pub >> authorized_keys
master 主机 分发 authorized_keys
master 主机 分发 authorized_keys
给两台从主机(slave1 slave2)
send
authorized_keys
to slave1 slave2
master主机
hadoop@master:~$ scp /home/hadoop/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/
hadoop@master:~$ scp /home/hadoop/.ssh/authorized_keys hadoop@slave2:/home/hadoop/.ssh/
SSH 互连
3台主机都需要
ssh master
ssh slave1
ssh slave2
当出现 (yes/no/[fingerprint])?
时,输入 yes
。
When show (yes/no/[fingerprint])? type yes.
验证方法
搭建过程最大的一个问题就是,不知道是否出问题了。这里只能给出一些可能的验证方法。
- master slave1 slave2 3台主机可以ssh互连
- 即上述的 SSH 互连 3条命令都可以跑通
- 如果是要加username(例如
ssh hadoop@slave1
)才能跑通,大概率有问题
- 互相ping一下
ping slave1
ping salve2
ping master
第 3 步 安装 Hadoop & Java
默认2个安装包都在 /home/hadoop
目录下。
从这一步开始,所有的软件包都安装在 /usr/local
目录里,方便后续分发(使用 scp
命令)。
解压
master主机
cd /usr/local
sudo mkdir hadoop
cd hadoop
sudo tar -zxvf ~/jdk-8u172-linux-x64.tar.gz
sudo tar -zxvf ~/hadoop-2.7.3.tar.gz
配置环境变量
master主机
sudo gedit /etc/profile
在 etc/profile
中添加:
# Java Configuration
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
# Hadoop Configuration
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
使用 source /etc/profile
使之生效。
验证是否成功:
java -version
hadoop version
验证方法
测试hadoop里的mapreduce
cd /usr/local/hadoop/hadoop-2.7.3
sudo mkdir input
sudo cp etc/hadoop/*.xml input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input/ output 'dfs[a-z.]+'
其他
- 本文的第3步及第4步均在master主机上操作,之后再使用
scp
复制到另外2台slave主机。 - Java实际上在Ubuntu里可以直接使用
sudo apt install openjdk-
来查看所有的可选安装,版本从8到17都可以。但这里另外安装主要是为了后续分发,否则需要每台主机都使用sudo apt install openjdk-
来安装,同时/etc/profile
也需要对应修改(也可能是~/.bashrc
)。 - 可能会碰到多版本
Java
的问题,可以在网上自行搜索update-alternatives
(来选择首选项)。
第 4 步 配置文件
参考官方链接(2.7.3): Hadoop – Apache Hadoop 2.7.3
master主机
配置文件都在 /usr/local/hadoop/hadoop-2.7.3/etc/hadoop
目录下
建议对照 其他博客 和 官方文档 来修改
要复制建议复制去注释版,原版比较繁琐(惨不忍睹)
1 hadoop-env.sh
# The java implementation to use.
# export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
2 yarn-env.sh
# some Java parameters
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
3 core-site.xml
<!-- 指定namenode的地址 -->
<!-- 用于设置Hadoop的默认文件系统,由URI指定 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 用来指定使用hadoop时产生文件的存放目录 -->
<!-- 配置Hadoop的临时目录,默认/tmp/hadoop-${user.name} -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hadoop-2.7.3/tmp</value>
</property>
<!-- default value = 4096 -->
<property>
<name>io.file.buffer.szie</name>
<value>131072</value>
</property>
<!-- ??? -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- ??? -->
<!-- selectable configuration -->
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<!-- default value = 0, means disabled. -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
去注释版
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hadoop-2.7.3/tmp</value>
</property>
<property>
<name>io.file.buffer.szie</name>
<value>131072</value>
</property>
<!-- ??? -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- ??? -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
说明:
hadoop.proxyuser.hadoop.hosts
和hadoop.proxyuser.hadoop.groups
在官方的2.7.3的default文档中没找到;不知道能不能用,直接写上去了。/usr/local/hadoop/hadoop-2.7.3/tmp
应该要用sudo mkdir /usr/local/hadoop/hadoop-2.7.3/tmp
命令创建,但是后面会修改文件夹权限,进而可以自动创建,这里就先不管。- 有些注释可以直接删掉,看个人喜好。
4 hdfs-site.xml
<!-- default value = 0.0.0.0:50090 -->
<!-- 指定secondary namenode的HTTP地址和端口 -->
<!-- 指定SecondaryNameNode的主机和端口 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
<!-- 指定hdfs中namenode的存储位置 -->
<!-- 指定namenode元数据的存放位置 -->
<!-- 指定namenode名称空间的存储地址 -->
<!-- default value = file://${hadoop.tmp.dir}/dfs/name -->
<!--
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/dfs/nameNode</value>
<value>file:///usr/local/hadoop-2.7.3/tmp/dfs/name</value>
</property>
-->
<!-- 指定hdfs中datanode的存储位置 -->
<!-- 指定datanode数据存储地址 -->
<!-- 定义datanode数据存储的节点位置 -->
<!-- default value = file://${hadoop.tmp.dir}/dfs/data-->
<!--
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop-2.7.3/tmp/dfs/data</value>
</property>
-->
<!-- 指定hdfs保存数据的副本数量 -->
<!-- 指定数据冗余份数 -->
<!-- 文件切片的副本个数 -->
<!-- default value = 3 -->
<!--
Default block replication.
The actual number of replications can be specified
when the file is created.
The default is used if replication
is not specified in create time.
-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 指定可以通过web访问hdfs目录 -->
<property>
<!-- default value = true -->
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- selectable configuration -->
<!-- 设置HDFS的文件权限-->
<!-- default value = true -->
<!--
description:
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other
does not change the mode, owner or
group of files or directories.
-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- selectable configuration ??? -->
<!-- default value = 0.0.0.0:50070 -->
<!-- 指定namenode的页面访问地址和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
<!--
default ip address is 0.0.0.0; means listen all.
This is useful for making the name node HTTP server
listen on all interfaces by setting it to 0.0.0.0.
So, maybe no need to set this configuration?
-->
<!-- selectable configuration -->
<!-- 指定DataNode的节点配置文件 -->
<property>
<name>dfs.hosts</name>
<value>/usr/local/hadoop/hadoop-2.7.3/etc/hadoop/slaves</value>
</property>
去注释版
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
<!-- ??? -->
<property>
<name>dfs.hosts</name>
<value>/usr/local/hadoop/hadoop-2.7.3/etc/hadoop/slaves</value>
</property>
说明:
dfs.namenode.name.dir
和dfs.namenode.data.dir
是非常非常重要的配置。这里采用默认值,是因为之前的core-site.xml
已经配置好了hadoop.tmp.dir
,因此可以采用默认值。否则要自己在合适的位置配置文件夹。创建文件夹与上面的类似,等待后面的权限修改后自动创建。dfs.hosts
这个参数本人没配(指定文件),但这个文件后续是要配置的。(感觉这个参数影响不大?没配也照样跑通了。。。)- 参考后面的slaves文件,感觉就是根据
$HADOOP_HOME
来设置的默认值。
- 参考后面的slaves文件,感觉就是根据
5 mapred-site.xml
<!-- 告诉hadoop以后MR(Map/Reduce)运行在YARN上 -->
<!-- 指定分布式计算使用的框架是yarn -->
<!-- 指定运行mapreduce的环境是yarn -->
<!-- 指定MapReduce运行时框架,这里指定在Yarn上,默认是local -->
<!-- default value = local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- ??? -->
<!--
<property>
<name>mapreduce.jobtracker</name>
<value>master:9001</value>
</property>
-->
<!-- ??? -->
<!-- default value = 0.0.0.0:50030 -->
<property>
<name>mapreduce.jobtracker.http.address</name>
<value>master:50030</value>
<description>The job tracker http server address and port the server will listen on. If the port is 0 then the server will start on a free port.</description>
</property>
<!-- default value = 0.0.0.0:50060 -->
<property>
<name>mapreduce.tasktracker.http.address</name>
<value>master:50060</value>
<description>The task tracker http server address and port. If the port is 0 then the server will start on a free port.</description>
</property>
<!-- 配置jobhistory server -->
<!-- MapReduce JobHistory Server IPC host:port -->
<!-- 设置历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 设置网页访问历史任务的主机和端口 -->
<!-- MapReduce JobHistory Server Web UI host:port -->
<!-- default ip address is 0.0.0.0 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<!-- selectable configuration -->
<!-- 开启MapReduce小任务模式 -->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
去注释版
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobtracker.http.address</name>
<value>master:50030</value>
</property>
<property>
<name>mapreduce.tasktracker.http.address</name>
<value>master:50060</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>
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
6 yarn-site.xml
<!-- nomenodeManager获取数据的方式是shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- default -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- 指定Yarn的老大(ResourceManager)的地址 -->
<!-- 配置yarn主节点的位置 -->
<!-- 指定了这个属性 后面不用指定那5个ip端口地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- Yarn打印工作日志 -->
<!-- 开启日志聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- ??? -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>
<!-- ??? -->
<!-- 客户端提交作业的端口 -->
<!--
default value = ${yarn.resourcemanager.hostname}:port
${yarn.resourcemanager.hostname} has been defined before.
-->
<!--
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
-->
<!-- Selectable configuration -->
<!-- 设置聚合日志在hdfs上的保存时间 -->
<!-- default: -1 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
去注释版
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- ??? -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>
<!-- ??? -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
说明:
- 指定了
yarn.resourcemanager.hostname
,后面的5个参数可以直接使用默认的值(指定的hostname + 默认port)即可
7 salves
在Hadoop3.x.x以后,是workers文件
sudo gedit /usr/local/hadoop/hadoop-2.7.3/etc/hadoop/slaves
原有的 localhost 要删掉,改成这3个
master
salve1
salve2
其他
所有要创建的文件夹为:
sudo mkdir /usr/local/hadoop/hadoop-2.7.3/tmp
sudo mkdir /usr/local/hadoop/hadoop-2.7.3/tmp/dfs/name
sudo mkdir /usr/local/hadoop/hadoop-2.7.3/tmp/dfs/data
sudo mkdir /usr/local/hadoop/hadoop-2.7.3/logs
在后面修改权限后,均可以自动创建,故上面4条命令没有运行,这里写出来只是为了更加清楚地说明发生了什么。
第 5 步 复制所有文件到子节点
主要是 Java、Hadoop、/etc/profile
。
Java 和 Hadoop 在/usr/local/hadoop
。
修改权限
使用 chmod
命令,不是 chown
命令。
master主机
sudo chmod -R 777 /usr/local
sudo chmod 777 /etc/profile
在master主机登录slave1
ssh slave1
sudo chmod -R 777 /usr/local
sudo chmod 777 /etc/profile
exit
在master主机登录slave2
ssh slave2
sudo chmod -R 777 /usr/local
sudo chmod 777 /etc/profile
exit
说明:
- 777、755的权限等相关知识自行搜索 ;本文后面给出的参考资料会有部分涉及。
- 配置好
chmod
的权限后,不需要sudo
的命令,可以直接使用scp
远程复制。
从master主机复制到slave主机
master主机
scp -r /usr/local/hadoop slave1:/usr/local/
scp /etc/profile slave1:/etc/profile
scp -r /usr/local/hadoop slave2:/usr/local/
scp /etc/profile slave2:/etc/profile
master主机远程登录slave1
ssh slave1
source /etc/profile
# check
echo $PATH
exit
master主机远程登录slave2
ssh slave2
source /etc/profile
# check
echo $PATH
exit
前面的搞完之后,先不要着急后面的,建议重启一下。
最后的 /etc/profile
# Java Configuration
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}
# Hadoop Configuration
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH}
第 6 步 启动
hadoop@master:~$ hdfs namenode -format
hadoop@master:~$ start-all.sh
hadoop@master:~$ hdfs dfsadmin -report
hadoop@master:~$ jps
再登录到slave1、slave2主机,使用 jps
命令查看。
再在浏览器中输入 master:9000
查看。
这里直接用上面的命令是可以的,因为配置了环境变量。但是如果后续配置spark之类的,建议还是在对应的文件夹运行命令。见下(主要是针对 start-all.sh
和 stop-all.sh
这2个每次都会用到的命令;后面默认是在对应文件夹下运行,)。
hadoop@master:/usr/local/hadoop/hadoop-2.7.3$ ./sbin/start-all.sh
hadoop@master:/usr/local/hadoop/hadoop-2.7.3$ ./sbin/stop-all.sh
另外,建议使用 hdfs
,而不是如下的 hadoop
。
hadoop@master:~$ hadoop namenode -format
hadoop@master:~$ start-all.sh
hadoop@master:~$ hadoop dfsadmin -report
hadoop@master:~$ jps
其他启动选项
开启历史服务器
hadoop@master:/usr/local/hadoop/hadoop-2.7.3$ ./sbin/mr-jobhistory-daemon.sh start historyserver
hadoop@master:/usr/local/hadoop/hadoop-2.7.3$ ./sbin/mr-jobhistory-daemon.sh stop historyserver
这个当时找了好久,就是没看到历史记录。
参考的博客忘了记录。
可以再在master主机上运行一下 jps
,会发现多一个 JobHistoryServer
。
问题
本人碰到的问题:3个节点的 jps
命令都正常显示datanode;但是 hadoop dfsadmin -report
只显示localhost(只有一个live node);
解决:之前的 /etc/hadoop/slaves
忘了删localhost;修改后,删除 tmp
文件夹,再运行以下命令:
stop-all.sh
hdfs namenode -format
start-all.sh
hdfs dfsadmin -report
参考资料
参考资料 0
- Ubuntu22.04三台虚拟机Hadoop集群安装和搭建(全面详细的过程)_hadoop_WuRobb-开放原子开发者工作坊 (csdn.net)
- Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
- 2021年大数据Hadoop(六):全网最详细的Hadoop集群搭建-腾讯云开发者社区-腾讯云 (tencent.com)
参考资料 2
- ssh-copy-id三步实现SSH无密码登录和ssh常用命令_ssh copy-CSDN博客
- Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
- Ubuntu22.04三台虚拟机Hadoop集群安装和搭建(全面详细的过程)_hadoop_WuRobb-开放原子开发者工作坊 (csdn.net)
说明:
- 有些参考资料重复出现,在这里主要参考其 SSH 免密互连的部分。(建议多看看,不要着急敲命令;虽然搞砸了可以用快照恢复,但总归是有点麻烦的)
参考资料 3
说明:
- 参考其中的2个官方案例(该参考资料的3.1节)。
参考资料 4
- hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/core-default.xml
- 【Hadoop】集群配置之主要配置文件(hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml…)_hadoo配置文件官方文档-CSDN博客
- Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
- hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- hadoop.apache.org/docs/r2.7.3/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
- hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
参考资料 5
参考资料 6
- hadoop集群出现live nodes为1的解决方案_hadoop live nodes为1-CSDN博客
- hadoop2.6分布式部署时 livenodes等于1的原因-腾讯云开发者社区-腾讯云 (tencent.com) 感觉没啥用
- ubuntu datanode dfadmin -report live - 搜索 (bing.com)
其他
1、创建超级用户 root --> su: linux ubuntu 切换到超级用户失败的解决办法(su 认证失败)_linux 超级用户进入失败-CSDN博客
2、防火墙:sudo ufw status
3、其他资料(可能和上面有重复)
- Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
- Hadoop 入门教程(超详细)_hadoop教程-CSDN博客
- Ubuntu22.04三台虚拟机Hadoop集群安装和搭建(全面详细的过程)_hadoop_WuRobb-开放原子开发者工作坊 (csdn.net)
- (初学者强烈推荐)Ubuntu 配置hadoop 超详细教程(全过程)_ubuntu安装hadoop-CSDN博客
- hadoop搭建四个配置文件(core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml )的简单介绍-CSDN博客
- 【Hadoop】集群配置之主要配置文件(hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml…)_hadoo配置文件官方文档-CSDN博客
- 2021年大数据Hadoop(六):全网最详细的Hadoop集群搭建-腾讯云开发者社区-腾讯云 (tencent.com)
- Ubuntu下搭建Hadoop分布式集群_ubuntu安装hadoop集群-CSDN博客
4、关于 jps
:可以参考网上的 xcall
脚本,一次性查看3台主机的 jps
而不是每次都 ssh
到从主机后,再查看 jps
,即实现所有的工作基本都在 master
主机完成;同样,远程分发也可以参考网上的 xsync
脚本
5、需要自行搜索了解常用的 hdfs
命令,如
hdfs dfs -ls /
hdfs dfs -put /
hdfs dfs -get /
hdfs dfs -mkdir /
6、
Spark 等配置
比较简略,碰到了很多问题,就只是简单记录一下。
过程其实和上面的安装差不多。
配置(config)及分发(scp)
spark config
在 /usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/conf
目录下
都是 template ,需要另外复制一份出来使用
spark-env.sh
# Java Configuration
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
# Hadoop Configuration
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
# Scala Configuration
export SCALA_HOME=/usr/local/hadoop/scala-2.11.12
# Spark Configuration
export SPARK_HOME=/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7
export LD_LIBRARY_PATH=${HADOOP_HOME}/lib/native
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
YARN_CONF_DIR=/usr/local/hadoop/hadoop-2.7.3/etc/hadoop
spark-default.conf
# Example:
# spark.master spark://master:7077
# spark.eventLog.enabled true
# spark.eventLog.dir hdfs://namenode:8021/directory
# spark.serializer org.apache.spark.serializer.KryoSerializer
# spark.driver.memory 5g
# spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.executor.extraJavaOptions -Dlog4j.configuration=/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/conf/log4j.properties
spark.driver.extraJavaOptions -Dlog4j.configuration=/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/conf/log4j.properties
slaves
# A Spark Worker will be started on each of the machines listed below.
master
slave1
slave2
log4j.properties
# Set everything to be logged to the console
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=WARN
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
scp
master主机 安装 python 3.7.9 、sacla 2.11.12、spark 2.4.8,配置spark,并配置好 /etc/profile
,和 python/pip 的软链接(2台slave主机也需要) ;master主机复制3个包(和 /etc/profile
文件)到2个slave主机。
ln -s /usr/local/hadoop/python3.7/bin/python3.7 /usr/bin/python
sudo ln -s /usr/local/hadoop/python3.7/bin/pip3.7 /usr/bin/pip
分步分发
scp -r python3.7/ slave1:/usr/local/hadoop/
scp -r scala-2.11.12/ slave1:/usr/local/hadoop/
scp -r spark-2.4.8-bin-hadoop2.7/ slave1:/usr/local/hadoop/
scp -r python3.7/ slave2:/usr/local/hadoop/
scp -r scala-2.11.12/ slave2:/usr/local/hadoop/
scp -r spark-2.4.8-bin-hadoop2.7/ slave2:/usr/local/hadoop/
一步分发
hadoop@master:/usr/local/hadoop$ scp -r python3.7/ slave1:/usr/local/hadoop/; scp -r scala-2.11.12/ slave1:/usr/local/hadoop/; scp -r spark-2.4.8-bin-hadoop2.7/ slave1:/usr/local/hadoop/; scp -r python3.7/ slave2:/usr/local/hadoop/; scp -r scala-2.11.12/ slave2:/usr/local/hadoop/; scp -r spark-2.4.8-bin-hadoop2.7/ slave2:/usr/local/hadoop/
已经成功安装spark、scala、python3.7
并成功分发至slave1、slave2
并同时创建python的软链接
Spark测试
root@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7# ./bin/spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://master:4040
Spark context available as 'sc' (master = local[*], app id = local-1728730877026).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.8
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_172)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Scala测试
scala> val textFile = sc.textFile("file:///usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/README.md")
textFile: org.apache.spark.rdd.RDD[String] = file:///usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/README.md MapPartitionsRDD[1] at textFile at <console>:24
scala> text
text textFile
scala> textFile.co
coalesce collect collectAsync compute context copy count countApprox countApproxDistinct countAsync countByValue countByValueApprox
scala> textFile.count
count countApprox countApproxDistinct countAsync countByValue countByValueApprox
scala> textFile.count()
res0: Long = 104
最后的 /etc/profile
# Java Configuration
export JAVA_HOME=/usr/local/hadoop/jdk1.8.0_172
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}
# Hadoop Configuration
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH}
# Scala Configuration
export SCALA_HOME=/usr/local/hadoop/scala-2.11.12
export PATH=${SCALA_HOME}/bin:$PATH
# Spark Configuration
export SPARK_HOME=/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7
export PATH=${SPARK_HOME}/bin:${SPARK_HOME}/sbin:$PATH
# Python Configuration
# export PYSPARK_PYTHON=/usr/bin/python
export PYTHONPATH=/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7/python:/usr/bin/python:$PYTHONPATH
export PATH=$PATH:/usr/local/hadoop/python3.7/bin
spark安装碰到的问题
问题1
Spark中 java.net.ConnectException: 拒绝连接问题-CSDN博客
问题2
已解决java.net.ConnectException异常的正确解决方法,亲测有效!!!-CSDN博客
问题3
pyspark启动遇到的问题及解决方法_pyspark未找到命令-CSDN博客
解决pyspark运行报错:env: /usr/local/bin/python3: 没有那个文件或目录_怎么查看pyspark路径-CSDN博客
问题4
jupyter
- PySpark安装+Jupyter Notebook配置(Ubuntu 18.06)-阿里云开发者社区
- jupyter notebook + pyspark 环境搭建 - harrychinese - 博客园
- 使用Jupyter Notebook调试PySpark程序_厦大数据库实验室博客
- How to set up PySpark for your Jupyter notebook | Opensource.com
- coder2j/pyspark-tutorial:面向初学者的 PySpark 教程 - 使用 Spark 版本 3.4.1 的 Jupyter Notebook 中的实际示例。本教程涵盖各种主题,如 Spark 简介、Spark 安装、Spark RDD 转换和操作、Spark 数据帧、Spark SQL 等。它在 YouTube 上是完全免费的,并且对初学者友好,没有任何先决条件。
jupyter_notebook_config.py
小品一则
etils
要 python 3.10 以上
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$ pip install etils -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: etils in /usr/local/hadoop/python3.7/lib/python3.7/site-packages (0.9.0)
WARNING: You are using pip version 20.1.1; however, version 24.0 is available.
You should consider upgrading via the '/usr/local/hadoop/python3.7/bin/python3.7 -m pip install --upgrade pip' command.
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$ pip install etils==1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Could not find a version that satisfies the requirement etils==1.7.0 (from versions: 0.2.0, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.4.0, 0.5.0, 0.5.1, 0.6.0, 0.7.0, 0.7.1, 0.8.0, 0.9.0)
ERROR: No matching distribution found for etils==1.7.0
WARNING: You are using pip version 20.1.1; however, version 24.0 is available.
You should consider upgrading via the '/usr/local/hadoop/python3.7/bin/python3.7 -m pip install --upgrade pip' command.
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$ pip install https://github.com/google/etils/archive/refs/tags/v1.7.0.tar.gz
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting https://github.com/google/etils/archive/refs/tags/v1.7.0.tar.gz
Downloading https://github.com/google/etils/archive/refs/tags/v1.7.0.tar.gz
| 805 kB 369 kB/s
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing wheel metadata ... done
ERROR: Package 'etils' requires a different Python: 3.7.9 not in '>=3.10'
WARNING: You are using pip version 20.1.1; however, version 24.0 is available.
You should consider upgrading via the '/usr/local/hadoop/python3.7/bin/python3.7 -m pip install --upgrade pip' command.
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$ python -V
Python 3.7.9
hadoop@master:/usr/local/hadoop/spark-2.4.8-bin-hadoop2.7$
问题5
spark matter?
Q: 很多spark做的工作,本地的计算机也基本可以完成,那么spark等大数据技术有什么用?
A: Spark等大数据技术的主要优势在于处理大规模数据集的能力,尤其是当数据超出单台计算机的内存限制时。它们提供了分布式计算框架,可以在多个节点上并行处理数据,提高计算速度和效率。此外,Spark的内存计算能力使得重复查询和复杂分析变得更加高效,适用于实时数据处理和机器学习任务。你有没有具体的使用场景或数据规模?
https://spark.apache.ac.cn/docs/latest/configuration.html#inheriting-hadoop-cluster-configuration
- 点赞
- 收藏
- 关注作者
评论(0)