Hive介绍

  1. Hive的官方定义:
    Apache Hive 数据仓库软件支持使用SQL读取、写入和管理驻留在分布式存储中的大型数据集
    结构可以投影到已经存储的数据上。提供了一个命令行工具JDBC驱动程序来将用户连接到Hive。
  2. Hive是一个数据仓库基础设施工具,用于在Hadoop中处理结构化数据
    位于Hadoop之上,可以对大数据进行汇总,便于查询和分析。所以需要Hadoop的HDFS和Yarn组件
  3. Hive三个不是:
    a. 不是关系数据库
    b. 不是联机事务处理(OLTP)的设计:ACID (事务管理)
    c. 不是一种用于实时查询和行级更新的语言
  4. Hive的特点:
    它将模式存储在关系型数据库(Mysql)中,并将数据处理到HDFS中;
    它是为OLAP(联机分析处理)设计的,实时要求行不高,处理量大
    它提供了用于查询的SQL类型语言,称为HiveQL或HQL
    它易用、快速、可伸缩和可扩展。

Hive的工作流程

datax显示数据写入成功 hive表无数据_apache

  1. 执行查询 (Execute Query)
    Hive接口(比如命令行或Web UI)向驱动程序(任何数据库驱动程序,如JDBC、ODBC等)发送查询以执行
    简单来讲就是发送我们写的SQL语句
  2. 获得逻辑计划(Get Plan)
    驱动程序借助查询编译器对查询进行解析,以检查查询的语法和查询计划或查询的需求
    比如说: select * from table1 where age> 20;
    首先去找table1表看看是否存在该表,再看看 * 代表着什么,最后判断一下where这个条件是否满足
  3. 得到元数据(Get Metadata)
    编译器向Metastore(任何数据库)发送元数据请求
  4. 发送元数据(Send Metadata)
    Metastore将元数据作为响应发送给编译器。
  5. 发送物理计划(Send Plan)
    编译器检查需求并将计划重新发送给驱动程序。至此,查询的解析和编译已经完成
  6. 执行计划(Execute Plan)
    ==驱动程序将执行计划发送到执行引擎 ==
  7. 执行作业(Execute Job)
    在内部,执行作业的过程是一个MapReduce作业
    执行引擎将作业发送到名称节点中的JobTracker,并将此作业分配给数据节点中的TaskTracker。这里,查询执行MapReduce作业。
  8. 元数据的操作 7.1(Metadata Ops)
    同时,在执行过程中,执行引擎可以使用Metastore执行元数据操作
  9. 数字8:获取结果(Fetch Result)
    执行引擎从数据节点接收结果
  10. 数字9::加载结果(Send Results)
    执行引擎将这些结果值发送给驱动程序
  11. 数字10:加载结果(Send Results)
    驱动程序将结果发送到Hive接口

Hive安装部署

  1. 前提
    已经安装了Hadoop,集群可用
  2. 复制下载好的Hive安装包到一个节点上(我的版本1.2.1)
    例如我的:cp /mnt/hgfs/share/tools/apache-hive/apache-hive-1.2.1-bin.tar.gz ~/soft
  3. 解压
    命令语句:tar -zxvf apache-hive-1.2.1-bin.tar.gz ~/soft
  4. 创建软连接
    命令语句:ln -s apache-hive-1.2.1-bin/ hive
  5. 修改环境变量
    命令语句:gedit ~/.bash_profile 追加:
#注:dragon为我的用户名,要修改
	export HIVE_HOME=/home/dragon/soft/hive
	export PATH=$HIVE_HOME/bin:$PATH

记得修改完之后:source ~/.bash_profile

  1. 修改配置文件
    $>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>
  1. 开启Hadoop集群
    $>zkServer.sh start (在zookeeper集群中分别开启)
    $>start-dfs.sh $>start-yarn.sh
  2. 进入Hive客户端
    $>hive hive>show databases; //查看当前数据库
    hive>use default; //使用default数据库
    hive>show tables; //查看当前default数据库中的表

遇到的异常

  1. 先是报出处于安全模式状态,之后我离开安全模式,异常解决:
    命令语句:$>hdfs dfsadmin -safemode leave#离开安全模式状态
  2. 第二个异常: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>
  1. 在向表中插入数据时,报出异常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