希文的个人博客

白日依山尽,黄河入海流。欲穷千里目,更上一层楼。

0%

Hadoop伪分布搭建文档

Hadoop伪分布搭建文档

[TOC]

1. 准备1台虚拟机或云主机

1) 配置好主机名

配置主机hostname为master

1
hostnamectl set-hostname master

2)准备

  1. 关闭防火墙
1
2
3
systemctl status firewalld                 #查看防火墙状态
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
  1. 安装JDK并配置JDK环境变量(参考云主机Web应用环境搭建文档)
  2. 配置/etc/hosts文件
1
2
3
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.101 master

DNS寻址

主机名映射到ip地址

image-20220628092942172

2. 配置SSH免密登录

  1. master生成密钥
1
2
3
ssh-keygen -t rsa (四个回车)
cd /root/.ssh
cp id_rsa.pub authorized_keys
  1. 测试master到本地的免密登录
1
2
ssh root@master
ssh root@localhost

3.安装JDK

  • 进入/opt/software/java目录下
1
2
3
cd /opt/software
mkdir java
cd java
  • 下载linux-jdk1.8版本压缩文件到到本地/opt目录下
1
wget https://mirrors.huaweicloud.com/java/jdk/8u152-b16/jdk-8u152-linux-x64.tar.gz
  • 解压缩到目录下
1
2
tar -zxvf jdk-8u152-linux-x64.tar.gz
mv jdk1.8.0_251 jdk1.8
  • 查看是否解压成功

  • 配置环境变量

    编辑/etc/profile文件

    1
    vim /etc/profile

    vim会开启文档查看窗口,默认情况下不可修改文档内容,可以使用键盘的方向键浏览文档。这里使用移动到文档的最后一行,按键盘上的i键进入编辑模式,会看到文档下方提示-- INSERT --,该模式下可以对文档内容进行修改。

    在最后一行后面新起几行,添加如下内容:

    1
    2
    export JAVA_HOME=/opt/software/java/jdk1.8
    export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

    然后按ESC退出编辑模式,输入:wq!保存本次修改并退出vim

    /etc/profile文件的修改默认不会马上生效,可以使用命令source /etc/profile让本次修改在当前访问中生效。

  • 验证是否配置成功,使用java -version命令

4. 安装hadoop伪分布

1.下载hadoop安装包

1
2
3
cd /opt/software/hadoop
#华为云下载hadoop-2.7.7安装包
https://mirrors.huaweicloud.com/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz

2.将hadoop2.7.7 解压到 /opt/software/hadoop目录下

1
tar -zxvf hadoop-2.7.7.tar.gz

3.配置环境变量

1
2
3
4
5
6
7
8
vi /etc/profile

export JAVA_HOME=/opt/jdk1.8.0
export HADOOP_HOME=/opt/software/hadoop/hadoop2.7.7
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH:$HOME/bin

使配置生效-仅当前shell有效-全部生效需要重启电脑
source /etc/profile

4.对Hadoop进行配置

  1. 修改hadoop-env.sh文件,添加jdk
1
2
3
vi /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/opt/software/java/jdk1.8
  1. 修改core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
vi /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop/hadoop-2.7.7/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
</configuration>
  1. 修改hdfs-site.xml
1
2
3
4
5
6
7
8
vi /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

HDFS的副本数量,伪分布下使用1,完全分布下使用3

  1. 配置mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
复制模板文件并配置

cp /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/mapred-site.xml.template /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/mapred-site.xml

配置文件内容

vi /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  1. 配置yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
vi /opt/software/hadoop/hadoop-2.7.7/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

5.格式化hdfs

1
2
3
hdfs namenode -format

注:如果不是首次进行格式化,需要删除本地hadoop的tem目录下的所有内容,再进行格式化

6.启动hadoop

1
2
start-dfs.sh
start-yarn.sh

查看hadoop运行情况

  1. 每个主机使用jps命令查询

  2. 浏览器访问 http://master:50070

    注意:云主机需要开放50070端口才能正常访问网页

7.测试Hadoop运行

  1. 创建一个临时文件hello

    1
    2
    3
    4
    5
    vi hello

    hello world
    hello hadoop
    hadoop
  2. 将文件上传到hdfs上

    1
    hdfs dfs -put hello /
  3. 查看文件是否正确上传

    1
    hdfs dfs -ls /
  4. 对文件进行词频统计

    1
    hadoop jar /opt/software/hadoop/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /hello /out

    查看词频统计结果

    1
    hdfs dfs -cat /out/part*
  5. 删除本例用的hello文件和out文件夹

    1
    2
    hdfs dfs -rm /hello
    hdfs dfs -rm -r /out

8.配置hadoo中hdfs网页(hdfs网站默认端口50070端口)

1.在阿里云的安全组中配置入方向50070端口,授权对象0.0.0.0

2.配置完成后http://ip:50070

image-20220628140852600

5. 安装Hive

/opt/software/hive/hive-2.3.8

1.获取安装文件

1
wget https://mirrors.huaweicloud.com/apache/hive/hive-2.3.8/apache-hive-2.3.8-bin.tar.gz

2.解压缩

1
2
3
4
tar -zxvf apache-hive-2.3.8-bin.tar.gz

修改文件夹名称
mv apache-hive-2.3.8-bin hive-2.3.8

3.配置环境变量

1
2
3
4
5
6
7
8
9
10
11
编辑/etc/profile文件
vim /etc/profile

声明HIVE_HOME变量,并将$HIVE_HOME/bin添加到PATH变量中
export HIVE_HOME=/opt/software/hive/hive-2.3.8
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:

配置完成后,按ESC -> :wq!回车

让本次配置马上生效
source /etc/profile

4.配置Hive

1.配置hive-env.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
复制模板
cd /opt/software/hive/hive-2.3.8/conf
cp hive-env.sh.template hive-env.sh

编辑文件
vim hive-env.sh

在首行添加
export HADOOP_HOME=/opt/software/hadoop/hadoop-2.7.7
export HIVE_HOME=/opt/software/hive/hive-2.3.8
export HIVE_CONF_DIR=/opt/software/hive/hive-2.3.8/conf
export JAVA_HOME=/opt/software/java/jdk1.8
export HIVE_AUX_JARS_PATH=/opt/software/hive/hive-2.3.8/lib
2.配置hive-site.xml

正常情况下,应该通过hive-default.xml.template模板文件生成hive-site.xml文件,但是该模板文件内容过多,修改较为麻烦。因此,可以直接通过命令创建一个空白的hive-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
33
34
35
36
37
38
39
40
41
42
43
44
创建空白的hive-site.xml文件
vim /opt/software/hive/hive-2.3.8/conf/hive-site.xml

为规避粘贴缩进错位问题,可先使用 :set paste 设置vim为粘贴模式,
再按i进入编辑模式,然后将如下内容粘贴到该文件中,需要特别注意,xml文件的第一行必须是`<?xml version="1.0"...`,前面不能有任何的空行:

<?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://master:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hadoop</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepwd</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://master:8020/hive/warehouse</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/software/hive/hive-2.3.8/exec</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/hive/downloadedsource</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/hive/logs</value>
</property>
</configuration>

ESC-> :wq!回车
3.配置Hive的日志目录

Hive中使用log4j2插件进行运行日志的记录,该插件默认将Hive日志保存在本地主机的${sys:java.io.tmpdir}/${sys:user.name}路径下,对初学者来说不容易查找。因此,我们配置修改该路径,将hive的日志保存在/opt/hive/log目录下。后续,hive运行中产生异常时,可以查看该目录下的日志信息,找到具体的异常信息。

1
2
3
4
5
6
7
拷贝文件
cp hive-log4j2.properties.template hive-log4j2.properties

编辑文件
vim hive-log4j2.properties

property.hive.log.dir = /opt/software/hive/hive-2.3.8/log
4.将mysql连接jar包添加到hive的lib文件夹下

hive基于JDBC访问Mariadb数据库,因此,需要将mysql连接jar包添加到hive安装目录下的lib目录中,可以直接使用xftp等工具实现这一操作,也可以通过外网直接下载:

1
2
3
4
wget -P /opt/software/hive/hive-2.3.8/lib  https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar

阿里云下载地址:
wget -P /opt/software/hive/hive-2.3.8/lib/ https://archiva-maven-storage-prod.oss-cn-beijing.aliyuncs.com/repository/jcenter/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
5.解决SLF4J重复问题

hive和hadoop都使用了SLF4J的jar包,但是版本不同,会造成冲突提示,可以直接删除hive中的SLF4J的jar包:

1
2
cd /opt/software/hive/hive-2.3.8/lib
rm -f log4j-slf4j-impl-2.6.2.jar
6.配置MariaDB、或Mysql

mariadb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#进入MariaDB
mysql -uroot -proot

#建库
create database hive;

#配置权限
grant all on hive.* to hadoop@'master' identified by 'hivepwd';

#使配置生效
flush privileges;

#退出MariaDB
exit;

Mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
#进入mysql
mysql -uroot -proot
#建库
create database hive;
#创建账号
CREATE USER 'hadoop'@'master' IDENTIFIED BY 'hivepwd';
#配置权限
grant all on nybikedb.* to hadoop@'master' identified by 'hivepwd';
#使配置生效
flush privileges;

#退出MariaDB
exit;
7.初始化Hive的元数据库
1
2
3
在第一次使用hive前,需要用如下命令初始化hive的元数据库,该命令只能执行1次:

schematool -dbType mysql -initSchema
8.使用Hive

可以使用hive命令启动hive,注意,Hive启动时会直接访问HDFS,Hive的一些操作会继续MapReduce实现。因此需要保证HDFS和YARN已经处于启动状态。 hive

查询当前所有的库

1
show databases;

测试Hive

1
2
3
4
5
6
7
8
9
create database testdb; 

use testdb;

create table student(id int,name string);

insert into student values(1,'Tom');

select * from student;

6.Sqoop操作文档安装

1 下载安装包

1
2
wget http://archive.apache.org/dist/sqoop/1.4.2/sqoop-1.4.2.bin__hadoop-2.0.0-alpha.tar.gz 

2 安装

使用如下命令将sqoop解压到虚拟机的/opt目录下

tar -zxvf sqoop-1.4.2.bin__hadoop-2.0.0-alpha.tar.gz

将文件夹名称修改为sqoop-1.4.7

1
2
mv sqoop-1.4.2.bin__hadoop-2.0.0-alpha sqoop-1.4.2

3 配置环境变量

使用vim命令编辑文件
vim /etc/profile

export SQOOP_HOME=/opt/software/sqoop/sqoop-1.4.2
export PATH=$SQOOP_HOME/bin:

使本次配置生效
source /etc/profile

检查环境变量是否配置成功
sqoop version

4 添加数据库连接jar包

使用xftp将数据库连接jar包上传到虚拟机的/opt/sqoop-1.4.7/lib目录下

也可以使用如下命令,从hive的lib目录下拷贝数据库连接jar包到sqoop对应目录下

cp /opt/software/hive/hive-2.3.8/lib/mysql-connector-java-8.0.16.jar /opt/software/sqoop/sqoop-1.4.2/lib/

如果未安装Hive,可以直接从官网下载jar包:
wget -P /opt/sqoop-1.4.7/lib/  https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar

阿里云下载地址:
wget -P /opt/sqoop-1.4.7/lib/ https://archiva-maven-storage-prod.oss-cn-beijing.aliyuncs.com/repository/jcenter/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar

测试

1. MySQL导入数据到HDFS

首先,在MySQL中创建测试用库和表并插入数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create database sqoop;

use sqoop;

create table widgets(
id int not null primary key auto_increment,
widget_name varchar(64) not null,
price decimal(10,2),
design_date date,
version int,
design_comment varchar(100)
);

INSERT INTO widgets VALUES(NULL,'sprocket',0.25,'2010-02-10', 1, 'Connects two gizmos');
INSERT INTO widgets VALUES(NULL, 'gizmo', 4.00, '2009-11-30', 4,NULL);
INSERT INTO widgets VALUES(NULL, 'gadget', 99.99, '1983-08-13', 13, 'Our flagship product');

接下来,使用sqoop命令将widgets表中数据导入到HDFS中:

参数说明:

  • import :表示导入数据至HDFS
  • –connect jdbc:mysql://……:定义数据库连接的URL
  • –username root:指定连接MySQL的用户名
  • –password root:指定连接MySQL的密码
  • –table widgets:指明待导入的MySQL表名
  • -m 1:指定用于导入数据的Map作业的个数ssh

查看结果:

查看HDFS上的数据:

该命令会自动将MySQL表中的数据保存到HDFS上的/user/用户名/表名目录下。

也可以使用 --target-dir /路径来指定导入到HDFS上的路径,如:

1
2
3
4
5
6
7
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table widgets \
--target-dir /sqoop/widgets \
-m 1

2. HDFS导出数据到MySQL

首先,在MySQL中创建接收数据的表格:

1
2
3
4
5
6
7
8
9
10
use sqoop;

create table widgets_from_hdfs(
id int not null primary key auto_increment,
widget_name varchar(64) not null,
price decimal(10,2),
design_date date,
version int,
design_comment varchar(100)
);

接下来,使用sqoop命令将HDFS上的数据导出到MySQL中:

1
2
3
4
5
6
7
8
sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table widgets_from_hdfs \
--export-dir /user/root/widgets/part-m-00000 \
--input-fields-terminated-by ',' \
-m 1

参数说明:

  • export:表示从HDFS导出数据
  • –connect jdbc:mysql://……:定义数据库连接的URL
  • –table widgets_from_hdfs:指定导出至MySQL的表名
  • –export-dir /……/widgets/part-m-00000:指定导出文件
  • –input-fields-terminated-by ‘,’:指明导出数据的分割符为 ,

运行成功后,使用SQL语句查询widgets_from_hdfs表中数据,查看数据是否导入成功:

将数据从Hive导入Mariadb

示例需求:将hive中的nybikedb/tb_day_gender_count表中数据导入到Mariadb中

1. 在云主机的Mariadb中创建用于接收数据的表

登录虚拟机的Mariadb
mysql -uroot -proot

以下为mysql中的操作,建表时需要注意表中字段名称和个数需要与hive中的表一致,但是字段类型要调整为mysql的类型,主要就是讲string调整为char或者varchar

create database nybikedb;

use nybikedb;

create table day_gender_count(
day varchar(30) comment '数据的日期',
gender int comment '用户性别,0-未知,1-男性,2-女性',
count int comment '日骑行总数'
);

2. 使用sqoop命令将hive数据导入到Mariadb中

-- 以下在虚拟机的终端中操作,操作前需要启动hdfs和yarn

sqoop export \
--connect jdbc:mysql://localhost:3306/nybikedb \
--username root \
--password aliyun123Xiwen \
--table day_gender_count \
--fields-terminated-by ',' \
--export-dir /hive/warehouse/nybikedb.db/day_gender_count

其中:

  • --connect:指定连接的关系型数据库的url
  • --username:关系型数据库的用户名
  • --password:关系型数据库的密码
  • --table:关系型数据库中的表名
  • --fields-terminated-by:要导入的数据文件的分隔符,即hive中声明表时使用的字段分隔符
  • --export-dir:hive表对应的数据在HDFS上的存储目录,目录的最后一级对应的是hive上的表名

如果hive中的目标表使用了分区,那么sqoop导出数据时会抛出异常,因为目标文件夹下不是数据文件,而是分区的子文件夹。这里可以在hive上新建一张临时表,去掉分区信息,并保证数据的顺序,再使用sqoop导出该表的数据到Mariadb中。

7.数仓分层

在阿里巴巴的数据体系中,我们建议将数据仓库分为三层,自下而上为:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层(ADS,Application Data Service)。

数据仓库的分层和各层级用途如下图所示。img

  • 数据引入层ODS(Operation Data Store):存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区。主要完成基础数据引入到MaxCompute的职责,同时记录基础数据的历史变化。

  • 数据公共层CDM(Common Data Model,又称通用数据模型层),包括DIM维度表、DWD和DWS,由ODS层数据加工而成。主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。

    • 公共维度层(DIM):基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。

      公共维度层的表通常也被称为逻辑维度表,维度和维度逻辑表通常一一对应。

    • 公共汇总粒度事实层(DWS):以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。构建命名规范、口径一致的统计指标,为上层提供公共指标,建立汇总宽表、明细事实表。

      公共汇总粒度事实层的表通常也被称为汇总逻辑表,用于存放派生指标数据。

    • 明细粒度事实层(DWD):以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。

      明细粒度事实层的表通常也被称为逻辑事实表。

  • 数据应用层ADS(Application Data Service):存放数据产品个性化的统计指标数据。根据CDM与ODS层加工生成。

该数据分类架构在ODS层分为三部分:数据准备区、离线数据和准实时数据区。整体数据分类架构如下图所示。img在本教程中,从交易数据系统的数据经过DataWorks数据集成,同步到数据仓库的ODS层。经过数据开发形成事实宽表后,再以商品、地域等为维度进行公共汇总。

整体的数据流向如下图所示。其中,ODS层到DIM层的ETL(萃取(Extract)、转置(Transform)及加载(Load))处理是在MaxCompute中进行的,处理完成后会同步到所有存储系统。ODS层和DWD层会放在数据中间件中,供下游订阅使用。而DWS层和ADS层的数据通常会落地到在线存储系统中,下游通过接口调用的形式使用。img

8.目标:利用大数据平台对共享单车历史数据进行预处理分析

1.上传共享单车历史数据

使用tabby的sftp工具,将案例数据.zip上传到云主机/opt/software/hadoop/data路径下

image-20220628143531804

2.将数据解压缩

1.如果没有unzip命令

image-20220628144317651

2.安装unzip

1
yum install -y unzip

3.安装完成

image-20220628144453731

4.解压中文的压缩文件时乱码直接复制那个乱码的字符串然后解压

image-20220628144847075

上面手欠改错了,又将案例数据改成了nybikeData

3.将数据进行预处理

要求

image-20220628145510536

  • 查看两条数据进入/opt/software/hadoop/data/nybikeData
1
2
#查看两条数据
cat 201906-citibike-tripdata.csv | head -n 2
1
2
3
#出来的数据信息
"tripduration","starttime","stoptime","start station id","start station name","start station latitude","start station longitude","end station id","end station name","end station latitude","end station longitude","bikeid","usertype","birth year","gender"
330,"2019-06-01 00:00:01.5000","2019-06-01 00:05:31.7600",3602,"31 Ave & 34 St",40.763154,-73.920827,3570,"35 Ave & 37 St",40.7557327,-73.9236611,20348,"Subscriber",1992,1

1.去掉文件文件的标头行

可以通过linux的sed命令实现上述需求

1
sed -i '1d' 201906-citibike-tripdata.csv 

​ 处理完的数据去掉了第一行数据

2.-> 数据后续需要使用Hive去管理-> hive数据管理的数据要求去表头,去掉字段前后的双引号。

去掉文本中所有的双引号:

1
sed -i 's/"//g' 201906-citibike-tripdata.csv  

处理完的数据

1
2
330,2019-06-01 00:00:01.5000,2019-06-01 00:05:31.7600,3602,31 Ave & 34 St,40.763154,-73.920827,3570,35 Ave & 37 St,40.7557327,-73.9236611,20348,Subscriber,1992,1
830,2019-06-01 00:00:04.2400,2019-06-01 00:13:55.1470,3054,Greene Ave & Throop Ave,40.6894932,-73.942061,3781,Greene Av & Myrtle Av,40.698568,-73.918877,34007,Subscriber,1987,2

3.将数据上传到HDFS上

1
hdfs dfs -put 201906-citibike-tripdata.csv  /data

​ 查看有没有上传成功

image-20220628155823266

4.需求分析:对共享单车的历史数据进行分析

对共享单车的历史数据进行分析

背景:前面的操作中实现了将纽约市2019年6月共享单车历史数据导入到HDFS上进行存储。该数据集中包含了2125371行记录,每行15个字段,接下来可以对历史数据进行分析。

需求:2019年6月每一天不同性别的用户的骑行数量

数据仓库

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。

在云主机上安装Hive

使用Hive管理共享单车历史数据

  • 在Hive中建库建表,以便管理共享单车历史数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    -- 创建项目对应的库
    create database nybikedb;

    -- 使用库
    use nybikedb;

    -- 在库下创建表
    create table trip_data_201906(
    tripduration int,
    starttime string,
    stoptime string,
    start_station_id int,
    start_station_name string,
    start_station_latitude double,
    start_station_longitude double,
    end_station_id int,
    end_station_name string,
    end_station_latitude double,
    end_station_longitude double,
    bikeid int,
    usertype string,
    birth_year int,
    gender int
    )row format delimited fields terminated by ',';
  • 将HDFS上的数据导入到Hive的表中

    1
    2
    3
    4
    5
    6
    7
    8
    -- 导入数据
    load data inpath '/data/201906-citibike-tripdata.csv' into table nybikedb.trip_data_201906;

    -- 查看表中数据行数
    select count(*) from nybikedb.trip_data_201906;

    -- 查看表中一行记录
    select * from nybikedb.trip_data_201906 limit 1;
  • 使用HiveQL对数据进行统计分析

    1
    2
    3
    4
    5
    -- 2019年6月每一天不同性别的用户的骑行数量
    select day(starttime) as day, gender, count(*) as count
    from nybikedb.trip_data_201906
    group by day(starttime), gender
    order by day, gender;
  • 上述查询的结果只是存在在内存中,无法持久化,无法复用,如果分析的结果被复用,应该在Hive中先创建一个结果表,再使用insert into 语句搭配select语句,将统计的结果直接写入结果表

  • 具体操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- 在hive中创建结果表
    create table nybikedb.day_gender_count(
    day int,
    gender int,
    count int
    )row format delimited fields terminated by ',';

    -- 统计数据并将结果写入结果表
    insert into nybikedb.day_gender_count
    select day(starttime) as day, gender, count(*) as count
    from nybikedb.trip_data_201906
    group by day(starttime), gender
    order by day, gender;

将数据从Hive导入Mariadb

使用Sqoop完成该需求。

image-20220920165811152

1. 在云主机的MariaDB中创建用于接收数据的表

-- 登录虚拟机的Mariadb
mysql -uroot -proot

-- 以下为mysql中的操作,建表时需要注意表中字段名称和个数需要与hive中的表一致,但是字段类型要调整为mysql的类型,主要就是讲string调整为char或者varchar

use nybikedb;

create table day_gender_count(
day int comment '数据的日期',
gender int comment '用户性别,0-未知,1-男性,2-女性',
count int comment '日骑行总数'
);

2. 使用sqoop命令将hive数据导入到MariaDB中

以下在虚拟机的终端中操作,操作前需要启动hdfs和yarn

sqoop export \
--connect jdbc:mysql://localhost:3306/nybikedb \
--username root \
--password root \
--table day_gender_count \
--fields-terminated-by ',' \
--export-dir /hive/warehouse/nybikedb.db/day_gender_count

其中:

  • --connect:指定连接的关系型数据库的url
  • --username:关系型数据库的用户名
  • --password:关系型数据库的密码
  • --table:关系型数据库中的表名
  • --fields-terminated-by:要导入的数据文件的分隔符,即hive中声明表时使用的字段分隔符
  • --export-dir:hive表对应的数据在HDFS上的存储目录,目录的最后一级对应的是hive上的表名

image-20220920165757048

如果hive中的目标表使用了分区,那么sqoop导出数据时会抛出异常,因为目标文件夹下不是数据文件,而是分区的子文件夹。这里可以在hive上新建一张临时表,去掉分区信息,并保证数据的顺序,再使用sqoop导出该表的数据到MariaDB中。

在本地IDEA的项目中访问云主机数据库

image-20220920165823715

  • 在云主机的数据库中新建账号,限定权限

    1
    2
    3
    4
    5
    6
    7
    mysql -uroot -proot

    grant all on nybikedb.* to user@'%' identified by 'mysqlDWP135@';

    flush privileges;

    exit;
  • 开放云主机的3306端口

  • 修改本地IDEA中nybike项目的配置文件

    • 修改src/main/resources/application.properties中的配置

DBeaver连接Hive问题

修改hadoop的配置文件

修改 core-site.xml文件

  vim /usr/local/hadoop/etc/hadoop/core-site.xml

1
2
3
4
5
6
7
8
9
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>

<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>

关闭文件权限检查:

hdfs-site.xml

1
2
3
4
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

通过以下命令启动远程服务:

1
2
nohup hive --service metastore &
nohup hive --service hiveserver2 &

远程服务对外的端口是10000,启动成功后,使用netstat命令验证:

1
netstat -antpl|grep 10000

下载cloudera版本的JDBC驱动

下载地址:https://www.cloudera.com/downloads.html

1.第一步

image-20220629124404068

2.第二步

image-20220629124426936

3.第三步打开添加,找到驱动类

image-20220629143533935

4.第四步选择无认证

image-20220629215710441

第五步连接成功

image-20220629215837577

Hive远程访问操作
https://blog.51cto.com/candon123/2048202

http://www.wjhsh.net/0xcafedaddy-p-8392029.html