Hadoop伪分布式安装配置

大数据 / 2021-08-17

本文大部分内容参考自厦门大学--数据库实验室技术博客--大数据软件安装和基础编程实践指南(2020年6月版),原文链接:http://dblab.xmu.edu.cn/blog/2630-2/

hive解决ssl提示部分参考自:CSDN--鞋带散了的木木,原文链接:https://blog.csdn.net/u012922838/article/details/73291524

感谢厦门大学数据库实验室的奉献与网友鞋带散了的木木的博客!本教程使用 Ubuntu 21.04 64位!

一、Hadoop单机/伪分布式部署

本文以单机部署为例,集群部署可查看厦门大学专门的集群部署博客!

1.1、创建用户并授权

创建Hadoop用户并授予sudo权限

1.1.1、创建Hadoop用户
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
# 根据提示输入新密码
1.1.2、授予sudo权限
sudo adduser hadoop sudo
sudo su - hadoop

1.2、apt换源

建议更换apt源为国内源,比如清华大学、中国科技大学、163等等!

编辑 /etc/apt/sources.list 文件(需要使用 sudo)

# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

更改完毕后,更新索引库

sudo apt update
sudo apt install -y vim  # 如已安装,则忽略即可。

1.3、SSH无密码登录

sudo apt install openssh-server
cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost,然后按照提示操作。
ssh-keygen -t rsa              # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys  # 加入授权

此时再次使用ssh localhost即可无需密码也能登录。

1.4、Java环境安装

1.4.1、下载解压

请自行寻找==JDK1.8==的安装包jdk-8u162-linux-x64.tar.gz并上传到服务器

cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm  #把JDK文件解压到/usr/lib/jvm目录下
1.4.2、配置Java环境变量

编辑用户环境变量配置文件

vim ~/.bashrc

添加如下配置

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

保存退出,执行命令使配置生效:

source ~/.bashrc
1.4.3、验证安装

执行命令

java -version

如果有返回以下信息,即代表Java环境安装成功:

java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

1.5、Hadoop安装

本文以Hadoop 2.10.1为例,Hadoop 2.10.1 清华大学镜像站下载地址

1.5.1、下载解压
sudo tar -zxf ~/hadoop-2.10.1.tar.gz -C /usr/local/  # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.10.1/ ./hadoop/  # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop/  # 修改文件权限
1.5.2、验证版本

执行命令

cd /usr/local/hadoop
./bin/hadoop version

看到返回以下信息即表示成功

Hadoop 2.10.1
Subversion https://github.com/apache/hadoop -r 1827467c9a56f133025f28557bfc2c562d78e816
Compiled by centos on 2020-09-14T13:17Z
Compiled with protoc 2.5.0
From source with checksum 3114edef868f1f3824e7d0f68be03650
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.10.1.jar
1.5.3、伪分布式部署

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xmlhdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改配置文件 core-site.xml,根据自己实际需求来配置localhost或者私网IP地址。

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/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,根据自己实际需求来配置localhost或者私网IP地址。

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>
1.5.4、NameNode格式化

执行以下命令进行格式化,成功后会输出大量信息。

cd /usr/local/hadoop
./bin/hdfs namenode -format

如果JAVA_HOME环境变量已经配置成功,但还是报错Error: JAVA_HOME is not set and could not be found. 需要修改配置文件/usr/local/hadoop/etc/hadoop/hadoop-env.sh,将里面的export JAVA_HOME=${JAVA_HOME}更改为Java安装的绝对路径。

如下所示:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_202
1.5.5、启动守护进程

开启NameNodeDataNode守护进程

cd /usr/local/hadoop
./sbin/start-dfs.sh  #start-dfs.sh是个完整的可执行文件,中间没有空格
1.5.6、验证

Hadoop可以使用sbin目录下的脚本来统一启动/停止

hadoop@seafile:/usr/local/hadoop$ jps
241732 Jps
9289 DataNode
10043 ResourceManager
9899 SecondaryNameNode
9564 NameNode
10204 NodeManager

1.6、运行伪分布式实例

来自厦门大学数据库实验室的温馨提醒

教材《大数据技术原理与应用》的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。

  1. hadoop fs,适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统。
  2. hadoop dfs,只能适用于HDFS文件系统。
  3. hdfs dfs,跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
1.6.1、创建目录

要使用 HDFS,首先需要在 HDFS 中创建用户目录:

./bin/hdfs dfs -mkdir -p /user/hadoop
1.6.2、复制文件

接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。

./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
./bin/hdfs dfs -ls input

输出结果如下:

Found 8 items
-rw-r--r--   1 hadoop supergroup       8814 2021-08-17 06:21 input/capacity-scheduler.xml
-rw-r--r--   1 hadoop supergroup       1080 2021-08-17 06:21 input/core-site.xml
-rw-r--r--   1 hadoop supergroup      10206 2021-08-17 06:21 input/hadoop-policy.xml
-rw-r--r--   1 hadoop supergroup       1133 2021-08-17 06:21 input/hdfs-site.xml
-rw-r--r--   1 hadoop supergroup        620 2021-08-17 06:21 input/httpfs-site.xml
-rw-r--r--   1 hadoop supergroup       3518 2021-08-17 06:21 input/kms-acls.xml
-rw-r--r--   1 hadoop supergroup       5939 2021-08-17 06:21 input/kms-site.xml
-rw-r--r--   1 hadoop supergroup       1384 2021-08-17 06:21 input/yarn-site.xml

二、Spark单机部署

2.1、下载解压

spark1.6.3为例:spark1.6.3官网下载地址

sudo tar -zxf spark-1.6.3-bin-without-hadoop.tgz -C /usr/local/
sudo mv /usr/local/spark-1.6.3-bin-without-hadoop /usr/local/spark

2.2、修改配置

修改Spark的配置文件spark-env.sh

cd /usr/local/spark/
sudo cp ./conf/spark-env.sh.template ./conf/spark-env.sh
vim ./conf/spark-env.sh

编辑spark-env.sh文件,在第一行#!/usr/bin/env bash下面添加以下配置信息:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

2.3、验证安装

验证Spark是否安装成功,因为输出信息较多,可以过滤一下。

bin/run-example SparkPi 2>&1 | grep "Pi is"
Pi is roughly 3.1412357061785308

三、Hive安装

安装hive前,需要先安装好Hadoop。

3.1、下载解压hive

hive安装包:hive1.2.2清华大学镜像站下载地址

sudo tar -zxf apache-hive-1.2.2-bin.tar.gz -C /usr/local/
cd /usr/local/
sudo mv apache-hive-1.2.2-bin/ hive
sudo chown -R hadoop:hadoop hive/

3.2、修改环境变量

vim ~/.bashrc

末尾处添加如下几行

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export HADOOP_HOME=/usr/local/hadoop

使环境变量生效

source ~/.bashrc

3.3、修改配置

hive-default.xml.template重命名为hive-default.xml

cd /usr/local/hive/conf
mv hive-default.xml.template hive-default.xml

使用编辑器在/usr/local/hive/conf下新建一个hive-site.xml,命令如下:

vim /usr/local/hive/conf/hive-site.xml

注意:hive安全系数较高,如果没有启用SSL连接,启动时会一直报错;需要使用提示里的useSSL=false

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

解决办法有两种:

  1. 关闭SSL验证,也就是配置useSSL=false
  2. 配置SSL验证并提供信任库,这个稍微麻烦些。

本文用的是关闭SSL验证,如果有问题,那就解决发现问题的人🤪

添加配置:

注意:在xml文件中&amp;才表示&,然后再加上useSSL=false

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
</configuration>

3.4、MySQL安装配置

这里我们采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。

本文以最新版的MySQL 8.0.26为例,MySQL Connector官网下载

3.4.1、安装MySQL与connector

注意,MySQL版本和Connector版本==必须保持一致==,否则报错。

sudo apt install -y mysql-server
sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu21.04_all.deb
3.4.2、连接MySQL
# sudo systemctl start mysql  # Ubuntu安装完后自动启动
sudo systemctl enable mysql
sudo mysql
3.4.3、创建数据库
mysql> CREATE DATABASE hive;
3.4.4、授权

注意,MySQL 8.0以后不能直接创建用户并授权,需要分步骤进行,先创建用户再授权。

mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

3.5、启动hive

#start-dfs.sh # 启动Hadoop的HDFS,已启动可以忽略
hive  # 启动hive,前提是前面已经配置好环境变量。

四、故障处理

4.1、无法启动hive

4.1.1、报错信息

报错如下,说是公钥不被允许。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed
4.1.2、处理方法

hive-site.xml配置启用公钥allowPublicKeyRetrieval=true即可

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;allowPublicKeyRetrieval=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>
世间微尘里 独爱茶酒中