安装Hive
- 在线安装MariaDB
yum install mariadb-server
- 会提示你如下内容,按y即可。
- 会提示你complete!
- 初始化MariaDB
- 启动MariaDB:
systemctl start mariadb
- 没提示就证明启动了!
- 设置开机启动:
systemctl enable mariadb
- 会提示你将MariaDB加入了开机任务
- MariaDB初始化配置:
mysql_secure_installation
- 让你输入之前的密码,我们没有就按回车
- 问你是否设置密码,y,然后输入新的密码(Linux默认不显示)回车,再次输入新的密码
- 不匹配会让你重新输入,然后会进行几项默认配置,我是默认全y
- 成功会有如下提示:
- 我们登录数据库检查一下
mysql -uroot -pxxx
- xxx是你刚才设置的密码!
- 成功登录就代表你的MariaDB搞定了!
exit;
退出MariaDB
- 启动MariaDB:
- 安装Hive
- 获取压缩包:
- 为了方便,还是老规矩,我们将压缩包提前放到了云主机的opt目录下
- 解压缩:
tar zxvf /opt/apache-hive-2.3.5-bin.tar.gz -C /opt
- ls一下,检查是否成功:
- 名字有点长,我们利用mv改一下名字:
mv /opt/apache-hive-2.3.5-bin /opt/hive-2.3.5
- ls检查一下:
- 配置环境变量:
vim /etc/profile
- 在末尾追加以下内容:
-
export HIVE_HOME=/opt/hive-2.3.5
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf: - 保存,然后
source /etc/profile
让本次配置生效
- 获取压缩包:
- 配置Hive
- 因为路径有点长,我们这次先进到目标目录:
cd /opt/hive-2.3.5/conf
- 老套路,官方给的还是模板文件,我们复制生成对应的配置文件:
cp hive-env.sh.template hive-env.sh
- 编辑这个文件
vim hive-env.sh
- 末尾添加:
-
export HADOOP_HOME=/opt/hadoop-2.8.5
export HIVE_HOME=/opt/hive-2.3.5
export HIVE_CONF_DIR=/opt/hive-2.3.5/conf
export JAVA_HOME=/opt/jdk1.8.0_161
export HIVE_AUX_JARS_PATH=/opt/hive-2.3.5/lib
- 编辑这个文件
- 配置hive-site.xml文件,但是我们这里不用他的文件,因为需要改的太多了,我们直接利用vim新建一个文件,然后在里面添加内容
vim hive-site.xml
- 插入如下内容:
-
<?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/hive/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> - 保存!
- 配置Hive的日志目录:
- 这里利用模板生成hive-log4j2.properties文件(一个日志持久化保存的插件):
cp hive-log4j2.properties.template hive-log4j2.properties
- 编辑这个文件:
vim hive-log4j2.properties
- Hive中使用log4j2插件进行运行日志的记录,该插件默认将Hive日志保存在本地主机的
${sys:java.io.tmpdir}/${sys:user.name}
路径下,对初学者来说不容易查找。因此,我们配置修改该路径,将hive的日志保存在/opt/hive/log
目录下。后续,hive运行中产生异常时,可以查看该目录下的日志信息,找到具体的异常信息。 - 找到24行,修改属性为:
property.hive.log.dir = /opt/hive/log
- 拷贝MySQL连接jar包放到lib文件目录下(直接利用FTP工具即可)
- 这里为了方便,我们还是将连接jar包放到hive的lib文件下
- Hive基于JDBC访问MariaDB数据库,因此,需要将mysql连接jar包添加到hive安装目录下的lib目录中,可以直接使用xftp等工具实现这一操作。
- 解决Apache版本的Hadoop遗留的组件之间的jar包冲突的问题:
rm /opt/hive-2.3.5/lib/log4j-slf4j-impl-2.6.2.jar
- 会让你确认是否删除,y确定。
- hive和hadoop都使用了SLF4J的jar包,但是版本不同,会造成冲突提示,可以直接删除hive中的SLF4J的jar包,这样他会自动去用Hadoop的jar包。
- 因为路径有点长,我们这次先进到目标目录:
- 配置MariaDB(Hive元数据库配置):
- 进入MariaDB:
mysql -uroot -pxxxx
- 建库:
create database hive;
- 新建一个完全操作hive数据库的用户hadoop,密码hivepwd:
grant all on hive.* to hadoop@'master' identified by 'hivepwd';
- 使本次配置生效:
flush privileges;
- 退出MariaDB:
exit;
- 进入MariaDB:
- 首次启动前初始化Hive的元数据库:
schematool -dbType mysql -initSchema
- 执行一次就行!!!类似于Hadoop的format,如图就代表成功了!
- 启动Hive并测试
- 启动Hive:
hive
- 这个问题是因为我们在配置项里有关于HBase的配置,但是我们还没有HBase,所以会有这个错误。
- 这个连接失败原因是因为Hive启动时会直接访问HDFS
- 所以我们先启动一下HDFS和YARN
start-dfs.sh
和start-yarn.sh
- 都启动起来就对了:
- 我们再启动Hive,还是会提示你没有HBase,下面还有一段是基于你当前的各组件之间的适配给你的建议,可以忽略!并且我们注意到命令行开头变成了hive>就对了!
- 查看所有数据库:``
- 测试:
- 创建数据库:
create database testdb;
- 使用它:
use testdb;
- 创建一个表:
create table student(id int,name string);
- 插入数据:
insert into student values(1,'Tom');
- 我们插入数据时,会发现竟然是这样???
- 原因是因为Hive是数据仓库,是基于HDFS操作的,我们的插入操作实际上是Hive将HiveQL转变成了向HDFS上插入数据的MapReduce任务去执行。输出的这些也都是HDFS的日志内容。这和传统的关系型数据库向本地磁盘保存数据是截然不同的。
- 查询数据:
select * from student;
- 可以看到没有表结构,还是和关系型数据库不太一样。这是因为HDFS中的数据都是简单的数据文件(或者说文本文件),并没有数据库、表、字段等概念,只是单纯的数据。而Hive的作用就是给这些数据加上了对应的表信息(库名、表名、字段列表、字段类型),并保存在Hive中。
- 创建数据库:
- 启动Hive:
- 基于Hive分析共享单车数据
- 统计给定数据的每日每小时不同性别用户的骑行数量:
- 先将19年4月的数据上传到HDFS:
- 注意!!!原始文件中包含表头行,且数据间有双引号。导入MySQL时可以利用SQL语句去忽略表头行和引号,但该命令在Hive中用不了。因此在将文件上传上HDFS之前,应该先去掉表头行和引号,我们利用vim命令实现这一操作。
vim /opt/201904-citibike-tripdata.csv
- 将光标移动至第一行,按键盘d两下(dd命令),删除第一行(vim命令)
- 如果不小心删多了,直接:q!(不保存操作,直接退出)
- vim命令将所有双引号替换成空字符串:
:%s/"//gc
- 由于数据量过大,有一百七十多万条,在Hadoop和Hive开启状态下会崩溃,我们先退出Hadoop和Hive。(说白了就是内存小!没办法,谁叫咱们是个学生呢)
- 在Hive命令下输入:
exit;
退出Hive,回到linux命令行。 - stop-yarn.sh // 关闭YARN
stop-dfs.sh // 关闭HDFS - 删除刚才的.swp文件
rm .201904-citibike-tripdata.csv.swp
- 重新dd,然后将引号替换掉,替换时,会问你选项,y是替换一个,a是替换所有。我们只需要按一下a键,等着就行。因为数据量有点大。
- 成功后会在末尾提示你多少数据已经替换成功,
:wq!
保存退出! - 利用
tail 201904-citibike-tripdata.csv
查看一下数据是否为我们想要的格式。 - 重新启动HDFS和YARN
- 上传到hdfs根路径:
hdfs dfs -put /opt/201904-citibike-tripdata.csv /
- 利用命令查看是否成功上传:
hdfs dfs -ls /
- 在Hive中创建nybikedb库和相关表:
- 使用Hive命令启动Hive:
hive
- 创建数据库:
create database nybikedb;
- 使用数据库:
use nybikedb;
- 创建数据表:
-
create table tb_trip_1904(
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 tinyint
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; - 注意:
- Hive中的数据类型和MySQL中有相似的,也有不同的,比较典型的是字符串类型使用string表示。Hive中的数据类型可以从官网的介绍中详细了解:官方网站
- Hive的建表语句末尾,需要显式声明
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
,指定实际的数据文件中,字段与字段之间使用的分隔符是逗号。
- 使用Hive命令启动Hive:
- 将HDFS里的文件交给Hive管理:
- load data inpath '/201904-citibike-tripdata.csv'
into table tb_trip_1904; - 查看前两条数据检查一下:
select * from tb_trip_1904 limit 2;
- load data inpath '/201904-citibike-tripdata.csv'
- 在Hive上创建用于保存结果的表:
create table tb_day_hour_count(
trip_year int comment '数据的年份',
trip_month int comment '数据的月份',
trip_day int comment '数据的日期',
trip_dayofweek int comment '星期几',
trip_hour int comment '数据的小时',
gender int comment '用户性别',
trip_count int comment '日骑行总数'
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- 在Hive上执行查询语句,将结果保存到保存结果的表:
insert into tb_day_hour_count
select
year(starttime) as trip_year,
month(starttime) as trip_month,
day(starttime) as trip_day,
dayofweek(starttime) as trip_dayofweek,
hour(starttime) as trip_hour,
gender,
count(*) as trip_count
from
tb_trip_1904
group by
year(starttime),
month(starttime),
day(starttime),
dayofweek(starttime),
hour(starttime),
gender;- 保存完后我们可以检查一下tb_day_hour_count表,因为不多可以sellect *一下:
select * from tb_day_hour_count;
- 可以看到是2153条数据,存在我们之前在web项目中的那种数据缺失情况,暂时先不考虑补齐。
- 同理对20年数据进行操作。
- 先将19年4月的数据上传到HDFS:
- 统计给定数据的每日每小时不同性别用户的骑行数量: