大数据分析与挖掘环境配置(Hadoop、Java、SSH免密互连)

举报
冬月初四 发表于 2024/12/04 17:50:34 2024/12/04
【摘要】 Windows下,大数据分析与挖掘环境配置(实现Hadoop、Java、SSH免密互连、Scala、Spark、Python3.7)

说明:很多网页超链接因为未知原因无法正常显示。可以复制关键字搜索,基本可以搜索到。

第 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

v2.7.3 archive package

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种思路:

  1. 使用 ssh-copy-id (参考后面的资料);
  2. 使用 scp 复制各自的公钥。

这里采用后一种。这也有2种方法。

  1. 3台主机各自发送公钥给另外2台,再各自将公钥加入各自的 authorized_keys
  2. 2台 slave 主机先将自己的公钥发送给 master 主机,master 主机 将3个公钥一起加入 authorized_keys ,再分发给2台 slave主机。

这里采用后一种方法。

slave 主机 发送公钥

使用 scp 来发送 RSA 公钥

use scp to send id_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.

验证方法

搭建过程最大的一个问题就是,不知道是否出问题了。这里只能给出一些可能的验证方法。

  1. master slave1 slave2 3台主机可以ssh互连
    • 即上述的 SSH 互连 3条命令都可以跑通
    • 如果是要加username(例如ssh hadoop@slave1)才能跑通,大概率有问题
  2. 互相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.hostshadoop.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.dirdfs.namenode.data.dir 是非常非常重要的配置。这里采用默认值,是因为之前的 core-site.xml 已经配置好了 hadoop.tmp.dir ,因此可以采用默认值。否则要自己在合适的位置配置文件夹。创建文件夹与上面的类似,等待后面的权限修改后自动创建。
  • dfs.hosts 这个参数本人没配(指定文件),但这个文件后续是要配置的。(感觉这个参数影响不大?没配也照样跑通了。。。)
    • 参考后面的slaves文件,感觉就是根据 $HADOOP_HOME 来设置的默认值。

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.shstop-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

  1. Ubuntu22.04三台虚拟机Hadoop集群安装和搭建(全面详细的过程)_hadoop_WuRobb-开放原子开发者工作坊 (csdn.net)
  2. Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
  3. 2021年大数据Hadoop(六):全网最详细的Hadoop集群搭建-腾讯云开发者社区-腾讯云 (tencent.com)

参考资料 2

  1. ssh-copy-id三步实现SSH无密码登录和ssh常用命令_ssh copy-CSDN博客
  2. Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
  3. Ubuntu22.04三台虚拟机Hadoop集群安装和搭建(全面详细的过程)_hadoop_WuRobb-开放原子开发者工作坊 (csdn.net)

说明:

  • 有些参考资料重复出现,在这里主要参考其 SSH 免密互连的部分。(建议多看看,不要着急敲命令;虽然搞砸了可以用快照恢复,但总归是有点麻烦的)

参考资料 3

  1. Hadoop 入门教程(超详细)_hadoop教程-CSDN博客

说明:

  • 参考其中的2个官方案例(该参考资料的3.1节)。

参考资料 4

  1. hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/core-default.xml
  2. 【Hadoop】集群配置之主要配置文件(hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml…)_hadoo配置文件官方文档-CSDN博客
  3. Hadoop 完全分布式搭建(超详细)_hadoop完全分布式搭建-CSDN博客
  4. hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
  5. hadoop.apache.org/docs/r2.7.3/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
  6. hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

参考资料 5

  1. linux使用scp命令,涉及权限赋予_sudo scp-CSDN博客
  2. Linux中chown和chmod的区别和用法(转) - EasonJim - 博客园 (cnblogs.com)

参考资料 6

  1. hadoop集群出现live nodes为1的解决方案_hadoop live nodes为1-CSDN博客
  2. hadoop2.6分布式部署时 livenodes等于1的原因-腾讯云开发者社区-腾讯云 (tencent.com) 感觉没啥用
  3. ubuntu datanode dfadmin -report live - 搜索 (bing.com)

其他

1、创建超级用户 root --> su: linux ubuntu 切换到超级用户失败的解决办法(su 认证失败)_linux 超级用户进入失败-CSDN博客

2、防火墙:sudo ufw status

3、其他资料(可能和上面有重复)

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

  1. PySpark安装+Jupyter Notebook配置(Ubuntu 18.06)-阿里云开发者社区
  2. jupyter notebook + pyspark 环境搭建 - harrychinese - 博客园
  3. 使用Jupyter Notebook调试PySpark程序_厦大数据库实验室博客
  4. How to set up PySpark for your Jupyter notebook | Opensource.com
  5. 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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。