Hadoop

2024-02-27  本文已影响0人  KS保

一、Hadoop介绍

1、Apache软件基金会的一款开源软件。用Java实现、开源。

2、核心组件

①Hadoop HDFS(分布式文件存储系统):解决海量数据存储

②Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度

③Hadoop MapReduce(分布式计算框架):解决海量数据计算

课程

3、shell脚本一键启停

①HDFS集群:start-dfs.sh、stop-dfs.sh

②YARN集群:start-yarn.sh、stop-yarn.sh

③Hadoop集群(HDFS+YARN):start-all.sh、stop-all.sh

脚本一键启动的前提:配置好机器之间的SSH免密登录和workers文件

4、分布式文件存储系统

①分布式存储的优点:无限扩展支撑海量数据

②元数据记录的功能:快速定位文件位置便于查找

③文件分块存储的好处:针对块并行操作提高效率

④设置副本备份的作用:冗余存储保障数据安全

二、Hadoop集群搭建

准备好三台机器 node1、node2、node3

Hadoop集群整体概述

①Hadoop集群包括两个集群:

②两个集群逻辑上分离、通常物理上在一起

③两个集群都是标准的主从架构集群

1、集群角色规划

注意:资源上有抢夺冲突的,尽量不要部署在一起;工作上需要互相配合的,尽量部署在一起。

服务器 运行角色
node1 namenode/datanode/resourcemanager/nodemanager
node2 secondarynamenode/datanode/nodemanager
node3 datanode/nodemanager

2、服务器基础环境准备

①主机名(3台机器)

[root@node1 server]# vim /etc/hostname
[root@node1 server]# hostname
node1.kyrie.cn

②Hosts映射(3台机器)

[root@node1 server]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.137.128 node1 node1.kyrie.cn
192.168.137.129 node2 node2.kyrie.cn
192.168.137.130 node3 node3.kyrie.cn

③防火墙关闭(3台机器)

[root@node1 server]# systemctl stop firewalld.service  # 关闭防火墙
[root@node1 server]# systemctl disable firewalld.service   # 禁止防火墙开启自启动

④ssh免密登录(node1执行->node1|node2|node3)

[root@node1 server]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):回车 
Enter passphrase (empty for no passphrase): 回车
Enter same passphrase again: 回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:回车
SHA256:5TM0waxZM1fF20Mpsk/BOShD0fqP8ySLPxGSHPYcZxg root@node1.kyrie.cn
The key's randomart image is:
+---[RSA 2048]----+
|        .=+E=.ooo|
|         =*B.O o.|
|        o+%+* = o|
|        oO * . o.|
|        S * +   .|
|           = .   |
|           .+.   |
|          .++.   |
|         ..o+.   |
+----[SHA256]-----+
[root@node1 server]# 
[root@node1 server]# ssh-copy-id node1
[root@node1 server]# ssh-copy-id node2
[root@node1 server]# ssh-copy-id node3

⑤集群时间同步(3台机器)

[root@node1 server]# yum -y install ntpdate
[root@node1 server]# ntpdate ntp4.aliyun.com

3、集群搭建

①创建统一工作目录(3台机器)

[root@node1 server]# mkdir -p /export/server/   # 软件安装路径
[root@node1 server]# mkdir -p /export/data/  # 数据存储路径
[root@node1 server]# mkdir -p /export/software/  # 安装包存放路径

②上传安装包、解压安装包

JDK和Hadoop包的下载路径:链接

[root@node1 export]# cd /export/server/  # 将安装包存放在该路径下
[root@node1 server]# ls
jdk-8u65-linux-x64.t.gz
[root@node1 server]# tar -zxvf ./jdk-8u65-linux-x64.t.gz 
[root@node1 server]# vim /etc/profile  # 配置环境变量
unset i
unset -f pathmunge
# 在文件最后加入下面两条记录
export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
[root@node1 server]# source /etc/profile  # 重新加载环境变量文件
[root@node1 server]# java- version  # 验证java是否安装成功
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
[root@node1 server]# 
[root@node1 export]# cd /export/server/
[root@node1 server]# ls
hadoop-3.1.3.tar.gz  jdk1.8.0_65  jdk-8u65-linux-x64.t.gz
[root@node1 server]# tar -zxvf ./hadoop-3.1.3.tar.gz
[root@node1 server]# mv ./hadoop-3.1.3 ./hadoop

所有的配置文件均在 /export/server/hadoop/etc/hadoop/ 目录下

hadoop-env.sh

# 文件最后添加
export JAVA_HOME=/export/server/jdk1.8.0_65  # java安装路径

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

core-site.xml 核心模块配置

<configuration>
<property>
 <name>fs.defaultFS</name>
 <value>hdfs://node1:8020</value>
</property>
<property>
 <name>io.file.buffer.size</name>
 <value>131072</value>
</property>
<!-- 设置hadoop本地保存数据路径 -->
<property>
 <name>hadoop.tmp.dir</name>
 <value>/export/data/hadoop</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
 <name>hadoop.http.staticuser.user</name>
 <value>root</value>
</property>
<!-- 整合hive用户代理设置 -->
<property>
 <name>hadoop.proxyuser.root.hosts</name>
 <value>*</value>
</property>
<property>
 <name>hadoop.proxyuser.root.groups</name>
 <value>*</value>
</property>
<!-- 文件系统垃圾桶保存时间 -->
<property>
 <name>fs.trash.interval</name>
 <value>1440</value>
</property>
</configuration>

hdfs-site.xml hdfs文件系统模块配置

<configuration>
<!-- NameNode 存放的位置 -->  
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///export/data/hadoop/dfs/name</value>
</property>  
<!-- DataNode 存放的位置 -->
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///export/data/hadoop/dfs/data</value>
</property>
<property>
          <name>dfs.namenode.secondary.http-address</name>
          <value>node2:9868</value>
 </property>
</configuration>

mapred-site.xml MapReduce模块配置

<configuration>
<!-- 设置MR程序默认运行模式:yarn集群模式 local本地模式 -->
<property>
               <name>mapreduce.framework.name</name>
               <value>yarn</value>
</property>
<!-- MR程序历史服务地址 -->
<property>
               <name>mapreduce.jobhistory.address</name>
               <value>node1:10020</value>
</property>
<!-- MR程序历史服务器web端地址 -->
<property>
               <name>mapreduce.jobhistory.webapp.address</name>
               <value>node1:19888</value>
</property>
<property>
               <name>yarn.app.mapreduce.am.env</name>
               <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
               <name>mapreduce.map.env</name>
               <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
               <name>mapreduce.reduce.env</name>
               <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>

yarn-site.xml yarn模块配置

<configuration>
<!-- 设置YARN集群主角色运行机器位置-->
<property>
               <name>yarn.resourcemanager.hostname</name>
               <value>node1</value>
</property>
<property>
               <name>yarn.nodemanager.aux-services</name>
               <value>mapreduce_shuffle</value>
</property>
<!-- 是否将对容器实施物理内存限制-->
<property>
               <name>yarn.nodemanager.pmem-check-enabled</name>
               <value>false</value>
</property>
<!-- 是否将对容器实施虚拟内存限制-->
<property>
               <name>yarn.nodemanager.vmem-check-enabled</name>
               <value>false</value>
</property>
<!-- 开启日志聚集-->
<property>
               <name>yarn.log-aggregation-enable</name>
               <value>true</value>
</property>
<!-- 设置yarn历史服务器地址-->
<property>
               <name>yarn.log.server.url</name>
               <value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 历史日志保存的时间 7天-->
<property>
               <name>yarn.log-aggregation.retain-seconds</name>
               <value>604800</value>
</property>
</configuration>

workers

[root@node1 hadoop]# cat workers 
node1.kyrie.cn
node2.kyrie.cn
node3.kyrie.cn
[root@node1 server]# cd /export/server/
[root@node1 server]# scp -r ./hadoop root@node2:$PWD
[root@node1 server]# scp -r ./hadoop root@node3:$PWD
[root@node1 server]# vim /etc/profile  # 配置环境变量
unset i
unset -f pathmunge
export JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
# 在文件最后加入下面两条记录
export HADOOP_HOME=/export/server/hadoop
export PATH=.:$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
[root@node1 server]# source /etc/profile  # 重新加载环境变量文件

③NameNode format(格式化操作)

④Hadoop集群一键启停

可以在node1上使用软件自带的shell脚本一键启停。前提:配置好机器之间的SSH免密登录和works文件。

⑤进程状态、日志查看

--------  node1服务器  --------
[root@node1 logs]# jps
90582 Jps
90217 NodeManager
89480 NameNode
90072 ResourceManager
89658 DataNode

--------  node2服务器  --------
[root@node2 hadoop]# jps
74917 SecondaryNameNode
75140 Jps
2793 DataNode
75006 NodeManager

--------  node3服务器  --------
[root@node3 hadoop]# jps
71778 Jps
71627 NodeManager
71517 DataNode

Yarn的WEB UI 接口 8088 http://node1:8088

HDFS WEB UI端口 9870 http://node1:9870

三、HDFS

1、简介

HDFS(Hadoop Distributed File System),意为Hadoop分布式文件系统,是Hadoop的组件之一

2、特性

①主从架构

一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成;Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

②分块存储

HDFS中的文件在物理上是分块(block)存储的,默认大小是128M,不足128M则本身就是一块;块的大小可以通过参数dfs.blocksize来设置。

③副本机制

文件的所有block都会有副本,副本系数可以在文件创建的时候指定,也可以在之后通过命令改变;副本数由参数dfs.replication控制,默认值是3。

④元数据记录

在HDFS中,Namenode管理元数据,具有两种类型

⑤抽象统一的目录树结构(namespace)

HDFS支持传统的层次型文件组长结构。

3、HDFS集群角色

①主角色 namenode

②从角色 datanode

③主角色辅助角色 secondarynamenode

4、HDFS集群职责

①namenode职责

②datanode职责

5、shell命名行

①创建文件夹

hadoop fs -mkdir [-p] <path>

②查看指定目录下的内容

hadoop fs -ls [-h] [-R] <path>

③上传文件到HDFS指定目录下

hadoop fs -put [-f] [-p] <localsrc> <dst>

eg:hadoop fs -put file:///etc/profile hdfs://node1:8020/kyrie

④查看HDFS文件内容

hadoop fs -cat <src>

⑤下载HDFS文件

hadoop fs -get [-f] [-p] <src> <localdst>

⑥拷贝HDFS文件

hadoop fs -cp [-f] <src> <dst>

⑦追加数据到HDFS文件中

hadoop fs -appendToFile <localsrc> <dst>

⑧HDFS数据移动操作

hadoop fs -mv <src> <dst>

四、MapReduce

1、介绍

一个MapReduce编程模型中只能包含一个Map阶段合一个Reduce阶段,或者只有Map阶段。

整个MapReduce程序中,数据都是以kv键值对形式流转的。

①MapReduce的思想核心是“先分后合,分而治之”。

②MapReduce局限性

③MapRedece实例进程

一个完整的MapReduce程序在分布式运行时有三类

2、Map阶段

3、Reduce阶段

4、Shuffle机制

一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。shuffle是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。

①Map端的Shuffle

②Reduce端shuffle

③shuffle机制弊端

五、YARN

1、简介

2、YARN3大组件

接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。

根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。

应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。

3、YARN交互流程

4、YARN资源调度器Scheduler

在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。

三种调度器

六、Hive安装部署

1、安装

①安装前准备

②Hadoop和Hive整合

<!-- 整合hive -->
<property>
 <name>hadoop.proxyuser.root.hosts</name>
 <value>*</value>
</property>
<property>
 <name>hadoop.proxyuser.root.groups</name>
 <value>*</value>
</property>

③安装MySQL

仅在node1安装即可, 安装链接

[root@node1 home]# rpm -qa | grep mysql
[root@node1 home]# rpm -e xxx
[root@node1 home]# mkdir /export/software/mysql
[root@node1 home]# cd /export/software/mysql
[root@node1 home]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
[root@node1 home]# yum -y install mysql57-community-release-el7-10.noarch.rpm
[root@node1 home]# yum -y install mysql-community-server
[root@node1 home]# systemctl start mysqld.service
[root@node1 home]# cat /var/log/mysqld.log | grep 'password'  # 查看初始密码
[root@node1 mysql]# mysql -u root -p
Enter password: 输入初始密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@123';  # 修改密码

mysql> exit
[root@node1 mysql]# systemctl enable mysqld  # 设置开机自启动
[root@node1 mysql]# systemctl list-unit-files | grep mysqld
mysqld.service                                enabled 
mysqld@.service                               disabled

注意:如果安装mysql-community-server过程中出现 Public key for mysql-community-server-5.7.44-1.el7.x86_64.rpm is not installed报错,请执行rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022命令后再执行yum -y install mysql-community-server

④安装Hive

集群中选择任意一台集群安装Hive即可,案例中选择node1上安装。

[root@node1 mysql]# cd /export/server
[root@node1 mysql]# tar -zxvf ./apache-hive-3.1.2-bin.tar.gz

*   修改配置文件

    hive-env.sh

    ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/conf
    [root@node1 conf]# mv ./hive-env.sh.template ./hive-env.sh
    [root@node1 conf]# vim hive-env.sh
    # Folder containing extra libraries required for hive compilation/execution can be controlled by:
    # export HIVE_AUX_JARS_PATH=
    # --- 文件最后加入下面三行 ---
    export HADOOP_HOME=/export/server/hadoop
    export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
    export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib```

    hive-site.xml

    ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/conf
    [root@node1 conf]# vim hive-site.xml
    <configuration>
    <property>
     <name>hive.metastore.db.type</name>
     <value>mysql</value>
     <description>使用链接的数据库</description>
    </property>
    <!-- 存储元数据mysql相关配置 -->
    <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true</value>
     <description>mysql的url</description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionDriverName</name>
     <value>com.mysql.cj.jdbc.Driver</value>
     <description>mysql的驱动</description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionUserName</name>
     <value>root</value>
     <description>mysql用户名</description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionPassword</name>
     <value>Root@123</value>
     <description>mysql密码</description>
    </property>
    <property>
     <name>hive.metastore.schema.verification</name>
     <value>false</value>
     <description>关闭schema验证</description>
    </property>
    <property>
     <name>hive.cli.print.current.db</name>
     <value>true</value>
     <description>提示当前数据库名</description>
    </property>
    <property>
     <name>hive.cli.print.header</name>
     <value>true</value>
     <description>查询输出时带列名一起输出</description>
    </property>
    <property>
     <name>hive.server2.thrift.bind.host</name>
     <value>node1</value>
     <description>H2S运行绑定host</description>
    </property>
    <property>
     <name>hive.metastore.uris</name>
     <value>thrift://node1:9083</value>
     <description>远程模式部署metastore metastore地址</description>
    </property>
    </configuration>

*   初始化hive

    ```[root@node1 conf]# cd /export/server/apache-hive-3.1.2-bin/lib
    [root@node1 lib]# schematool -dbType mysql -initSchema
    # 初始化成功后会在mysql中创建74张表

*   启动hive

    ```# 前台启动  关闭 ctrl+c
    /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
    
    # 前台启动开启debug日志
    /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG, console
    
    # 后台启动  进程挂起,使用jps查看进程,使用kill -9杀死进程
    nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &

2、hive客户端

Hive发展至今,总共历经了两代客户端工具。

HiveServer2通过Metastore服务读写元数据。所以在远程模式下,启动HiveServer2之前必须先启动Metastore服务。


*   客户端连接

    ```# 第一代客户端
    [root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/hive
    
    # 第二代客户端
    [root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/beeline

node3中运行客户端访问node1中的hive服务

# node1执行
[root@node1 server]# scp -r /export/server/apache-hive-3.1.2-bin root@node3:/export/server

# node3执行
root@node3 server]# /export/server/apache-hive-3.1.2-bin/bin/beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/server/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/server/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 3.1.2 by Apache Hive
beeline> ! connect jdbc:hive2://node1:10000
Connecting to jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root
Enter password for jdbc:hive2://node1:10000: 直接回车
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node1:10000> 
0: jdbc:hive2://node1:10000> show databases;
INFO  : Compiling command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6): show databases
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6); Time taken: 1.905 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=root_20240227233311_926b9e5a-a87e-48b9-ac36-67a9c9d013b6); Time taken: 0.324 seconds
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| default        |
+----------------+
1 row selected (3.219 seconds)
0: jdbc:hive2://node1:10000> 
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;

解决comment中文乱码

mysql中执行以下语法

alter table hive3.COLUMNS_V2 modify column comment varchar(256) character set utf8;
alter table hive3.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive3.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive3.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

上一篇 下一篇

猜你喜欢

热点阅读