Hive介绍
- Hive的官方定义:
Apache Hive 数据仓库软件支持使用SQL读取、写入和管理驻留在分布式存储中的大型数据集。
结构可以投影到已经存储的数据上。提供了一个命令行工具和JDBC驱动程序来将用户连接到Hive。 - Hive是一个数据仓库基础设施工具,用于在Hadoop中处理结构化数据。
它位于Hadoop之上,可以对大数据进行汇总,便于查询和分析。所以需要Hadoop的HDFS和Yarn组件 - Hive三个不是:
a. 不是关系数据库
b. 不是联机事务处理(OLTP)的设计:ACID (事务管理)
c. 不是一种用于实时查询和行级更新的语言 - Hive的特点:
它将模式存储在关系型数据库(Mysql)中,并将数据处理到HDFS中;
它是为OLAP(联机分析处理)设计的,实时要求行不高,处理量大
它提供了用于查询的SQL类型语言,称为HiveQL或HQL。
它易用、快速、可伸缩和可扩展。
Hive的工作流程
- 执行查询 (Execute Query)
Hive接口(比如命令行或Web UI)向驱动程序(任何数据库驱动程序,如JDBC、ODBC等)发送查询以执行。
简单来讲就是发送我们写的SQL语句 - 获得逻辑计划(Get Plan)
驱动程序借助查询编译器对查询进行解析,以检查查询的语法和查询计划或查询的需求。
比如说: select * from table1 where age> 20;
首先去找table1表看看是否存在该表,再看看 * 代表着什么,最后判断一下where这个条件是否满足 - 得到元数据(Get Metadata)
编译器向Metastore(任何数据库)发送元数据请求 - 发送元数据(Send Metadata)
Metastore将元数据作为响应发送给编译器。 - 发送物理计划(Send Plan)
编译器检查需求并将计划重新发送给驱动程序。至此,查询的解析和编译已经完成 - 执行计划(Execute Plan)
==驱动程序将执行计划发送到执行引擎 == - 执行作业(Execute Job)
在内部,执行作业的过程是一个MapReduce作业。
执行引擎将作业发送到名称节点中的JobTracker,并将此作业分配给数据节点中的TaskTracker。这里,查询执行MapReduce作业。 - 元数据的操作 7.1(Metadata Ops)
同时,在执行过程中,执行引擎可以使用Metastore执行元数据操作 - 数字8:获取结果(Fetch Result)
执行引擎从数据节点接收结果。 - 数字9::加载结果(Send Results)
执行引擎将这些结果值发送给驱动程序 - 数字10:加载结果(Send Results)
驱动程序将结果发送到Hive接口
Hive安装部署
- 前提:
已经安装了Hadoop,集群可用 - 复制下载好的Hive安装包到一个节点上(我的版本1.2.1)
例如我的:cp /mnt/hgfs/share/tools/apache-hive/apache-hive-1.2.1-bin.tar.gz ~/soft
- 解压
命令语句:tar -zxvf apache-hive-1.2.1-bin.tar.gz ~/soft
- 创建软连接
命令语句:ln -s apache-hive-1.2.1-bin/ hive
- 修改环境变量
命令语句:gedit ~/.bash_profile
追加:
#注:dragon为我的用户名,要修改
export HIVE_HOME=/home/dragon/soft/hive
export PATH=$HIVE_HOME/bin:$PATH
记得修改完之后:source ~/.bash_profile
- 修改配置文件
$>cd $HIVE_HOME/conf
【进入到hive的配置文件中】
$>cp hive-env.sh.template hive-env.sh
$>gedit hive-env.sh
#打开HADOOP_HOME属性
HADOOP_HOME=/home/dragon/soft/hadoop
$>cp hive-default.xml.template hive-site.xml
$>gedit hive-site.xml
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/dragon/tmp/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>
- 开启Hadoop集群
$>zkServer.sh start
(在zookeeper集群中分别开启)
$>start-dfs.sh
$>start-yarn.sh
- 进入Hive客户端
$>hive
hive>show databases; //查看当前数据库
hive>use default; //使用default数据库
hive>show tables; //查看当前default数据库中的表
遇到的异常
- 先是报出处于安全模式状态,之后我离开安全模式,异常解决:
命令语句:$>hdfs dfsadmin -safemode leave#离开安全模式状态
- 第二个异常:Caused by: java.net.URISyntaxException: Relative path in absolute URI: KaTeX parse error: Expected '}', got 'EOF' at end of input: …a.io.tmpdir%7D/%7Bsystem:user.name%7D
//异常中的一部分:
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at java.net.URI.checkPath(URI.java:1804)
at java.net.URI.<init>(URI.java:752)
at org.apache.hadoop.fs.Path.initialize(Path.java:202)
... 11 more
修改了以下属性:
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/dragon/tmp/hive/local</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/dragon/tmp/hive/resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
- 在向表中插入数据时,报出异常3:java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.
仔细查看!!!yarn的配置文件的属性是否配错了,
yarn.resourcemanager.hostname 主节点的值,我的是master
mapreduce.framework.name属性值为yarn ,用于执行MapReduce作业的运行时框架,【我的是这个出错了】
Query ID = dragon_20190821132956_892c2a90-cc4c-43d7-a141-dcba57bb15a8
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
java.io.IOException: Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.
at org.apache.hadoop.mapreduce.Cluster.initialize(Cluster.java:120)
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:82)
at org.apache.hadoop.mapreduce.Cluster.<init>(Cluster.java:75)
at org.apache.hadoop.mapred.JobClient.init(JobClient.java:475)
at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:454)
at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:401)
at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:137)
at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:160)
at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:88)
at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1653)
at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1412)
at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1195)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1059)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1049)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:213)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:165)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376)
at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:736)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Job Submission failed with exception 'java.io.IOException(Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.)'
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask