Hadoop框架

HDFS

  • 镜像:centos_7_9_x64_20G_alibase
  • Java:JDK 1.8.0_361
  • Hadoop:Apache Hadoop 3.3.5
  • node1: NameNode, DataNode, SecondaryNameNode
  • node2,node3: DataNode

HDFS部署

配置HDFS集群,主要涉及以下文件(存于$HADOOP_HOME/etc/hadoop):

  • workers: 配置DataNode
  • hadoop-env.sh: 配置hadoop的相关环境变量
  • core-site.xml: Hadoop核心配置文件
  • hdfs-site.xml: HDFS核心配置文件

配置workers

1
2
3
4
5
6
7
# 进入目录
cd etc/hadoop
vim workers
# 填入
node1
node2
node3

配置hadoop-env.sh

1
2
3
4
5
vim hadoop-env.sh
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop # hadoop配置文件目录
export HADOOP_LOG_DIR=$HADOOP_HOME/logs # hadoop运行日志

配置core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>fs.defaultFS</name>
<!-- HDFS文件系统的网络通讯路径 -->
<value>hdfs://node1:8020</value>
<!-- 配置了node1为namenode,并且协议为hdfs://,端口为8020 -->
</property>

<property>
<name>io.file.buffer.size</name>
<!-- io操作文件缓冲区大小,单位:字节(131072字节=128KB) -->
<value>131072</value>
</property>
</configuration>

配置hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<property>
<name>dfs.datanode.data.dir.perm</name>
<!-- hdfs默认创建的文件权限设置 -->
<value>700</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<!-- NameNode元数据的存储路径 -->
<value>/data/nn</value>
</property>
<property>
<name>dfs.namenode.hosts</name>
<!-- hdfs白名单,允许哪些节点可以作为DataNode加入集群 -->
<value>node1,node2,node3</value>
</property>
<property>
<name>dfs.blocksize</name>
<!-- HDFS文件块大小,256MB -->
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<!-- NameNode处理的并发线程数 -->
<value>100</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<!-- DataNode的数据存储目录 -->
<value>/data/dn</value>
</property>
</configuration>

创建数据存放目录

1
2
3
4
5
6
# node1
mkdir -p /data/nn
mkdir /data/dn

#node2, node3
mkdir -p /data/dn

分发Hadoop文件夹

1
2
3
4
5
6
7
# 在node1当中执行
cd /export/server
scp -r hadoop-3.3.5 node2:`pwd`/
scp -r hadoop-3.3.5 node3:`pwd`/

# 在node2,node3执行,为hadoop配置软连接
ln -s /export/server/hadoop-3.3.5 /export/server/hadoop

配置环境变量

1
2
3
4
5
vim /etc/profile

# 追加
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

授权为hadoop用户

1
2
3
# 以root的身份,在三台服务器上均执行
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export

格式化整个文件系统

1
2
3
4
5
6
7
8
# 切换为hadoop
su - hadoop
hadoop namenode -format

# 启动hdfs集群,启动后可用公网ip:9870打开namenode的web界面
start-dfs.sh
# 关闭hdfs集群
stop-dfs.sh

HDFS的shell操作

进程启停管理

1
2
3
#单独控制当前机器的进程启停
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

文件系统操作命令

1
2
3
4
5
6
7
8
9
hdfs dfs -mkdir [-p] <path> ... #-p表示可以沿父目录创建
hdfs dfs -ls [-h] [-R] <path> #-h表示显示size,-R表示递归查看
hdfs dfs -put [-f] [-p] <localsrc> <dst> #-f强制覆盖,-p表示保留访问和修改时间,localsrc表示linux路径,dst为hdfs路径
hdfs dfs -cat <src> | more #文件过大可以用管道符配合more实现翻页
hdfs dfs -get [-f] [-p] <src> <localdst> #从hdfs下载到本地
hdfs dfs -cp [-f] <src> <dst> #都在hdfs下
hdfs dfs -appendToFile <localsrc> <dst> #本地内容向hdfs追加
hdfs dfs -mv <src> <dst> #移动和重命名
hdfs dfs -rm -r [-skipTrash]

Yarn

Yarn架构

类似于HDFS中NameNode和DataNode的主从架构,Yarn中为ResourceManager和NodeManager,分别管理集群资源和单机资源,其中NodeManager通过容器来进行资源分配。

除此之外还有两个辅助角色,为ProxyServer和JobHistoryServer。

ProxyServer用于保障对于Yarn的WebUI访问是安全的;

JobHistoryServer用于记录历史运行的程序信息以及日志,可以将不同容器的日志统一搜集。

Yarn部署

  • node1: ResourceManager,NodeManager,ProxyServer,JobHistoryServer
  • node2,node3: NodeManager
1
2
3
4
5
6
7
8
cd /export/server/hadoop/etc/hadoop/
vim mapred-env.sh
#JDK路径
export JAVA_HOME=/export/server/jdk
#设置进程内存1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
#设置日志级别INFO
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
cd /export/server/hadoop/etc/hadoop/
vim mapred-site.xml
<configuration>

<!-- MapReduce运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>MapReduce的运行框架设置为YARN</description>
</property>

<!-- JobHistory Server 通信地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
<description>历史服务器通讯端口为 node1:10020</description>
</property>

<!-- JobHistory Server Web UI -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
<description>历史服务器web端口为 node1:19888</description>
</property>

<!-- 历史记录临时目录 -->
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/data/mr-history/tmp</value>
<description>历史信息在HDFS的记录临时路径</description>
</property>

<!-- 历史记录完成目录 -->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/data/mr-history/done</value>
<description>历史信息在HDFS的记录路径</description>
</property>

<!-- 环境变量配置 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
<description>MapReduce HOME 设置为 HADOOP_HOME</description>
</property>

<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
<description>MapReduce HOME 设置为 HADOOP_HOME</description>
</property>

<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
<description>MapReduce HOME 设置为 HADOOP_HOME</description>
</property>

</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
vim yarn-env.sh
# 设置JDK路径的环境变量
export JAVA_HOME=/export/server/jdk

# 设置HADOOP_HOME的环境变量
export HADOOP_HOME=/export/server/hadoop

# 设置配置文件路径的环境变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

# 设置日志文件路径的环境变量
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
vim yarn-site.xml
<configuration>

<!-- ResourceManager所在节点 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
<description>ResourceManager设置在node1节点</description>
</property>

<!-- NodeManager本地数据存储路径 -->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/nm-local</value>
<description>NodeManager中间数据本地存储路径</description>
</property>

<!-- NodeManager日志本地存储路径 -->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
<description>NodeManager数据日志本地存储路径</description>
</property>

<!-- 开启shuffle服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>为MapReduce程序开启Shuffle服务</description>
</property>

<!-- 日志服务器URL -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
<description>历史服务器URL</description>
</property>

<!-- Web代理 -->
<property>
<name>yarn.web-proxy.address</name>
<value>node1:8089</value>
<description>代理服务器主机和端口</description>
</property>

<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>开启日志聚合</description>
</property>

<!-- 程序日志在HDFS的存储路径 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>程序日志HDFS的存储路径</description>
</property>

<!-- 调度器 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>选择公平调度器</description>
</property>

</configuration>
1
2
3
#分发到另外服务器
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node2:$PWD
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node3:$PWD

Yarn启停命令

1
2
3
4
5
6
7
8
9
# 一键启动Yarn集群,启动后可用公网ip:8088打开ResourceManager的web界面
start-yarn.sh
# 一键停止Yarn集群
stop-yarn.sh

# 启动JobHistoryServer,可用公网ip:19888访问历史日志
mapred --daemon start historyserver
# 停止JobHistoryServer
mapred --daemon stop historyserver
1
2
3
# 单独控制当前机器的进程启停
yarn --daemon (start|status|stop) (resourcemanager|nodemanager|proxyserver)
mapred --daemon (start|status|stop) historyserver

Hive

Hive配置

连接DataGrip

1
2
3
4
5
start-dfs.sh
start-yarn.sh
cd /export/servers/hive
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

启动完毕后,在DataGrip中连接Hive,端口默认为10000。

可以用jps命令查看Hive的进程。结果如下:
启动完进程

常用语句

不同于MySQL,Hive的语法和MySQL的语法略微不同。

1
2
3
4
5
6
7
8
9
10
-- 创建表
-- Hive 不支持 AUTO_INCREMENT。
-- 必须指定数据的存储格式(如 TEXTFILE、PARQUET、ORC 等)和字段分隔符。
CREATE TABLE table_name (
column1 STRING,
column2 INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
1
2
3
4
5
6
7
-- 分区表
CREATE TABLE table_name (
column1 STRING,
column2 INT
)
PARTITIONED BY (partition_column STRING)
STORED AS PARQUET;
1
2
3
4
5
6
-- 外部表
CREATE EXTERNAL TABLE table_name (
column1 STRING,
column2 INT
)
LOCATION '/path/to/external/data/';
1
2
3
-- 加载本地数据
-- Hive 使用 LOAD DATA 导入本地或 HDFS 数据。
LOAD DATA LOCAL INPATH '/path/to/data/file' INTO TABLE table_name;
1
2
3
4
5
6
7
8
-- 分区表
分区是根据某个字段(或多个字段)的值,将数据存储在不同目录下的一种逻辑组织方式。每个分区实际上对应 HDFS 上的一个目录,分区字段的值决定了数据存放的位置。
-- 分区表创建
CREATE TABLE sales (
id INT,
amount FLOAT
)
PARTITIONED BY (region STRING, date STRING);
1
2
3
4
5
6
-- 分桶表
分桶是将数据划分为多个桶(bucket),每个桶包含一部分数据。分桶表创建
CREATE TABLE sales (
id INT,
amount FLOAT
)

封面

封面