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操作

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
)

封面

封面