Hive是基于Hadoop平台的数仓工具,具有海量数据存储、水平可扩展、离线批量处理的优点,解决了传统关系型数仓不能支持海量数据存储、水平可扩展性差等问题,但是由于Hive数据存储和数据处理是依赖于HDFS和MapReduce,因此在Hive进行数据离线批量处理时,需将查询语言先转换成MR任务,由MR批量处理返回结果,所以Hive没法满足数据实时查询分析的需求。
Hive是由FaceBook研发并开源,当时FaceBook使用Oracle作为数仓,由于数据量越来越大,Oracle数仓性能越来越差,没法实现海量数据的离线批量分析,因此基于Hadoop研发Hive,并开源给Apacha。
由于Hive不能实现数据实时查询交互,Hbase可提供实时在线查询能力,因此Hive和Hbase形成了良性互补。Hbase因为其海量数据存储、水平扩展、批量数据处理等优点,也得到了广泛应用。
Pig与HIVE工具类似,都可以用类sql语言对数据进行处理。但是他们应用场景有区别,Pig用于数据仓库数据的ETL,HIVE用于数仓数据分析。
从架构图当中,可看出Hive并没有完成数据的存储和处理,它是由HDFS完成数据存储,MR完成数据处理,其只是提供了用户查询语言的能力。Hive支持类sql语言,这种SQL称为Hivesql。用户可用Hivesql语言查询,其驱动可将Hivesql语言转换成MR任务,完成数据处理。
Hive的访问接口
CLI:是hive提供的命令行工具
HWI:是Hive的web访问接口
JDBC/ODBC:是两种的标准的应用程序编程访问接口
Thrift Server:提供异构语言,进行远程RPC调用Hive的能力。
因此Hiv具备丰富的访问接口能力,几乎能满足各种开发应用场景需求。
Driver
是HIVE比较核心的驱动模块,包含编译器、优化器、执行器,职责为把用户输入的Hivesql转换成MR数据处理任务
Metastore
是HIVE的元数据存储模块,数据的访问和查找,必须要先访问元数据。Hive中的元数据一般使用单独的关系型数据库存储,常用的是Mysql,为了确保高可用,Mysql元数据库还需主备部署。
架构图上面Karmasphere、Hue、Qubole也是访问HIVE的工具,其中Qubole可远程访问HIVE,相当于HIVE作为一种公有云服务,用户可通过互联网访问Hive服务。
Hive在使用过程中出现了一些不稳定问题,由此发展出了Hive HA机制,
这个错误通常表示 Hive 文件系统无法打开,可能是由于以下原因之一:
文件系统没有正确配置。请检查文件系统的配置是否正确,并确保 Hive 可以正确访问文件系统。
文件系统权限问题。请确保 Hive 能够访问文件系统,并且具有足够的权限读取和写入数据。
文件系统中的文件出现了问题。请检查文件系统中的文件是否存在或已损坏,并尝试修复或重新创建文件。
为了解决这个问题,可以尝试以下方法:
检查文件系统的配置。请确保文件系统已正确配置,并确保 Hive 可以正确访问文件系统。可以通过检查 Hive 的日志文件来查看是否有任何文件系统访问错误。
检查文件系统的权限。请确保 Hive 可以访问文件系统,并且具有足够的权限读取和写入数据。可以通过检查文件系统的权限来查看是否为当前用户提供了足够的访问权限。
检查文件系统中的文件。请确保文件系统中的文件存在并且没有损坏。可以尝试重新创建文件或从备份中恢复文件。
hive文件存储格式包括以下几类:
1、TEXTFILE
2、SEQUENCEFILE
3、RCFILE
4、ORCFILE(011以后出现)
其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;
SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。
前提创建环境:
hive 08
创建一张testfile_table表,格式为textfile。
create table if not exists testfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by '\t' stored as textfile;
load data local inpath '/app/weibotxt' overwrite into table textfile_table;
一、TEXTFILE
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,
从而无法对数据进行并行 *** 作。
示例:
create table if not exists textfile_table(
site string,
url string,
pv bigint,
label string)
row format delimited
fields terminated by '\t'stored as textfile;
插入数据 *** 作:set hiveexeccompressoutput=true;
set mapredoutputcompress=true;
set mapredoutputcompressioncodec=orgapachehadoopiocompressGzipCodec;
set iocompressioncodecs=orgapachehadoopiocompressGzipCodec;
insert overwrite table textfile_table select from textfile_table;
二、SEQUENCEFILE
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。
示例:
create table if not exists seqfile_table(
site string,
url string,
pv bigint,
label string)
row format delimited
fields terminated by '\t'stored as sequencefile;
插入数据 *** 作:set hiveexeccompressoutput=true;
set mapredoutputcompress=true;
set mapredoutputcompressioncodec=orgapachehadoopiocompressGzipCodec;
set iocompressioncodecs=orgapachehadoopiocompressGzipCodec;
SET mapredoutputcompressiontype=BLOCK;insert overwrite table seqfile_table select from textfile_table;
三、RCFILE
RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
RCFILE文件示例:
create table if not exists rcfile_table(
site string,
url string,
pv bigint,
label string)
row format delimited
fields terminated by '\t'stored as rcfile;
插入数据 *** 作:set hiveexeccompressoutput=true;
set mapredoutputcompress=true;
set mapredoutputcompressioncodec=orgapachehadoopiocompressGzipCodec;
set iocompressioncodecs=orgapachehadoopiocompressGzipCodec;
insert overwrite table rcfile_table select from textfile_table;
四、ORCFILE()
五、再看TEXTFILE、SEQUENCEFILE、RCFILE三种文件的存储情况:
[hadoop@node3 ~]$ hadoop dfs -dus /user/hive/warehouse/hdfs://node1:19000/user/hive/warehouse/hbase_table_1 0
hdfs://node1:19000/user/hive/warehouse/hbase_table_2 0
hdfs://node1:19000/user/hive/warehouse/orcfile_table 0
hdfs://node1:19000/user/hive/warehouse/rcfile_table 102638073
hdfs://node1:19000/user/hive/warehouse/seqfile_table 112497695
hdfs://node1:19000/user/hive/warehouse/testfile_table 536799616
hdfs://node1:19000/user/hive/warehouse/textfile_table 107308067
[hadoop@node3 ~]$ hadoop dfs -ls /user/hive/warehouse//-rw-r--r-- 2 hadoop supergroup 51328177 2014-03-20 00:42 /user/hive/warehouse/rcfile_table/000000_0-rw-r--r-- 2 hadoop supergroup 51309896 2014-03-20 00:43 /user/hive/warehouse/rcfile_table/000001_0-rw-r--r-- 2 hadoop supergroup 56263711 2014-03-20 01:20 /user/hive/warehouse/seqfile_table/000000_0-rw-r--r-- 2 hadoop supergroup 56233984 2014-03-20 01:21 /user/hive/warehouse/seqfile_table/000001_0-rw-r--r-- 2 hadoop supergroup 536799616 2014-03-19 23:15 /user/hive/warehouse/testfile_table/weibotxt-rw-r--r-- 2 hadoop supergroup 53659758 2014-03-19 23:24 /user/hive/warehouse/textfile_table/000000_0gz-rw-r--r-- 2 hadoop supergroup 53648309 2014-03-19 23:26 /user/hive/warehouse/textfile_table/000001_1gz
总结:
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。
数仓面试高频考点:
在Hive中如何解析小文件过多问题,指定的是:处理表中数据时,有很多小文件
| Table Parameters: | NULL | NULL |
| | bucketing_version | 2 |
| | numFiles | 1 |
| | numRows | 0 |
| | rawDataSize | 0 |
| | totalSize | 656 |
| | transient_lastDdlTime | 1631525001 |
如果没有显示表的统计信息,执行如下命令,再次查看表信息
ANALYZE TABLE db_hiveemp COMPUTE STATISTICS;
| Table Parameters: | NULL | NULL |
| | COLUMN_STATS_ACCURATE | {"BASIC_STATS":"true"} |
| | bucketing_version | 2 |
| | numFiles | 1 |
| | numRows | 14 |
| | rawDataSize | 643 |
| | totalSize | 656 |
| | transient_lastDdlTime | 1655113125 |
| | NULL | NULL |
第一种,将小文件合并成一个大文件
第二种,使用SparkContext中提供: wholeTextFiles 方法,专门读取小文件数据。
将每个文件作为一条KV存储在RDD中, K:文件名的绝对路径,V:文件的内容
用于解决小文件的问题,可以将多个小文件变成多个KV,自由指定分区个数
将存放在excel表中的数据如何导入到hive中,首先前提是excel表中数据类型以及长度要和hive仓库中表的字段属性一致,否则会报异常。其次因为建表的时候,已经定义了表的分割符号(row format delimited fields terminated by ‘,’),所以不能直接将excel表格中数据导入的hive仓库中。处理方式如下:
先将excel表中数据另存转化为datacsv格式,转化为csv格式的文件默认就是用“,”进行分割的,可以用notepad++打开datacsv格式查看。然后再讲数据导入到hive仓库中即可。但是执行如下导入语句时,发现报错,显示Wrong file format。
检查以后发现,因为在创建表格时,使用的是RCFILE存储格式
STORED AS INPUTFORMAT 'orgapachehadoophiveqlioRCFileInputFormat'
OUTPUTFORMAT 'orgapachehadoophiveqlioRCFileOutputFormat'
而导入到是TextFile文件格式,所以报错,解决办法建表的格式默认使用TextFile格式即可。
如何将文件转化为rcfile文件格式:
(1)hive 中直接 通过textfile表进行insert转换,比如通过如下将textfile数据导入到rcfile中。
insert overwrite table >
打开hive
debug日志
这个比较基本,也很容易 *** 作。出问题时先打开,兴许有些有用的信息。另外我们自己的udf或serde里也可以输出些debug日志,方便定位问题:
hive
-hiveconf
hiverootlogger=debug,console
explain
即在hql前加上explain,比如
explain
select
from
不过这个在查错误的时候用处不大,我还没用它定位到什么bug。不过在查一些性能问题,或者查看下hive到mr任务的执行过程时会用得着
查看planxml
先得说下hive的执行过程。大体上是这样的:
hive
客户端(一般是hive
cli,入口类为clidriver)把hql翻译成mr执行计划(operator树)并序列化到
planxml
planxml
上传到hdfs上
hive
客户端新起一进程,提交mapreduce程序,其入口类为execdriver,execdriver的mapper会在setup阶段读取planxml,反序列化成operator树结构,然后执行。
所以planxml精确的描述了mr程序具体的执行过程,而且xml文件层次清楚,比explain输出更丰富的信息,也很易读。mr执行计划很少出问题,但我们可以借助planxml排除一些怀疑会出问题的点,比如确认是翻译阶段的问题,还是mr执行阶段的问题。
曾经有一次定位udf使用的bug,最开始怀疑是hive生成mr执行计划出错了,但通过查看planxml,我们确认翻译阶段没问题。进而开始使用终极手段来看问题:ide远程debug,单步跟踪,这个我们稍后说。
查看planxml的方法,有点trick。hive
cli在生成
planxml时,会打印日志:
generating
plan
file
/planxml
但hive
任务执行完毕时,会把它删掉。所以你得手快,或者想办法让hql跑的时间长点,比如sleep一下之类。如果有什么参数可以让hive不删plan文件,留言给我,
先行谢过。
hive
CREATE TABLE IF NOT EXISTS `test_01`(
`id` int,`name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
CREATE external TABLE IF NOT EXISTS `test_02`(
`id` int, `name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
vi /home/hadoop/share/mydata/hive/scoretxt
内容如下:
1,'zhang',20,120
2,'zhao',19,119
3,'qian',18,118
4,'li',21,121
vi /home/hadoop/share/mydata/hive/score02txt
内容如下:
5,'wang',20,120
6,'zhou',19,119
7,'wu',18,118
8,'hu',21,121
load data local inpath '/home/hadoop/share/mydata/hive/scoretxt' overwrite into table test_01;
load data local inpath '/home/hadoop/share/mydata/hive/scoretxt' overwrite into table test_02;
select from test_01;
select from test_02;
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_01
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02
hadoop fs -cat /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_01/scoretxt
hadoop fs -cat /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02/scoretxt
drop table test_01;
drop table test_02;
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb
CREATE TABLE IF NOT EXISTS `test_01`(
`id` int,`name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
CREATE external TABLE IF NOT EXISTS `test_02`(
`id` int, `name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
select from test_01;
select from test_02;
load data local inpath '/home/hadoop/share/mydata/hive/score02txt' overwrite into table test_01;
load data local inpath '/home/hadoop/share/mydata/hive/score02txt' overwrite into table test_02;
select from test_01;
select from test_02;
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_01
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02
hadoop fs -cat /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02/
注意没有用overwrite
load data local inpath '/home/hadoop/share/mydata/hive/score02txt' into table test_02;
hadoop fs -cat /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02/
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02
注意这次用overwrite
load data local inpath '/home/hadoop/share/mydata/hive/score02txt' overwrite into table test_02;
select from test_02;
hadoop fs -ls /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02
hadoop fs -cat /mylab/soft/apache-hive-312-bin/working/metastorewarehouse/testdbdb/test_02/
不指明类型的情况下,HIVE会默认新建的表为内部表,外部表需要使用external关键字。
当我们删除外部表时,删除的只是元数据,存储数据仍被保留。当我们删除内部表时,元数据和存储数据都被删除。
使用load data *** 作的时候,不管是外部表还是内部表,如果源数据存在于HDFS层,都是数据的移动。即源数据从HDFS存储路径移动到HIVE数据仓库默认路径。
使用load data *** 作的时候,要是使用了overwrite,则情况原来的文件,生成正在load的文件,要是没有用overwrite,则在原来的基础上,增加新加载的文件,要是有重名,hive会自动补足成唯一的文件名
>
以上就是关于程序中的Hive具体是干什么用的呢全部的内容,包括:程序中的Hive具体是干什么用的呢、Error+opening+hive+file+system.hive什么意思、hive的几种文件格式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)