zoukankan      html  css  js  c++  java
  • Hadoop、Hbase基本命令及调优方式

    HDFS基本命令

    接触大数据挺长时间了,项目刚刚上完线,趁着空闲时间整理下大数据hadoop、Hbase等常用命令以及各自的优化方式,当做是一个学习笔记吧。

    HDFS命令基本格式:Hadoop  fs  -cmd < args >

    ls 命令

    hadoop fs -ls /  列出hdfs文件系统根目录下的目录和文件

    hadoop fs -ls -R /  递归列出hdfs文件系统所有的目录和文件

    put 命令

    hadoop fs -put < local file > < hdfs file >  本地文件上传到HDFS

    hadoop fs -put < local file or dir >...< hdfs dir >  多个本地文件或目录上传到HDFS

    moveFromLocal 命令

    hadoop fs -moveFromLocal < local src > ... < hdfs dst > 与put相类似,命令执行后源文件local src 被删除,也可以从从键盘读取输入到hdfs file中

    copyFromLocal 命令

    hadoop fs -copyFromLocal < local src > ... < hdfs dst > 与put相类似,也可以从从键盘读取输入到hdfs file中

    get 命令

    hadoop fs -get < hdfs file > < local file or dir> local file不能和hdfs file名字不能相同,否则会提示文件已存在,没有重名的文件会复制到本地

    hadoop fs -get < hdfs file or dir > ... < local dir > 拷贝多个文件或目录到本地时,本地要为文件夹路径

    copyToLocal 命令

    hadoop fs -copyToLocal < local src > ... < hdfs dst > 与get相类似

    rm 命令

    hadoop fs -rm < hdfs file > ... hadoop fs -rm -r < hdfs dir>... 每次可以删除多个文件或目录

    mkdir 命令

    hadoop fs -mkdir < hdfs path>  只能一级一级的建目录,父目录不存在的话使用这个命令会报错hadoop fs -mkdir -p < hdfs path> 所创建的目录如果父目录不存在就创建该父目录

    cp 命令

    hadoop fs -cp < hdfs file > < hdfs file >  目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件还存在。

    hadoop fs -cp < hdfs file or dir >... < hdfs dir > 目标文件夹要存在,否则命令不能执行

    mv 命令

    hadoop fs -mv < hdfs file > < hdfs file > 目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件不存在hadoop fs -mv < hdfs file or dir >... < hdfs dir > 源路径有多个时,目标路径必须为目录,且必须存在。

    du 命令

    hadoop fs -du < hdsf path>

    显示hdfs对应路径下每个文件夹和文件的大小hadoop fs -du -s < hdsf path> 显示hdfs对应路径下所有文件和的大小hadoop fs -du -h < hdsf path>

    setrep 命令

    hadoop fs -setrep -R 3 < hdfs path > 改变一个文件在hdfs中的副本个数,上述命令中数字3为所设置的副本个数,-R选项可以对一个人目录下的所有目录+文件递归执行改变副本个数的操作

    tail 命令

    hadoop fs -tail < hdfs file > 在标准输出中显示文件末尾的1KB数据archive 命令

    hadoop archive -archiveName name.har -p < hdfs parent dir > < src >* < hdfs dst > 命令中参数。

    name:压缩文件名,自己任意取;< hdfs parent dir > :压缩文件所在的父目录;< src >:要压缩的文件名;< hdfs dst >:压缩文件存放路径,*示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des ,示例中将hdfs中/user目录下的文件1.txt,2.txt压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下,如果1.txt,2.txt不写就是将/user目录下所有的目录和文件压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下显示har的内容可以用如下命令:hadoop fs -ls /des/hadoop.jar 显示har压缩的是那些文件可以用如下命令hadoop fs -ls -R har:///des/hadoop.har

    JavaAPI访问HDFS

    FileSystem类主要方法:

    get(),create(),append(),listStatus(),copyFromLocal()

    HDFS日常管理

    安全模式

    ☆集群启动后处于安全模式,直到副本数满足阀值要求才退出

    ☆命令:Hadoop dfsadmin –safemode enter|leave|get|wait

    ☆只能浏览不能修改

    ☆通常在系统维护之前使用

    HDFS日常管理

    ☆集群基本信息报告:

    Hadoop dfsadmin –report

    ☆动态刷新

    host配置:hadoop dfsadmin –refreshNodes

    ☆节点间数据均衡:hadoop balancer

    ☆目录配额:hadoop dfsadmin -setQuota  文件个数

    hadoop dfsadmin – setSpaceQuota  空间大小

    HDFS日常管理-文件系统检查

    ☆命令:hadoop fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations -racks]]]

    <path>  检查这个目录中的文件是否完整

    -move 破损的文件移至/lost+found目录

    -delete删除破损的文件

    -openforwrite打印正在打开写操作的文件

    -files打印正在check的文件名

    -blocks打印block报告(需要和-files参数一起使用)

    -locations打印每个block的位置信息(需要和-files参数一起使用)

    -racks打印位置信息的网络拓扑图(需要和-files参数一起使用)

    HDFS调优

    ☆dfs.block.size

    建议512MB,太小的blocksize会增加NameNode负担

    ☆dfs.namenode.handler.count

    根据CPU数和内存数设置,推荐100,较大的值可提升文件处理吞吐量

    ☆dfs.datanode.handler.count DataNode

    的接收和发送数据的处理线程数,推荐200,受磁盘繁忙情况制约

    ☆dfs.data.dir DataNode

    存储Block文件的目录,设置为多个可提升DataNode吞吐量,多目录以逗号分割

    ☆dfs.heartbeat.interval和heartbeat.recheck.interval

    DN与NN心跳间隔,计算公式:timeout  = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

    ☆dfs.datanode.max.xcievers DataNode

    可同时处理的最大文件数

    ☆io.file.buffer.size

    读写缓冲区大小,通常设置为65536以上,可减少IO次数

    ☆io.bytes.per.checksum

    每校验码所校验的字节数,默认512字节,不要超过io.file.buffer.size

    HBase

    Rowkey设计原则

    •长度原则

    –Rowkey最长64kb。以byte[]存储,建议rowkey越短越好,不要超过16字节

    •散列原则

    –加盐

    –哈希

    –反转

    –时间戳反转

    •唯一原则,rowKey必须保证唯一

    参数优化

    处理线程优化

    增加handler个数

    参数hbase.regionserver.handler.count配置的是region server开启的处理对用户表的请求的线程个数,默认值是10。设置该值的原则是:如果每个请求的负载达到MB,如大的put,scan caching设置很大的scan,那么保持该值比较小;否则,如果负载小,如get,小的put,increment,delete,把该值设大。

    缓冲大小

    hfile.block.cache.size

    regionserver cache的大小,默认是0.2,是整个堆内存的多少比例作为regionserver的cache,调大该值会提升查询性能,当然也不能过大,如果我们的hbase基本都是大量的查询,写入不是很多的话,调到0.5也就够了,说到这个值,有一个地方需要说明一下,如果生产环境有mapred任务去scan hbase的时候,一些要在mapred scan类中加一个scan.setCacheBlocks(false),避免由于mapred使用regionserver的cache都被替换,造成hbase的查询性能明显下降。

    Memstore

    hbase.hregion.memstore.flush.size

    一个regionserver的单个region memstore的大小,默认是64M,在hbase结构中,一个regionserver管理多个region,一个region对应一个hlog和多个store,一个store对应多个storefile和一个memstore,这里的hbase.hregion.memstore.flush.size意思是一个region下面的所有store里面的memstore的达到多少时,开始将这些memstore flush到hdfs中去,配置这个值,需要参考一下,平均每个regionserver管理的region数量,如果每台regionsever管理的region不多的话,可以适当的调大该值,如512M时再flush。

    hbase.regionserver.global.memstore.upperLimit/hbase.regionserver.global.me

    mstore.lowerLimit

    配置一台regionserver所有memstore占整个堆的最大比例,默认是0.4/0.35,二个值的差异在于是做局部的flush,还是全部flush,如果我们的regionserver日志中,频发出现因为超过hbase.regionserver.global.memstore.lowerLimit而做flush的信息,我觉得有必要调小hbase.hregion.memstore.flush.size,或者适当调大这二个值,当然hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和不能大于1,到0.8我觉得已经够大了。如果我们的jvm内存回收是使用cms的话,有一个值CMSInitiatingOccupancyFraction(内存使用到时多少时,一始cms回收内存)的大小和觉得和这个有关系,略小于hbase.regionserver.global.memstore.upperLimit和hfile.block.cache.size的和是一个不错的选择。

    Compaction

    hbase.hstore.compactionThreshold/hbase.hregion.majorcompaction

    hbase.hstore.compactionThreshold执行compaction的store数量,默认值是3,如果需要提高查询性能,当然是storefile的数量越小,性能越好,但是执行compaction本身有性能资源的开消,如果regionserver频繁在compacion对性能影响也很大。hbase.hregion.majorcompaction表示majorcompaction的周期,默认是1 天,majorcompaction与普通的compaction的区别是majorcompaction会清除过期的历史版本数据,同时合并storefile,而普通的compaction只做合并,通常都是majorcompaction,调为0,然后手工定期的去执行一下majorcompaction,适当调小点compacionThreshold。

    Region

    hbase.hregion.max.filesize

    配置region大小,0.94.12版本默认是10G,region的大小与集群支持的总数据量有关系,如果总数据量小,则单个region太大,不利于并行的数据处理,如果集群需支持的总数据量比较大,region太小,则会导致region的个数过多,导致region的管理等成本过高,如果一个RS配置的磁盘总量为3T*12=36T数据量,数据复制3份,则一台RS服务器可以存储10T的数据,如果每个region最大为10G,则最多1000个region,如此看,94.12的这个默认配置还是比较合适的,不过如果要自己管理split,则应该调大该值,并且在建表时规划好region数量和rowkey设计,进行region预建,做到一定时间内,每个region的数据大小在一定的数据量之下,当发现有大的region,或者需要对整个表进行region扩充时再进行split操作,一般提供在线服务的hbase集群均会弃用hbase的自动split,转而自己管理split。

  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/10158wsj/p/8428321.html
Copyright © 2011-2022 走看看