大数据实验踩坑指南_No.1——Hadoop的安装配置

大数据实验踩坑指南_No.1——Hadoop的安装配置

前置准备

系统安装

先要安装好Ubuntu22.04

安装过程比较简单,下载镜像写入U盘,通过U盘启动镜像,根据提示安装即可

有一些比较重要的点写在下面

显卡驱动问题

NVIDIA显卡在安装的过程中可能会有显示不正常或者黑屏的问题,这是因为默认使用的是开源驱动Nouveau,只需要在引导界面grub上按e,然后在内核参数那一行加上nomodeset,禁用显卡驱动,安装过程就显示正常了

系统安装完成重启,同样加上nomodeset参数,然后安装好NVIDIA的显卡驱动重启就能正常了(如果在系统安装的时候选择了安装第三方软件,驱动应该也是装好的,装好后就不需要nomodeset参数了)

分区

安装过程中涉及到分区的操作,Linux中的分区与Windows不同,注意谨慎操作,以免造成数据丢失

我把300G的空闲分区分成两部分

  • 300MB的EFI分区(这是用于存放引导文件的分区,用于系统的启动)
  • 剩余部分分给了根分区(用于存储系统的文件)

当然也可以选择其他的分区方式

必要程序的安装

在这个案例中,所需要安装的apt包有以下这些,可以通过sudo apt-get install [包名]命令进行安装

  • ssh:网络传输协议
  • openjdk-8-jdk:Java开发环境
  • mysql-server:MySQL开源数据库
  • build-essential:基础编译工具集合
  • cmake:开源的跨平台自动化建构系统

还有一些可选的工具包

  • vim:上手难度大但是强大的编辑器
  • xclip:为vim提供一个访问系统剪贴板的接口(X11桌面协议)
  • wl-clipboard:为vim提供一个访问系统剪贴板的接口(Wayland桌面协议,需要将环境变量WAYLAND_DISPLAY设置为wayland-0`)
  • git:版本管理工具
  • curl:网络传输工具,在安装R等软件的时候会用到

SSH配置

大数据软件需要SSH登录,用于各个软件、各个节点之间的相互访问

安装好ssh软件后,通过以下命令启动ssh服务

1
sudo service ssh start

然后通过以下命令登录本机

1
ssh localhost

此时会有如下提示,输入yes。然后按照提示输入用户密码hadoop,即可登录到本机

输入密码时不会像一些软件一样显示***的样式,直接输入密码回车

1
2
3
4
5
6
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:6puIK4dNQMuwyyKW+AIJscyEMvCLPSfbAWGM36Bslc4.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
hadoop@localhost's password:

但是这样每次登录都需要输入密码,接下来配置无密码登录。首先输入exit退出ssh,回到原先的终端窗口,通过ssh-keygen生成密钥

1
ssh-keygen
1
2
3
4
5
6
7
8
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:dAclEXM4BgyYqGnpsRqRdUvVGmdbJBZU+Lhn7wi164o hadoop@jccc-MS-7D48
The key's randomart image is:

可以通过-t选项指定密钥类型,我这里不指定了,一路回车即可

通过ssh-copy-id命令将公钥安装到远程主机上,按照提示输入密码hadoop

1
ssh-copy-id localhost
1
2
3
4
5
6
7
8
9
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hadoop/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hadoop@localhost's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'localhost'"
and check to make sure that only the key(s) you wanted were added.

接下来尝试登录本机

1
ssh localhost

可以看到不需要密码就能登陆了

JDK

通过命令安装jdk

1
sudo apt-get install openjdk-8-jdk

查看/usr/lib/jvm目录的内容

1
ls /usr/lib/jvm

可以看到/usr/lib/jvm内有两个目录java-1.8.0-openjdk-amd64java-8-openjdk-amd64,其中java-1.8.0-openjdk-amd64java-8-openjdk-amd64链接,相当于一个快捷方式(说法不太准确,但是先这样理解)

然后用你熟悉的编辑器(比如vim、nano,其中nano用法比较简单,也可以使用gedit,gedit是ubuntu中的一个GUI的编辑器,类似Windows的记事本)来打开/home/hadoop/.bashrc文件

1
gedit /home/hadoop/.bashrc

在这个文件中添加以下内容(林子雨老师的教程中写的是在文件的开头添加,实际上配置的先后没有影响,除非前面的配置出现问题,导致配置文件加载失败,错误行以后的内容都不会进行加载)

/home/hadoop/.bashrc
1
2
3
4
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH # 通过apt安装的jdk好像不需要这一行,因为/usr/bin是被包含在PATH里的,而里面的java、javac等程序都是JAVA_HOME内程序的链接

Hadoop基础安装

到Hadoop官网[1]下载好hadoop-3.3.6.tar.gz

将Hadoop解压到/usr/local/目录下

1
2
3
4
sudo tar -zxvf /home/hadoop/Downloads/hadoop-3.3.6.tar.gz -C /usr/local/	# 如果系统语言为中文,则文件路径应当是/home/hadoop/下载/hadoop-3.3.6.tar.gz,或者你下载到其他目录,就改为对应的路径
cd /usr/local # 进入安装目录
sudo mv ./hadoop-3.3.6 hadoop # 将文件明改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 将目录以及目录内的所有子目录、文件的拥有者改为hadoop用户组的hadoop用户

编辑Hadoop的环境变量,找到文件对应的行进行修改,需要将#删掉,每一项的说明都可以在文件里查看

$HADOOP_HOME/etc/hadoop/hadoop-env.sh
1
2
3
4
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_PID_DIR=/usr/local/hadoop/pids

输入以下命令来检查Hadoop是否可用,成功则会显示版本信息

1
2
cd $HADOOP_HOME			    # 进入Hadoop的目录
./bin/hadoop version # 查看Hadoop版本

为了可以在任何目录下执行hadoop的命令,我们在.bashrc中配置环境变量

/home/hadoop/.bashrc
1
2
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

$表示用于引用变量的值,:用于分隔路径列表

配置完成后,通过以下命令加载配置

1
source /home/hadoop/.bashrc

执行以下命令,如果显示版本信息,则配置成功

1
hadoop version

伪分布式配置

Hadoop可以在单节点以一个伪分布式的模式机型运行。不同的Hadoop守护进程运行在不同的java进程中。

编辑以下文件:

$HADOOP_HOME/etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
$HADOOP_HOME/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

在林老师的文档中,还配置了dfs.namenode.name.dirdfs.datanode.data.dir

而这两个变量的默认值为

  • dfs.datanode.data.dir: file://${hadoop.tmp.dir}/dfs/data
  • dfs.namemode.name.dir: file://${hadoop.tmp.dir}/dfs/name

所以只需要设置好tmp目录即可,默认的tmp目录为/tmp,这个目录内的文件会在电脑重启以后被清除,因此将其配置在$HADOOP_HOME内

格式化hdfs文件系统

1
hdfs namenode -format

在倒数第十二行左右可以看到格式化成功的信息

1
2
3
4
5
6
7
8
9
10
11
2024-06-15 20:55:38,067 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.
2024-06-15 20:55:38,161 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
2024-06-15 20:55:38,279 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 401 bytes saved in 0 seconds .
2024-06-15 20:55:38,292 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2024-06-15 20:55:38,322 INFO namenode.FSNamesystem: Stopping services started for active state
2024-06-15 20:55:38,322 INFO namenode.FSNamesystem: Stopping services started for standby state
2024-06-15 20:55:38,324 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.
2024-06-15 20:55:38,325 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at jccc-MS-7D48/127.0.1.1
************************************************************/

启动NameNode守护进程和DataNode守护进程

1
start-dfs.sh

启动完成后,通过jps命令可以查看到相应的进程

1
2
3
4
43529 NameNode
44041 Jps
43692 DataNode
43901 SecondaryNameNode

这些进程的作用如下

  • NameNode:HDFS的主节点,负责管理文件系统的命名空间和元数据信息。
  • DataNode:HDFS的从节点,负责处理文件系统客户端的读写请求,在文件系统中实际存储数据。
  • SecondaryNameNode:主要作用是帮助NameNode合并编辑日志(edits log)和文件系统镜像(fsimage),以此来减少NameNode启动时间。
  • Jpsjps命令本身的进程,用于列出当前运行的Java进程。

运行Hadoop伪分布式实例

尝试运行Hadoop伪分布实例[2]

问题集锦

缺少Namenode

在集群启动后,输入jps查看进程发现缺少了Namenode[3]

原因:

  1. 启动Hadoop以后没有正常关闭就直接关机
  2. 频繁使用hadoop namenode -formatNamenode进行格式化
  3. NameNode格式化失败

解决方式:

  1. 停止Hadoop集群
    • stop-dfs.sh
  2. 查看核心文件core-site.xml里的临时文件夹配置
    • <value>/usr/local/hadoop/tmp</value>
  3. 删除tmp文件夹
    • rm -rf /usr/local/hadoop/tmp
  4. 重新对Namenode进行格式化

  1. Apache Hadoop ↩︎

  2. Hadoop3.3.5安装教程_单机/伪分布式配置_Hadoop3.3.5/Ubuntu22.04(20.04/18.04/16.04) ↩︎

  3. Hadoop集群启动后jps缺少namenode ↩︎