Hadoop补充+hive

目录

 Yarn资源调度器

Yarn常用命令

 Yarn调度器和调度算法

Yarn的Tool接口案例

生产调优手册

NameNode并发配置

开启回收站配置

HDFS—集群压测

HDFS-多目录

NameNode多目录配置 

DataNode多目录配置

集群数据均衡之磁盘间数据均衡

HDFS—集群扩容及缩容

添加白名单

服役新服务器

服务器间数据均衡

黑名单退役服务器

 HDFS—存储优化

纠删码

异构存储(冷热数据分离)

HDFS—故障排除

集群安全模式

小文件归档

Hive


 Yarn资源调度器

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。

Yarn基础架构

  YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

1) ResourceManager (RM) 主要作用如下
(1)处理客户端请求
(2)监控NodeManager
(3)启动或监控Appl icationMaster
(4)资源的分配与调度

2) NodeManager (NM) 主要作用如下
(1)管理单个节点上的资源
(2)处理来自ResourceMan age的命令
(3)处理来自ApplicationNMaster的命令

3) ApplicationMaster (AM)作用如下
(1)为应用程序申请资源并分合内部的任务
(2)任务的监控与容错

4) Container
Container(容器)是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、 磁盘、网络等。

Yarn工作机制

(1)MR程序提交到客户端所在的节点。

(2)YarnRunner向ResourceManager申请一个Application。

(3)RM将该应用程序的资源路径返回给YarnRunner。

(4)该程序将运行所需资源提交到HDFS上。

(5)程序资源提交完毕后,申请运行mrAppMaster。

(6)RM将用户的请求初始化成一个Task。

(7)其中一个NodeManager领取到Task任务。

(8)该NodeManager创建容器Container,并产生MRAppmaster。

(9)Container从HDFS上拷贝资源到本地。

(10)MRAppmaster向RM 申请运行MapTask资源。

(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。

(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。

(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask

(14)ReduceTask向MapTask获取相应分区的数据。

(15)程序运行完毕后,MR会向RM申请注销自己。

Yarn常用命令

并用Yarn命令查看任务运行情况。

[atguigu@hadoop102 hadoop-3.1.3]$ myhadoop.sh start

列出所有Application:

[atguigu@hadoop102 hadoop-3.1.3]$ yarn application -list

根据Application状态过滤:yarn application -list -appStates (所有状态:ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)[atguigu@hadoop102 hadoop-3.1.3]$ yarn application -list -appStates FINISHED (查看以完成任务)

Kill掉Application:

[atguigu@hadoop102 hadoop-3.1.3]$ yarn application -kill application_1612577921195_0001

yarn logs查看日志

(1)查询Application日志:yarn logs -applicationId <ApplicationId>

[atguigu@hadoop102 hadoop-3.1.3]$ yarn logs -applicationId application_1612577921195_0001

(2)查询Container日志:yarn logs -applicationId <ApplicationId> -containerId <ContainerId>//任务在发生异常,可以查看容器发生什么异常

[atguigu@hadoop102 hadoop-3.1.3]$ yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001 (可以在  yarn applicationattempt -list <ApplicationId>  命令中查看容器id)

yarn applicationattempt查看尝试运行的任务

(1)列出所有Application尝试的列表:yarn applicationattempt -list <ApplicationId>

(2)打印ApplicationAttemp状态:yarn applicationattempt -status <ApplicationAttemptId>(尝试提交的任务的id)

yarn container查看容器

(1)列出所有Container:yarn container -list <ApplicationAttemptId>

(只有在运行的时候可以查看,任务结束之后会立即释放容器)

(2)打印Container状态: yarn container -status <ContainerId>

 yarn node查看节点状态

列出所有节点:yarn node -list -all 

 yarn rmadmin更新配置

加载队列配置:yarn rmadmin -refreshQueues

yarn queue查看队列

打印队列信息:yarn queue -status <QueueName>

容量调度器多队列提交

1)在生产环境创建队列方法

(1)调度器默认就1个default队列,不能满足生产要求。

(2)按照框架:hive /spark/ flink 每个框架的任务放入指定的队列(企业用的不是特别多)

(3)按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2

创建多队列好处:

防止出现递归死循环代码,把所有资源全部耗尽。

实现任务的降级使用,特殊时期保证重要的任务队列资源充足。

 Yarn调度器和调度算法

目前,Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.1.3默认的资源调度器是Capacity Scheduler,CDH 默认是公平。

先进先出调度器(FIFO)

FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。

优点:简单易懂;  缺点:不支持多队列,生产环境很少使用;

容量调度器(Capacity Scheduler)

Capacity Scheduler是Yahoo开发的多用户调度器。

容器调度器的特点:

(1)多队列:每个队列可配置一定的资源量 ,每个队列采用FIFO调度策略。
(2)容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
(3)灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一-旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(4)多租户:支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

容器资源分配算法:

1、队列资源分配:从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源。
2、作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源。
3、容器资源分配:按照容器的优先级分配资源;如果优先级相同,按照数据本地性原则:
(1)任务和数据在同一节点。
(2)任务和数据在同一机架。
(3)任务和数据不在同一节点也不在同机架。

公平调度器(Fair Scheduler)

Fair Schedulere是Facebook开发的多用户调度器。
(1) 多队列:支持多队列多作业
(2)容量保证:管理员可为每个队列设置资源最低保证和资源使用上线
(3)灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(4)多租户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

2)与容量调度器不同点
(1) 核心调度策略不同
容量调度器:优先选择资源利用率低的队列
公平调度器:优先选择对资源的缺额比例大的

(2)每个队列可以单独设置资源分配方式
容量调度器: FIFO、 DRF
公平调度器: FIFO、 FAIRLDRF

公平调度器设计目标是:在时间尺度上,所有作业获得公平的资源。某一时刻一一个作业应获资源和实际获取资源的差距叫“缺额"调度器会优先为缺额大的作业分配资源

公平调度器队列资源分配方式:

1) FIFO策略
公平调度器每个队列资源分配策略如果选择FIFO的话,此时公平调度器相当于上面讲过的容量调度器。
2) Fair策略CPU
Far策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。

3)DRF策略:不但一考虑内存,而是分析内存,网络宽带,CPU等不同资源,对不同应用进行不同资源(CPU和内存)的一个不同比例限制。

Yarn的Tool接口案例

package com.atguigu.yarn;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;

import java.io.IOException;

public class WordCount implements Tool {
    //核心方法 (conf 需要传进来)
    private  Configuration conf;
    @Override
    public int run(String[] args) throws Exception {
        Job job = Job.getInstance(conf);
        job.setJarByClass(WordCountDriver.class);

        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        FileInputFormat.setInputPaths(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));

        return job.waitForCompletion(true)? 0 : 1;
    }

    @Override
    public void setConf(Configuration conf) {
          this.conf=conf;
    }

    @Override
    public Configuration getConf() {
        return conf;
    }


    //mapper
    public static  class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable>{
         private  Text outK = new Text();
         private  IntWritable outV = new IntWritable(1);
        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            //ss cls
            //1、获取一行信息
            String line = value.toString();

            //2、切割
            String[] words = line.split(" ");

            //3、循环遍历结束
            for (String word : words) {
                outK.set(word);
                context.write(outK,outV);

            }
        }
    }

    //reducer
    public static class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable>
    {    private IntWritable outV = new IntWritable();
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
           int sum =0;
            for (IntWritable value : values) {
                sum+=value.get();
            }
            outV.set(sum);
            context.write(key,outV);
        }
    }
}
package com.atguigu.yarn;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.util.Arrays;

public class WordCountDriver {

    private static Tool tool;

    public static void main(String[] args) throws Exception {
        //创建配置信息;

        Configuration conf = new Configuration();
        switch (args[0]){

            case "wordcount":
                tool = new WordCount();
                break;
            default:
                throw new RuntimeException("no such tool"+ args[0]);

        }

     //执行程序
       int run = ToolRunner.run(conf,tool, Arrays.copyOfRange(args,1,args.length));

        System.exit(run);
    }
}

生产调优手册

 NameNode内存生产配置:

NameNode内存计算

每个文件块大概占用150byte,一台服务器128G内存为例,能存储9.1亿个文件块

128 * 1024 * 1024 * 1024  / 150Byte ≈  9.1亿

G  MB KB  Byte

hadoop102上的NameNode和DataNode占用内存都是自动分配的,且相等。不是很合理。

可在 hadoop-env.sh中修改内存配置

export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"

jmap -heap + 进程号 查看NameNode,DataNode占用内存

NameNode并发配置

NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是10。

可在hdfs-site.xml中配置

企业经验:dfs.namenode.handler.count=20*loge(集群规模),比如集群规模(DataNode台数)为3台时,此参数设置为21。

开启回收站配置

参数解析:

(1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。

(2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

(3)要求fs.trash.checkpoint.interval <= fs.trash.interval。

1、通过网页上直接删除的文件不会走回收站。

2、通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站

Trash trash = New Trash(conf);

trash.moveToTrash(path);

3、只有在命令行利用hadoop fs -rm命令删除的文件才会走回收站。 hadoop fs -mv +回收站文件路径

HDFS—集群压测

HDFS的读写性能主要受网络和磁盘影响比较大。

100Mbps单位是bit;10M/s单位是byte ; 1byte=8bit,100Mbps/8=12.5M/s。

测试参数:

  • Number of files生成mapTask数量一般是集群中CPU核数-1),我们测试虚拟机就按照实际的物理内存-1分配即可
  • Total MBytes processed:单个map处理的文件大小
  • Throughput mb/sec:单个mapTak的吞吐量 

  计算方式:处理的总文件大小/每一个mapTask写数据的时间累加

   集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量

  • Average IO rate mb/sec::平均mapTak的吞吐量

计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间

     全部相加除以task数量

  • IO rate std deviation:方差、反映各个mapTask处理的差值,越小越均衡

如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数。

HDFS-多目录
NameNode多目录配置 

NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性

在hdfs-site.xml文件中添加如下内容(配置两个NameNode)

<property>

     <name>dfs.namenode.name.dir</name>

     <value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value> 

</property>

DataNode多目录配置

DataNode可以配置成多个目录,每个目录存储的数据不一样(数据不是D副本)

在hdfs-site.xml文件中添加如下内容(配置两个DataNode)

<property>

     <name>dfs.datanode.data.dir</name>

     <value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>

</property>

集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性)

(1)生成均衡计划(需要有多块硬盘)

hdfs diskbalancer -plan hadoop103

(2)执行均衡计划

hdfs diskbalancer -execute hadoop103.plan.json

(3)查看当前均衡任务的执行情况

hdfs diskbalancer -query hadoop103

(4)取消均衡任务

hdfs diskbalancer -cancel hadoop103.plan.json

HDFS—集群扩容及缩容
添加白名单

白名单:表示在白名单的主机IP地址可以访问服务器,可以用来存储数据,不在白名单(在黑名单)上的虽然可以访问但是不能存储真实数据。企业中配置白名单,可以尽量防止黑客恶意访问攻击。

配置白名单步骤如下:

1)在NameNode节点的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和blacklist文件,写上白名单里面主机的IP地址,Hadoop102、Hadoop103

2)在hdfs-site.xml配置文件中增加dfs.hosts配置参数

<!-- 白名单 -->

<property>

     <name>dfs.hosts</name>

     <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>

</property>

3)分发配置文件whitelist,hdfs-site.xml

4)第一次添加白名单必须重启集群,不是第一次,只需要刷新NameNode节点即可

在web浏览器上查看DN,http://hadoop102:9870/上查看datanodes 只有Hadoop102,Hadoop103,并且在hadoop104上执行上传数据数据失败

服役新服务器

需求:随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。

环境准备:1、在hadoop100主机上再克隆一台hadoop105主机。2、修改IP地址和主机名称

[root@hadoop105 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

[root@hadoop105 ~]# vim /etc/hostname

3、拷贝hadoop102的/opt/module目录和/etc/profile.d/my_env.sh到hadoop105(java和Hadoop)

4、删除hadoop105上Hadoop的历史数据,data和log数据

5、配置hadoop102和hadoop103到hadoop105的ssh无密登录

[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop105

[atguigu@hadoop103 .ssh]$ ssh-copy-id hadoop105

直接启动DataNode

[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode

[atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager

即可关联到集群,在白名单中增加新服役的服务器,分发,刷新NameNode即可完成新服务器配置,在http://hadoop102:9870/上查看datanodes已经有Hadoop105。

服务器间数据均衡

在企业开发中,如果经常在hadoop102和hadoop104上提交任务,且副本数为2,由于数据本地性原则,就会导致hadoop102和hadoop104数据过多,hadoop103存储的数据量小。另一种情况,就是新服役的服务器数据量比较少,需要执行集群均衡命令。

2)开启数据均衡命令:

[atguigu@hadoop105 hadoop-3.1.3]$ sbin/start-balancer.sh -threshold 10

对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。

3)停止数据均衡命令:

[atguigu@hadoop105 hadoop-3.1.3]$ sbin/stop-balancer.sh

黑名单退役服务器

黑名单:表示在黑名单的主机IP地址不可以,用来存储数据。在企业中配置黑名单,用来退役服务器。

与白名单设置步骤相同,在hdfs-site.xml配置文件中增加dfs.hosts配置参数

<!-- 黑名单 -->

<property>

     <name>dfs.hosts.exclude</name>

     <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>

</property>

分发刷新,在Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点,备份数据。最后手动停止该服务器集群。如果数据不均衡,可以用命令实现集群的再平衡

[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon stop datanode stopping datanode

[atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon stop nodemanager stopping nodemanager

 HDFS—存储优化

先准备5台虚拟机,克隆方式与之前相同,更改集群分发脚本,jpsall脚本,works文件,白/黑名单设置免密登录(ssh-copy-id hadoop106)等,删除原本的data,logs,格式化后启动集群。

遇到问题:当前定义的命令只存在/home/cool/bin目录下,故只有在当前目录下使用才有效

需要将其放入/bin目录下,以便全局调用

[wyc@hadoop102 bin]$ sudo cp xsync /bin/
纠删码

纠删码原理:

HDFS默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。Hadoop3.x引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间,但增加了计算成本,cpu占比较大,用计算换存储单元。

一个文件只有一个副本,将一个副本划分成数据单元和校验单元。

校验策略:

例:RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元,也就是说:这5个单元中,只要有任意的3个单元存在(不管是数据单元还是校验单元,只要总数=3),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576。

纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。默认只开启对RS-6-3-1024k策略的支持,如要使用别的策略需要提前启用。

纠删码案例实操

1、开启对RS-3-2-1024k策略的支持

[wyc@hadoop102 hadoop-3.1.3]$  hdfs ec -enablePolicy  -policy RS-3-2-1024k

Erasure coding policy RS-3-2-1024k is enabled

2、hdfs建立一个input目录,上传一个大于2mb的文件到input,查看五台服务器分别存储的是什么单元,删除两个副本块可以在hdfs重新下载,删除超过三个则会下载失败。

异构存储(冷热数据分离)

构存储主要解决,不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。

关于存储类型:
RAM_ DISK: ( 内存镜像文件系统)
SSD: (SSD固 态硬盘)
DISK:(普通磁盘,在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK)
ARCHIVE:(没有特指哪种存储介质,主要的指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题,一般用于归档 )

策略块分布:

策略块分布
Lazy_PersistRAM_DISK: 1, DISK: n-1
All_SSDSSD: n
One_SSDSSD: 1, DISK: n-1
Hot(HDFS默认的存储策略)DISK: n
WarmDISK: 1, ARCHIVE: n-1
ColdARCHIVE: n

异构存储Shell操作

(1)查看当前有哪些存储策略可以用

[wyc@hadoop102 hadoop-3.1.3]$ hdfs storagepolicies -listPolicies

(2)为指定路径(数据存储目录)设置指定的存储策略

hdfs storagepolicies -setStoragePolicy -path xxx -policy xxx

(3)获取指定路径(数据存储目录或文件)的存储策略

hdfs storagepolicies -getStoragePolicy -path xxx

(4)取消存储策略;执行改命令之后该目录或者文件,以其上级的目录为准,如果是根目录,那么就是HOT

hdfs storagepolicies -unsetStoragePolicy -path xxx

(5)查看文件块的分布

bin/hdfs fsck xxx -files -blocks -locations

(6)查看集群节点

hadoop dfsadmin -report

HDFS—故障排除

NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode

问题解决

(1)拷贝SecondaryNameNode中数据到原NameNode存储数据目录

[wyc@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/

(2)重新启动NameNode

[w'y'c@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode

集群安全模式

1)安全模式:文件系统只接受读数据请求,而不接受删除、修改等变更请求

2)进入安全模式场景

     NameNode在加载镜像文件和编辑日志期间处于安全模式。

     NameNode再接收DataNode注册时,处于安全模式。

退出安全模式条件

dfs.namenode.safemode.min.datanodes:最小可用datanode数量,默认0,至少得有一个datanode块。

dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,默认0.999f。(只允许丢一个块,否则就进入安全模式)

dfs.namenode.safemode.extension:稳定时间,默认值30000毫秒,即30秒之后退出安全模式。

小文件归档

每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效。因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如,一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘空间,而不是128MB。

2)解决存储小文件办法之一

HDFS存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体说来,HDFS存档文件对内还是一个一个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存。

相关命令:

(3)查看归档

[wyc@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /output/input.har

[wyc@hadoop102 hadoop-3.1.3]$ hadoop fs -ls har:///output/input.har

(4)解归档文件

[wyc@hadoop102 hadoop-3.1.3]$ hadoop fs -cp har:///output/input.har/*    /

Hive

hive概述

1、hive简介
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并
提供类 SQL 查询功能。

2、Hive 本质:将 HQL 转化成 MapReduce 程序 。
Hive是相当于Hadoop的一个分析的客户端,将SQL通过Hive框架匹配出相应的MapRedue模板生成 jar 包,最后提交到yarn执行程序。(hive是一个客户端没有集群)

Hive 处理的数据存储在 HDFS
Hive 分析数据底层的实现是 MapReduce
执行程序运行在 Yarn 上

2、hive优点:

(1)操作接口采用类 SQL 语法,简单、容易上手。

(2)避免了去写 MapReduce,减少开发人员的学习成本。

(3)Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。

(4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较

高。

(5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点:

1)Hive 的 HQL 表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长,由于 MapReduce 数据处理流程的限制,效率更高的算法却

无法实现。

2)Hive 的效率比较低

(1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化

(2)Hive 调优比较困难。

3、Hive主要架构:

1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第

三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL

语义是否有误。

2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。

3)优化器(Query Optimizer):对逻辑执行计划进行优化。

4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive就是 MR/Spark

4、Hive 和数据库比较

(1)Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language)。

(2)Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中

不建议对数据的改写,所有的数据都是在加载的时候确定好的。

(3)Hive 查询数据时延迟较高,数据库的执行延迟较低。

(4)由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模

的数据;对应的,数据库可以支持的数据规模较小。

Hive 常用交互命令

1)退出 hive 窗口:

hive(default)>exit;

hive(default)>quit;

2)在 hive cli 命令窗口中如何查看 hdfs 文件系统

hive(default)>dfs -ls /;

3)查看在 hive 中输入的所有历史命令

(1)进入到当前用户的根目录 /root 或/home/atguigu

(2)查看. hivehistory 文件

[atguig2u@hadoop102 ~]$ cat .hivehistory

Hive 数据类型
Java 数据类型
TINYINT
byte
SMALINT
short
INT
int
BIGINT
long
BOOLEAN
boolean
FLOAT
float
DOUBLE
double
STRING
string
TIMESTAMP
时间类型
BINARY
字节类型

集合数据类型

Hive 有三种复杂数据类型 ARRAY MAP STRUCT ARRAY MAP Java 中的 Array
Map 类似,而 STRUCT C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据
类型允许任意层次的嵌套。

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值