当前位置: 首页 > news >正文

关于加强网站建设的建议临沂中小企业网站制作

关于加强网站建设的建议,临沂中小企业网站制作,假冒建设银行网站,wdcp 网站备份目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一#xff1a;insert overwrite (推荐) 3.2.2 方式二#xff1a;concatenate 3.2.3 方式三#xff…目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一insert overwrite (推荐) 3.2.2 方式二concatenate 3.2.3 方式三使用hive的archive归档 3.2.4 方式四hadoop getmerge 一、小文件产生的原因 数据源本身就包含大量的小文件例如api,kafka消息管道等。动态分区插入数据的时候会产生大量的小文件从而导致map数量剧增reduce 数量越多小文件也越多小文件数量ReduceTask数量*分区数hive中的小文件是向 hive 表中导入数据时产生 向 hive 中导入数据的几种方式: 1直接向表中插入数据 insert into table t_order2 values (1,zhangsan,88),(2,lisi,61); 这种方式每次插入时都会产生一个小文件多次插入少量数据就会出现多个小文件故这种方式生产环境基本不使用 2通过load方式加载数据 -- 导入文件 load data local inpath /opt/module/hive_data/t_order.txt overwrite into table t_order; -- 导入文件夹 load data local inpath /opt/module/hive_data/t_order overwrite into table t_order; 使用 load方式可以导入文件或文件夹当导入一个文件时hive表就有一个文件当导入文件夹时hive表的文件数量为文件夹下所有文件的数量 3通过查询方式加载数据 insert overwrite t_order select oid,uid from t_order2 这种方式是生产环境中经常用的也是最容易产生小文件的方式。insert 导入数据时会启动MR任务MR-reduce的个数与输出文件个数一致。 因此hdfs的文件数量  reduceTask数量* 分区数有些fetch本地抓取任务例如简单的 select * from tableA仅有map阶段那此时文件个数 mapTask数量*分区数 二、小文件的危害 小文件通常是指文件大小要比HDFS块大小一般是128M还要小很多的文件。 NameNode在内存中维护整个文件系统的元数据镜像、其中每个HDFS文件元数据信息位置、大小、分块等对象约占150字节如果小文件过多会占用大量内存会直接影响NameNode性能。相对的HDFS读写小文件也会更加耗时因为每次都需要从NameNode获取元信息并与对应的DataNode建立pipeline连接。 从 Hive 角度看一个小文件会开启一个 MapTask一个 MapTask开一个 JVM 去执行这些任务的启动及初始化会浪费大量的资源严重影响性能。 三、小文件的解决方案 小文件的解决思路主要有两个方向1.小文件的预防2.已存在的小文件合并 3.1 小文件的预防 通过调整参数进行合并在 hive 中执行 insert overwrite  tableA select xx  from tableB 之前设置如下合并参数即可自动合并小文件。 3.1.1 减少Map数量 设置map输入时的合并参数 #执行Map前进行小文件合并 #CombineHiveInputFormat底层是 Hadoop的 CombineFileInputFormat 方法 #此方法是在mapper中将多个文件合成一个split切片作为输入 set hive.input.formatorg.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 默认#每个Map最大的输入大小(这个值决定了合并后文件的数量) set mapred.max.split.size256*1000*100; -- 256M #一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并) set mapred.min.split.size.per.node100*100*100; -- 100M #一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并) set mapred.min.split.size.per.rack100*100*100; -- 100M 设置map输出时和reduce输出时的合并参数 #设置map端输出进行合并默认为true set hive.merge.mapfiles true; #设置reduce端输出进行合并默认为false set hive.merge.mapredfiles true; #设置合并文件的大小 set hive.merge.size.per.task 256*1000*1000; -- 256M #当输出文件的平均大小小于该值时启动一个独立的MapReduce任务进行文件merge set hive.merge.smallfiles.avgsize16000000; -- 16M 启用压缩小文件合并后也可以选择启用压缩 # hive的查询结果输出是否进行压缩 set hive.exec.compress.outputtrue; # MapReduce Job的结果输出是否使用压缩 set mapreduce.output.fileoutputformat.compresstrue; #设置压缩方式是snappy set parquet.compression snappy;3.1.2 减少Reduce的数量 #reduce的个数决定了输出的文件的个数所以可以调整reduce的个数控制hive表的文件数量 #通过设置reduce的数量利用distribute by使得数据均衡的进入每个reduce。 #设置reduce的数量有两种方式第一种是直接设置reduce个数 set mapreduce.job.reduces10;#第二种是设置每个reduceTask的大小Hive会根据数据总大小猜测确定一个reduce个数 set hive.exec.reducers.bytes.per.reducer512*1000*1000; -- 默认是1G这里为设置为5G#执行以下语句将数据均衡的分配到reduce中 set mapreduce.job.reduces10;insert overwrite table A partition(dt) select * from B distribute by cast(rand()*10 as int);解释如设置reduce数量为10则使用cast(rand()*10 as int)生成0-10之间的随机整数根据【随机整数 % 10】计算分区编号这样数据就会均衡的分发到各reduce中防止出现有的文件过大或过小 3.2 已存在的小文件合并 对集群上已存在的小文件进行定时或实时的合并操作定时操作可在访问低峰期操作如凌晨2点合并操作主要有以下几种方式 3.2.1 方式一insert overwrite (推荐) 执行流程总体如下 1创建备份表创建备份表时需和原表的表结构一致 create table test.table_hive_back like test.table_hive ; 2设置合并文件相关参数并使用insert overwrite 语句读取原表再插入备份表 设置合并文件相关参数 使用 hive的merger合并参数在正式 insert overwrite 之前做一个合并合并的时候注意设置好压缩不然文件会比较大。 合并文件至备份表中执行前保证没有数据写入原表 #如果有多级分区将分区名放到partition中 insert overwrite table test.table_hive_back partition(batch_date) select * from test.table_hive;psinsert overwrite table test.table_hive_back 备份表的时候可以使用distribute by 命令设置合并后的batch_date分区下的文件数据量 insert overwrite table 目标表 [partition(hour...)] select * from 目标表 distribute by cast( rand() * 具体最后落地生成多少个文件数 as int); insert overwrite会重写数据先进行删除后插入不用担心如果overwrite失败数据没了这里面是有事务保障的; distribute by分区能控制数据从map端发往到哪个reduceTask中distribute by的分区规则分区字段的hashcode值对reduce 个数取模后 余数相同的数据会分发到同一个reduceTask中。 rand()函数生成0-1的随机小数控制最终输出多少个文件。 # 使用distribute by rand()将数据随机分配给reduce,这样可以使得每个reduce处理的数据大体一致。 避免出现有的文件特别大, 有的文件特别小例如控制dt分区目录下生成100个文件那么hsql如下 insert overwrite table A partition(dt)select * from B distribute by cast(rand()*100 as int);#cast(rand()*100 as int) 可以生成0-100的随机整数 如果合并之后的文件竟然还变大了可能是 select from的原数据是被压缩的但是insert overwrite目标表的时候没有设置输出文件压缩功能解决方案 # hive的查询结果输出是否进行压缩 set hive.exec.compress.outputtrue; # MapReduce Job的结果输出是否使用压缩 set mapreduce.output.fileoutputformat.compresstrue; #设置压缩方式是snappy set parquet.compression snappy;3确认表数据一致后将原表修改名称为临时表tmp将备份表修改名称为原表 先查看原表和备份表数据量确保表数据一致 #查看原表和备份表数据量 set hive.compute.query.using.statsfalse ; set hive.fetch.task.conversionnone; SELECT count(*) FROM test.table_hive; SELECT count(*) FROM test.table_hive_back ; 将原表修改名称为临时表tmp将备份表修改名称为原表 alter table test.table_hive rename to test.table_hive_tmp; alter table test.table_hive_back rename to test.table_hive ; 4查看合并后的分区数和小文件数量 正常情况下hdfs文件系统上的table_hive表的分区数量没有改变但是每个分区的几个小文件已经合并为一个文件。 #统计合并后的分区数 [atguigubigdata102 ~]$ hdfs dfs -ls /user/hive/warehouse/test/table_hive #统计合并后的分区数下的文件数 [atguigubigdata102 ~]$ hdfs dfs -ls /user/hive/warehouse/test/table_hive/batch_date20210608 例如 5观察一段时间后再删除临时表 drop table test.table_hive_tmp ;ps注意修改hive表名的时候对应表的存储路径会发生变化如果有新的任务上传数据到具体路径需要注意可能需要修改。 3.2.2 方式二concatenate 对于orc文件可以使用hive自带的 concatenate 命令自动合并小文件 #对于非分区表 alter table test concatenate;#对于分区表 alter table test [partition(...)] concatenate #例如alter table test partition(dt2021-05-07,hr12) concatenate; 注意  concatenate 命令只支持 rcfile和 orc文件类型。 concatenate命令合并小文件时不能指定合并后的文件数量但可以多次执行该命令。 当多次使用concatenate后文件数量不变化这个跟参数 mapreduce.input.fileinputformat.split.minsize256mb 的设置有关可设定每个文件的最小size。 3.2.3 方式三使用hive的archive归档 每日定时脚本对于已经产生小文件的hive表使用har归档然后已归档的分区不能insert overwrite 必须先unarchive #用来控制归档是否可用 set hive.archive.enabledtrue;#通知Hive在创建归档时是否可以设置父目录 set hive.archive.har.parentdir.settabletrue;#控制需要归档文件的大小 set har.partfile.size256000000;#对表的某个分区进行归档 alter table test_rownumber2 archive partition(dt20230324);#对已归档的分区恢复为原文件 alter table test_rownumber2 unarchive partition(dt20230324);3.2.4 方式四hadoop getmerge 对于txt格式的文件可以使用hadoop getmerge命令来合并小文件。使用 getmerge 命令先合并数据到本地再通过put命令回传数据到hdfs。 将hdfs上分区为pdate20220815文件路径为  /user/hive/warehouse/xxxx.db/xxxx/pdate20220815/* 下载到linux 本地进行合并文件本地路径为/home/hadoop/pdate/20220815          hadoop fs -getmerge  /user/hive/warehouse/xxxx.db/xxxx/pdate20220815/*  /home/hadoop/pdate/20220815;  将hdfs源分区数据删除         hadoop fs -rm  /user/hive/warehouse/xxxx.db/xxxx/pdate20220815/* 在hdfs上新建分区       hadoop fs -mkdir -p /user/hive/warehouse/xxxx.db/xxxx/pdate20220815 将本地合并后的文件回传到hdfs上          hadoop fs -put  /home/hadoop/pdate/20220815  /user/hive/warehouse/xxxx.db/xxxx/pdate20220815/* 参考文章 HIVE中小文件问题_hive小文件产生的原因-CSDN博客 Hive教程09- 彻底解决小文件的问题-阿里云开发者社区 0704-5.16.2-如何使用Hive合并小文件-腾讯云开发者社区-腾讯云
http://www.tj-hxxt.cn/news/231824.html

相关文章:

  • 可以在手机建网站的南昌市建设监督网站站长
  • 可以转app的网站怎么做WordPress数据库搜索
  • 重庆铜梁网站建设费用系统开发需求怎么写
  • 中国空间站纪念币云相册网站怎么做的
  • 微网站和手机网站wordpress 两步认证
  • 四川智能网站建设制作保定建设信息网站
  • 个人做哪方面网站木马工业产品设计公司
  • 网站网页设计中怎么添加页码信息我买了一个域名怎么做网站
  • 手机怎么防止网站跳转python可以写网页吗
  • 互助网站制作公司商务网站建设过程中应对可能遇到的风险
  • 文化局网站建设方案平面设计课程简介
  • 购物网站的建设意义wordpress视频站插件
  • 佛山网站制作网页外贸网站知名做外链
  • 高权重网站 内页做跳转给新网站手机app应用制作
  • 网站制作广公司网站制作公
  • 免费flash网站源码网站怎么在微博推广
  • 海外网站空间免费1级做爰片免费网站
  • 网站搭建前景网站源代码购买
  • 哪里有html企业网站模板下载北京传媒公司排行榜
  • 怎么查看网站的外链众筹网站开发分析报告
  • 重庆綦江网站建设网站建设优化收费
  • 网站制作关键词教人做饮料的网站
  • 推广展示类网站百度小说排行榜2021
  • 河南映天建设网站网站改版建设原则
  • 网站内做二级目录做django后台网站
  • 关于学院网站建设的通知深圳sem竞价托管
  • 网站模板中企动力wordpress怎么给产品设置分类
  • 品牌策划与设计机构佛山搜索引擎优化
  • 外国网站建站小程序商城装修
  • 央企门户网站哪家做的最好公众号怎么做文章