hive-01
hive
1.hive介绍:
1.什么是Hive
-
Hive:由Facebook开源用于解决海量结构化日志的数据统计。
-
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
本质是:将HQL转化成MapReduce程序
- Hive处理数据存储在HDFS
- Hive分析数据底层实现是MapReduce
- 执行程序运行在Yarn上
2.Hive优缺点
-
优点
1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。 2)避免了去写MapReduce,减少开发人员的学习成本。 3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。 4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。 5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
-
缺点
1.Hive的HQL表达能力有限 (1)迭代式算法无法表达 (2)数据挖掘方面不擅长 2.Hive的效率比较低 (1)Hive自动生成的MapReduce作业,通常情况下不够智能化 (2)Hive调优比较困难,粒度较粗
3.Hive架构
4.Hive和数据库比较
- 由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性,Hive不是数据库。
5.查询语句
- 由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
6.数据存储位置
- Hive建立在Hadoop之上,所有Hive数据都是存储在HDFS中的,而数据库则可以将数据保存在块设备或者本地文件系统中。
7.数据更新
- 由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据。
8.索引
- Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。
9.执行
- Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。
10.执行延迟
- Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
11.可扩展性
- 由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。
12.数据规模
- 由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
2.hive的安装
-
文档查看:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
-
github地址:https://github.com/apache/hive
-
安装部署:
1.上传tar.gz包 2.解压:tar -zxvf apache-hive-2.3.1-bin.tar.gz 3.mv apache-hive-2.3.1-bin hive-2.3.1 4.拷贝配置:cp hive-env.sh.template hive-env.sh 5.配置:vim hive-env.sh HADOOP_HOME=/opt/hdp/hadoop-2.8.5 export HIVE_AUX_JARS_PATH=/opt/hdp/hive-2.3.1/conf 6.配置mysql允许远程访问(见下面mysql安装) 7.配置conf下xml文件 [root@linux01 conf]# vim hive-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> # 配置连接mysql 地址 metastore表示远程连接的库 <value>jdbc:mysql://linux01:3306/metastore?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> # 配置账号 <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> # 配置密码 <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property> </configuration> 8.将jdbc的ymsql驱动包上传hive/lib里面 mysql-connector-java-5.1.39.jar 9.启动hive客户端: /opt/hdp/hive-2.3.1/bin/hive 如报错:FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeExcepti 解决: # hive-site.xml配置 <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> </property> # mysql删除注册metastore drop database metastore; # /opt/hdp/hive-2.3.1/bin下执行 schematool -dbType mysql -initSchema
hive连接方式2:
# 启动hive的jdbc客户端 /opt/hdp/hive-2.3.1/bin/beeline # 创建hive客户端连接 !connect jdbc:hive2://linux01:10000 # 输入用户名,密码
-
启动zookeeper
/opt/zookeeper-3.4.6/bin/zkServer.sh start /opt/zookeeper-3.4.6/conf/zoo.cfg
-
启动dfs
[root@linux01 sbin]# ./start-dfs.sh
-
hbase启动
start-hbase.sh
-
启动hive
hive
-
此时
http://linux01:50070/explorer.html
中会有hbase文件
3.mysql安装
-
采用rpm安装。
-
授权:
# 获取密码 grep 'temporary password' /var/log/mysqld.log # 登录 mysql -uroot -p生成的面膜 # 修改管理员密码: set global validate_password_policy=0 set global validate_password_length=4 SET PASSWORD = PASSWORD('你的密码') # 设置远程登录权限 grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
- 在不知道root密码下更改root密码操作:适用5.7以上mysql
1.关闭mysql服务:systemctl stop mysqld 2.配置my.conf 增加 skip-grant-tables 3.启动mysql服务: systemctl start mysqld 4.进入mysql: mysql -uroot 5.关键点来了,更改密码 use mysql; update user set authentication_string=password('root') where user="root" 6.退出mysql 7.关闭mysql:systemctl stop mysqld 8.关闭配置:vim my.conf 注释掉下面一行 skip-grant-tables 9.重启mysql:systemctl start mysqld
4.hive与数据库命令
-
hive创建一个表
create table tb_user(id int,name string); # 默认表会存储在hdfs中 /user/hive/warehouse/tb_user
-
hive创建一个数据库
create database demo; # 默认数据库存储在hdfs中 /user/hive/warehouse/demo.db
-
查询库
show databases like "demo*";
-
详细查看库
desc database extended demo_1;
-
更改库参数
alter database demo_1 set dbproperites("author"="xujunkai");
-
切换数据
use demo
-
查看正在被使用数据库
select current_database();
-
展示数据库所有表
show tables;
-
查看表结构
desc 表名; desc formatted 表名;# 详细表结构
-
向表中插入数据(一般不会用它插入数据)
insert into tb_user values(1, "wangming",22); # 当执行完插入数据执行:show tables; # 会多显示如下信息 values__tmp__table__1 # 代表插入的数据进入临时表中,重启后,会消失。
-
查询数据
select * from tb_user;
-
退出客户端
quit;
-
删除数据库 强制删除
drop database demo cascade;
5.基本设置+删除数据库
-
hive -help查看帮助如下:
-d,--define <key=value> Variable substitution to apply to Hive commands. e.g. -d A=B or --define A=B --database <databasename> Specify the database to use -e <quoted-query-string> SQL from command line -f <filename> SQL from files -H,--help Print help information --hiveconf <property=value> Use value for given property --hivevar <key=value> Variable substitution to apply to Hive commands. e.g. --hivevar A=B -i <filename> Initialization SQL file -S,--silent Silent mode in interactive shell -v,--verbose Verbose mode (echo executed SQL to the console)
-
-e
用法# 不用进到交互模式,操作数据库 hive - e "use demo; select * from tb_user;" > data.res
-
-f
用法# 使用hive 执行sql脚本 hive -f my.sql
-
存储在hdfs路径配置
# 1./opt/hdp/hive-2.3.1/conf 下: cp hive-default.xml.template hive-default.xml # 2.修改默认数据仓库原始位置 <property> <name>hive.metastore.warehouse.dir</name> <!--用户名--> <value>/user/hive/warehouse</value> <description>location of default database for the warehouse</description> </property> # 3.配置同组用户有执行权限 bin/hdfs dfs -chmod g+w /user/hive/warehourse
-
hive-site.xml 文件添加配置信息,可以实现显示当前数据库,一级查询表的头
<property> <name>hive.cli.print.header</name> <value>true</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property>
6. Hive 运行 日志信息配置
-
Hive 的log默认存放在/tmp/root/hive.log目录下(当前用户名下)
-
修改hive的log存放日志到/opt/module/hive/logs
# /opt/hdp/hive-2.3.1/conf目录下: mv hive-log4j2.properties.template hive-log4j2.properties # vim hive-log4j2.properties 修改:property.hive.log.dir = /opt/hdp/hive-2.3.1/logs
7.创建表加载本地数据到表中
-
本地准备数据
/data/user.txt
1 Tom 2 Jerry 3 Lucy 4 Li 5 James
-
创建表
0: jdbc:hive2://linux01:10000>create table tb_user(id int , name string)row format delimited fields terminated by "\t";
-
加载数据
# 加载本地数据,(local表示本地数据) load data local inpath "/data/user.txt" into table tb_user; # 加载hdfs数据load到表中 load data inpath "/data/user.txt" into table tb_user;
create table tb_user(id int , name string)row format delimited fields terminated by "\t";
8.Hive创建表
-
创建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] -- 字段解释说明 (1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。 (2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。 (3)COMMENT:为表和列添加注释。 (4)PARTITIONED BY创建分区表 (5)CLUSTERED BY创建分桶表 (6)SORTED BY不常用 (7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)] 用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。 SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。 (8)STORED AS指定存储文件类型 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件) 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。 (9)LOCATION :指定表在HDFS上的存储位置。 (10)LIKE允许用户复制现有的表结构,但是不复制数据。
-
Hive的最底层也事mapreduce,最终达到效果是为了提高查询效率。
PARTITIONED
代表分区,CLUSTERED
代表分桶:
分区:分区是将文件放到不同文件夹上
分桶:分桶是将不同数据存到不同文件上
10.Hive内部表和外部表
-
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
-
区别:
1.内部表数据由Hive自身管理,外部表数据由HDFS管理 2.内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里) 3.删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除 4.对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复
11 yarn配置
-
/opt/hdp/hadoop-2.8.5/etc/hadoop
下执行cp mapred-site.xml.template mapred-site.xml
-
vim mapred-site.xml
配置如下<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
/opt/hdp/hadoop-2.8.5/etc/hadoop
,接着修改配置文件 yarn-site.xml:<configuration> <!-- 主节点所在机器 --> <property> <name>yarn.resourcemanager.hostname</name> <value>linux01</value> </property> <!-- 为mr程序提供shuffle服务 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 一台NodeManager的总可用内存资源 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property> <!-- 一台NodeManager的总可用(逻辑)cpu核数 --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>2</value> </property> <!-- 是否检查容器的虚拟内存使用超标情况 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 容器的虚拟内存使用上限:与物理内存的比率 --> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>2.1</value> </property> </configuration>
-
启动yarn
./sbin/start-yarn.sh # 启动YARN ./sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况
11 mysqlJob for mysqld.service failed because the control process exited with error code问题
-
vim /var/log/mysqld.log
2021-01-31T03:02:08.174208Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory 2021-01-31T03:02:08.488448Z 0 [Note] InnoDB: Buffer pool(s) load completed at 210131 11:02:08 2021-01-31T03:02:09.174919Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
-
发现没有
/var/run/mysqld/mysqld.pid
文件mkdir -p /var/run/mysqld/ touch /var/run/mysqld/mysqld.pid chown mysql.mysql /var/run/mysqld chown mysql.mysql /var/run/mysql/mysqld.pid
-
systemctl start mysqld
即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库