# virualbox-hadoop-spark
**Repository Path**: andyxiaopeng/virualbox-hadoop-spark
## Basic Information
- **Project Name**: virualbox-hadoop-spark
- **Description**: virualbox-hadoop-spark 的集群部署
- **Primary Language**: Shell
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-12-01
- **Last Updated**: 2024-04-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 大数据本地虚拟机集群环境搭建
> 大部分内容基于厦门大学的林子雨老师及其厦门大学大数据平台提供的资料作为参考和学习,特此感谢!
>
> [厦门大学数据库实验室 | 数据驱动生活 (xmu.edu.cn)](http://dblab.xmu.edu.cn/)
## 基础环境
> Spark是分布式的计算框架需要和许多大数据组件结合使用
>
> 
>
> 存储:hadoop
>
> 系统:linux
>
> 编译运行:jdk(spark程序最终编译是编译为java的字节码运行的,因此需要jdk支持,**jdk1.8以上**)
## 准备好ubuntu容器(18.04)
### 1、从hubdaocloud下载镜像

### 2、启动镜像

### 3、 进入ubuntu容器(坑)

## 转战Virtualbox
### 下载ubuntu镜像
> 推荐国产改的ubuntu优麒麟
>
> 自定国内阿里源
### 安装

### 开始配置
> 如果ubuntu窗口很小请安装virtualbox的增强功能
>
> 
>
> 自动安装后选择重启即可
#### 创建hadoop用户
```shell
# 1、 创建hadoop用户
sudo useradd -m hadoop -s /bin/bash
# 2、 设置hadoop用户的密码
sudo passwd hadoop
# 3、 为了hadoop用户添加权限
sudo adduser hadoop sudo
```

#### 更新apt(先转换为hadoop账户登录)
> 快点更新apt也是为了能快点下载ssh来试用ssh连接,更高效的试用ubunt
```shell
# 1、 更新apt
sudo apt-get update
# 2、 下载vim
sudo apt-get install vim
# 3、 下载ssh的服务
sudo apt-get install openssh-server
```
#### 安装SSH、配置SSH无密码登陆
> 集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server
```shell
# 1、 下载ssh的服务
sudo apt-get install openssh-server
```

```shell
# 1、 尝试登陆本机
ssh localhost
# ps: 此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了
```

#### 配置无密码shh
```shell
exit # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授权
```

#### ps使用ssh等工具登登陆ubunt来更方便操作
> 为了更方便上传文件到ubutu中,所以需要这类工具

#### 安装Java环境
> 从*林子雨* 百度连接中获取jdk(最好不要自己下载,环境会乱)
>
> [可以点击这里到百度云盘下载JDK1.8安装包 (baidu.com)](https://pan.baidu.com/s/1gbmPBXrJDCxwqPGkfvX5Xg)
>
> jdk从本机上传或者直接在虚拟机中下载
>
> 然后移动到“/home/linziyu/Downloads/”目录下

```shell
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
```

> 检查一下解压情况
```shell
cd /usr/lib/jvm
ls
```

> 成功后继续执行以下命令
```shell
cd ~
vim ~/.bashrc
```
> 开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
>
>
>
> ```yml
> export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
> export JRE_HOME=${JAVA_HOME}/jre
> export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
> export PATH=${JAVA_HOME}/bin:$PATH
> ```
```shell
# 刷新环境变量
source ~/.bashrc
```
> 测试
>
> ```shell
> java -version
> ```
>
> 
### 安装 hadoop-3.2.0
> Hadoop安装文件,可以到[Hadoop官网](https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz)下载hadoop-3.2.0.tar.gz。
> 也可以直接[点击这里从百度云盘下载软件](https://pan.baidu.com/s/1gbmPBXrJDCxwqPGkfvX5Xg)(提取码:lnwl),进入百度网盘后,进入“软件”目录,找到hadoop-3.2.0.tar.gz文件,下载到本地。
> 我们选择将 Hadoop 安装至 /usr/local/ 中:
```shell
sudo tar -zxf ~/下载/hadoop-3.2.0.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.2.0/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
```

> 测试
>
> ```shell
> cd /usr/local/hadoop
> ./bin/hadoop version
> ```
>
> 
#### Hadoop伪分布式配置
> 简介:
>
> Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
>
> Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 **core-site.xml** 和 **hdfs-site.xml** 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
>
> 修改配置文件 **core-site.xml** (通过 gedit 编辑会比较方便: `gedit ./etc/hadoop/core-site.xml`),将当中的
```xml
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://localhost:9000
```
同样的,修改配置文件 **hdfs-site.xml**:
```xml
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
```
```shell
cd /usr/local/hadoop
./bin/hdfs namenode -format
```
```shell
# 接着开启 NameNode 和 DataNode 守护进程。
cd /usr/local/hadoop
./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格
```
> 启动完成后,可以通过命令 `jps` 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
>
> 
#### 复制虚拟机
> 先关机后使用virtualbox来复制就好了


然后一路next即可获得一台从机,因为本人电脑配置不够,只是用两台机器来搭建集群,如果条件允许,尽量使用3台或者以上(尽量为奇数)

### Hadoop集群安装
#### 网络配置
> 在virtualbox中对虚拟机使用桥接的模式来实现多节点互通
>
> 获取机器的ip地址备用

#### 修改主机名
```shell
sudo vim /etc/hostname
```
> 主机改为Master
>
> 从机改为Slave01、Slave02、Slave03 .。。。。。。
#### 增加hosts记录
```shell
sudo vim /etc/hosts
```
```
192.168.1.121 Master
192.168.1.122 Slave1
```

#### SSH无密码登录节点
```shell
# 1、
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost
rm ./id_rsa* # 删除之前生成的公匙(如果已经存在)
ssh-keygen -t rsa # 执行该命令后,遇到提示信息,一直按回车就可以
# 2、让Master节点能够无密码SSH登录本机
cat ./id_rsa.pub >> ./authorized_keys
# 3、Master节点将上公匙传输到Slave01节点
scp ~/.ssh/id_rsa.pub hadoop@Slave01:/home/hadoop/
```
```shell
# 接着在Slave1节点上,将SSH公匙加入授权
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在,则忽略本命令
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完以后就可以删掉
```
#### 配置PATH变量
> 首先执行命令“vim ~/.bashrc”,也就是使用vim编辑器打开“~/.bashrc”文件,然后,在该文件最上面的位置加入下面一行内容
```xml
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
```
> 保存后执行命令“source ~/.bashrc”,使配置生效。
#### 配置集群/分布式环境
> 在配置集群/分布式模式时,需要修改“/usr/local/hadoop/etc/hadoop”目录下的配置文件,这里仅设置正常启动所必须的设置项,包括workers 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5个文件,更多设置项可查看官方说明。
> (1)修改workers
>
> 需要把所有数据节点的主机名写入该文件,每行一个,默认为 localhost(即把本机作为数据节点),所以,在伪分布式配置时,就采用了这种默认的配置,使得节点既作为名称节点也作为数据节点。在进行分布式配置时,可以保留localhost,让Master节点同时充当名称节点和数据节点,或者也可以删掉localhost这行,让Master节点仅作为名称节点使用。
> 本教程让Master节点仅作为名称节点使用,因此将workers文件中原来的localhost删除,只添加如下一行内容:
```
Slave1
```

> (2)修改文件core-site.xml
>
> 请把core-site.xml文件修改为如下内容:
```
fs.defaultFS
hdfs://Master:9000
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
```
各个配置项的含义可以参考前面伪分布式模式时的介绍,这里不再赘述。
> (3)修改文件hdfs-site.xml
>
> 对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。但是,本教程只有一个Slave节点作为数据节点,即集群中只有一个数据节点,数据只能保存一份,所以 ,dfs.replication的值还是设置为 1。hdfs-site.xml具体内容如下:
```
dfs.namenode.secondary.http-address
Master:50090
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
```
> (4)修改文件mapred-site.xml
>
> “/usr/local/hadoop/etc/hadoop”目录下有一个mapred-site.xml.template,需要修改文件名称,把它重命名为mapred-site.xml,然后,把mapred-site.xml文件配置成如下内容:
```
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
Master:10020
mapreduce.jobhistory.webapp.address
Master:19888
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=/usr/local/hadoop
mapreduce.map.env
HADOOP_MAPRED_HOME=/usr/local/hadoop
mapreduce.reduce.env
HADOOP_MAPRED_HOME=/usr/local/hadoop
```
> (5)修改文件 yarn-site.xml
>
> 请把yarn-site.xml文件配置成如下内容:
```
yarn.resourcemanager.hostname
Master
yarn.nodemanager.aux-services
mapreduce_shuffle
```
#### 分发
```shell
# 需要首先在Master节点上执行如下命令:
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz Slave01:/home/hadoop
```
```shell
# 然后在Slave1节点上执行如下命令:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
```
#### 调试
```shell
# 首次启动Hadoop集群时,需要先在Master节点执行名称节点的格式化(只需要执行这一次,后面再启动Hadoop时,不要再次格式化名称节点),命令如下:
hdfs namenode -format
```
```shell
# 启动Hadoop了,启动需要在Master节点上进行,执行如下命令:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
```
> 可以在Linux系统的浏览器中输入地址“http://master:9870/”,通过 Web 页面看到查看名称节点和数据节点的状态。如果不成功,可以通过启动日志排查原因
>
> 
### Spaark 集群安装
> 前提:Hadoop集群安装完成
```shell
# 下载完成spark(或者本地上传)后操作
sudo tar -zxf ~/下载/spark-3.0.1-bin-without-hadoop.tgz -C /usr/local/
cd /usr/local
sudo mv ./spark-3.0.1-bin-without-hadoop/ ./spark
sudo chown -R hadoop ./spark
```
#### 配置环境变量
```shell
# Mster节点主机的终端中执行如下命令:
vim ~/.bashrc
```
```xml
# 在.bashrc添加如下配置:
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
```
```shell
# 更新配置:
source ~/.bashrc
```
#### Spark配置
> 在Master节点主机上进行如下操作:
>
> 配置slaves文件
> 将 slaves.template 拷贝到 slaves
```shell
cd /usr/local/spark/cp ./conf/slaves.template ./conf/slaves
```
slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成如下内容:
```
Slave01
```
- 配置spark-env.sh文件
将 spark-env.sh.template 拷贝到 spark-env.sh
```bash
cp ./conf/spark-env.sh.template ./conf/spark-env.sh
```
```shell
# 编辑spark-env.sh,添加如下内容:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_IP=192.168.1.104
# SPARK_MASTER_IP 指定 Spark 集群 Master 节点的 IP 地址;
```
```bash
# 配置好后,将Master主机上的/usr/local/spark文件夹复制到各个节点上。在Master主机上执行如下命令:
cd /usr/local/
tar -zcf ~/spark.master.tar.gz ./spark
cd ~
scp ./spark.master.tar.gz Slave01:/home/hadoop
```
在Slave01节点上执行下面同样的操作:
```bash
sudo rm -rf /usr/local/spark/
sudo tar -zxf ~/spark.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/spark
```
#### 启动Spark集群
> 启动Spark集群前,要先启动Hadoop集群。
```shell
# 在Master节点主机上运行如下命令:
cd /usr/local/hadoop/
sbin/start-all.sh
```
```shell
# 启动Master节点
# 在Master节点主机上运行如下命令:
cd /usr/local/spark/
sbin/start-master.sh
# 启动所有Slave节点
# 在Master节点主机上运行如下命令:
sbin/start-slaves.sh
```
> 在浏览器上查看Spark独立集群管理器的集群信息
> 在master主机上打开浏览器,访问[http://master:8080](http://master:8080/),如下图:
>
> 
#### 关闭Spark集群
```bash
# 关闭Master节点
sbin/stop-master.sh
# 关闭Worker节点
sbin/stop-slaves.sh
# 关闭Hadoop集群
cd /usr/local/hadoop/
sbin/stop-all.sh
```