需要在进群里面单独申请一块SSD(硬盘)
dfs.name.dir、dfs.namenode.name.dir一个是本地的,把原数据做一个冗余,数据本身是有三个冗余的,而原数据本身是没有冗余的,所以一个指定本地,一个指定网路磁盘,进行冗余
RAID1是逻辑上的算法或者概念,RAID磁盘阵列,RAID1的意思就是镜像盘,
Cluster
集群储存是通过将数据分布到集群中各节点的存储方式,提供单一的使用接口与界面,使用户可以方便地对所有数据进行统一使用与管理。
Hot swap
用户可以再不关闭系统,不切断电源的情况下取出和更换硬盘,提高系统的恢复能力、拓展性和灵活性。
热插拔,就好像一台电脑,当前的硬盘坏了,然后插上另一块硬盘,这两个硬盘里面的内容是一样的。
Raid0
Raid0是所有raid中存储性能最强的阵列形式。其工作原理就是在多个磁盘上分散存取连续的数据,这样,当需要存取数据是多个磁盘可以并排执行,每个磁盘执行属于它自己的那部分数据请求,显著提高磁盘整体存取性能。但是不具备容错能力,适用于低成本、低可靠性的台式系统。
Raid1
又称镜像盘,把一个磁盘的数据镜像到另一个磁盘上,采用镜像容错来提高可靠性,具有raid中最高的数据冗余能力。存数据时会将数据同时写入镜像盘内,读取数据则只从工作盘读出。发生故障时,系统将从镜像盘读取数据,然后再恢复工作盘正确数据。这种阵列方式可靠性极高,但是其容量会减去一半。广泛用于数据要求极严的应用场合,如商业金融、档案管理等领域。只允许一颗硬盘出故障。
Raid0+1
将Raid0和Raid1技术结合在一起,兼顾两者的优势。在数据得到保障的同时,还能提供较强的存储性能。不过至少要求4个或以上的硬盘,但也只允许一个磁盘出错。是一种三高技术。
Raid5
Raid5可以看成是Raid0+1的低成本方案。采用循环偶校验独立存取的阵列方式。将数据和相对应的奇偶校验信息分布存储到组成RAID5的各个磁盘上。当其中一个磁盘数据发生损坏后,利用剩下的磁盘和相应的奇偶校验信息 重新恢复/生成丢失的数据而不影响数据的可用性。至少需要3个或以上的硬盘。适用于大数据量的操作。成本稍高、储存新强、可靠性强的阵列方式。
RAID还有其他方式,请自行查阅。
最安全的是Raid1,这种存储方案比较增加成本,两个硬盘一模一样的数据,冗余出来4
如果日志没有足够的空间的话,就会把之前老的日志覆盖掉。
买显卡的时候,评价一个显卡的标准是什么?很多人会说是显存,其实不是,是位宽,尾矿的意思是,同一单位时间内,能够处理的图像数据的个数,就相当于马路的宽度一样,停车场再大,将显存比喻为停车场,停车场再大,马路很窄,意味着同一时间内走过的车辆是很小的,也就是同一时间走过的数据流是很小的,即吞吐量。
相同的显存的显卡,比如都是2g的显存,一个是64位位宽的,一个是256位位宽的,他们的价格有时候能够差到一万多,显卡追求显存没有用,一般玩游戏2g的显存就够了,但是位宽很小的话,单位时间传输的不够,fps还是很小的,会很卡。
打个比方,浏览网页,还没浏览到后面已经加载完了。
$ sudo blockdev --setra 32768 /dev/sda
(尖叫提示:ra是readahead的缩写)
这里操作的是sda这块硬盘
sudo blockdev 按tab键会有很多的提示
$ sudo blockdev --getra /dev/sda 查看是否修改成功
$ sudo sysctl -w vm.swappiness=0
想设置的大一点的,不要大于10。
在linux里面如果有一个进程现在处于不活跃的状态,就会让他变成一个挂起的状态,睡眠,但是这个进程没有被杀死,还是会占用系统资源的。
上面这句话后面的数字如果是0的话,表示,后面不允许任何进程的挂起,如果不用了,就杀掉,释放资源,如果设置为567等数字,意思就是允许挂起的数量是多少。
设置linux允许的最大进程数和最大文件数
DataNode可能会访问多个文件,因为一个很大的文件可能分在很多的文件中进行存储,如果DataNode访问的达到了linux的上限,就会导致我想要访问,但是却访问不了了。
ResourceManager开了很多任务,现在进程数达到了linux的限制,任务就开不起来了。
$ ulimit -n 查看允许最大进程数
$ ulimit -u 查看允许打开最大文件数
修改:
$ sudo vi /etc/security/limits.conf 修改打开文件数限制
末尾添加:
* soft nofile 1024000
* hard nofile 1024000
Hive - nofile 1024000
hive - nproc 1024000
*的意思是所有用户,hive的意思是hive用户
$ sudo vi /etc/security/limits.d/20-nproc.conf 修改用户打开进程数限制
修改为:
#* soft nproc 4096
#root soft nproc unlimited
* soft nproc 40960
root soft nproc unlimited
unlimited是无限
保存退出之后需要重启机器,否则不会生效。
一般而言,集群中的第一台机器,每过一段时间,将自己的系统时间跟网络同步一次,剩下的所有机器的时间都跟第一台机器同步。
一定不要升级,如果要升级,可以找另一台机器,升级看看有没有问题,测试一段时间稳定了之后,在把生产环境的进行升级。
哪里用到了rpc调用? DataNode 需要存储数据的时候需要和 NameNode 进行通信,这个通信的过程就是rpc的过程
属性:dfs.namenode.handler.count
解释:该属性是NameNode服务默认线程数,的默认值是10,根据机器的可用内存可以调整为50~100
属性:dfs.datanode.handler.count
解释:该属性默认值为10,是DataNode的处理线程数,如果HDFS客户端程序读写请求比较多,可以调高到1520,设置的值越大,内存消耗越多,不要调整的过高,一般业务中,510即可。
一个NameNode对多个DataNode
一个DataNode对一个DataNode
所以DataNode可以设置的小一点
这两个配置都不能设置的过高,设置的过高的话,可能会因为某一次业务的暴增,把服务器拖死。
属性:dfs.replication
解释:如果数据量巨大,且不是非常之重要,可以调整为23,如果数据非常之重要,可以调整为35。
很少见备份超过两个的。
属性:dfs.blocksize
默认128m
解释:块大小定义,该属性应该根据存储的大量的单个文件大小来设置,如果大量的单个文件都小于100M,建议设置成64M块大小,对于大于100M或者达到GB的这种情况,建议设置成256M,一般设置范围波动在64M~256M之间。
设置何时的块大小,是为了更快的寻址,如果设置的块过大的话,需要过多的寻址,影响性能。
mapreduce.jobtracker.handler.count
该属性是Job任务线程数,默认值是10,根据机器的可用内存可以调整为50~100
当前的MapReduce任务一共有几个线程可以去跑,一个线程跑Map,一个线程跑Reduce,如果一个线程跑两个map,只能放到队列里面了,不能同时操作
属性:mapreduce.tasktracker.http.threads
解释:定义HTTP服务器工作线程数,默认值为40,对于大集群可以调整到80~100
属性:mapreduce.task.io.sort.factor
解释:文件排序时同时合并的数据流的数量,这也定义了同时打开文件的个数,默认值为10,如果调高该参数,可以明显减少磁盘IO,即减少文件读取的次数。
能够同时操作的文件的数量,设置大了效率高,效率高,但是开销大。
属性:mapreduce.map.speculative
解释:该属性可以设置任务是否可以并发执行,如果任务多而小,该属性设置为true可以明显加快任务执行效率,但是对于延迟非常高的任务,建议改为false,这就类似于迅雷下载。
假如下载电影,电影都是一个十分钟,就需要并发下载,但是如果是蓝光的10g的电影,如果并发下载的话,详看其中的一个都要等很久,所以,小文件开并发,大文件不开并发。
属性:mapreduce.map.output.compress、mapreduce.output.fileoutputformat.compress
解释:对于大集群而言,建议设置Map-Reduce的输出为压缩的数据,而对于小集群,则不需要。
20台一下的集群,几乎是不需要开的,但是很多小企业都开,用snappy压缩,这个不是官方自带的,需要自己集成一个开发工具包,snappy的压缩比是25%到40%,也就是说原来的文件大小乘25%或者40%是被压缩掉了
属性:
mapreduce.tasktracker.map.tasks.maximum
mapreduce.tasktracker.reduce.tasks.maximum
解释:以上两个属性分别为一个单独的Job任务可以同时运行的Map和Reduce的数量。
设置上面两个参数时,需要考虑CPU核数、磁盘和内存容量。假设一个8核的CPU,业务内容非常消耗CPU,那么可以设置map数量为4,如果该业务不是特别消耗CPU类型的,那么可以设置map数量为40,reduce数量为20。这些参数的值修改完成之后,一定要观察是否有较长等待的任务,如果有的话,可以减少数量以加快任务执行,如果设置一个很大的值,会引起大量的上下文切换,以及内存与磁盘之间的数据交换,这里没有标准的配置数值,需要根据业务和硬件配置以及经验来做出选择。
在同一时刻,不要同时运行太多的MapReduce,这样会消耗过多的内存,任务会执行的非常缓慢,我们需要根据CPU核数,内存容量设置一个MR任务并发的最大值,使固定数据量的任务完全加载到内存中,避免频繁的内存和磁盘数据交换,从而降低磁盘IO,提高性能。
大概配比:
大概估算公式:
map = 2 + ⅔cpu_core
reduce = 2 + ⅓cpu_core
文件已经写在HDFS上面之后,能不能在不增加文件的基础上,直接在此文件的后面追加内容?
不是不允许追加内容么?没错,请看背景故事:
早期的HDFS系统是不支持添加操作的,如果文件一旦被关闭了,就认为这个文件已经上传完成了,不能再改变了,如果文件没有被成功的关闭,这个文件就像从来没有存在过一样,写过的数据还在,没写的数据就没有了,就认为这是一个坏的块,就扔掉了,
第一次支持HDFS追加操作是在0.15版本。
HDFS不支持随机添加,只支持从末尾添加
这个追加的功能对HBase有什么好处?
HBase需要频繁的对数据进行写入操作,如果每次写入都生成一个新的文件的话,必定会加大开销,所以这个功能完美的解决了这个问题。
属性:dfs.support.append
文件:hdfs-site.xml、hbase-site.xml
解释:开启HDFS追加同步,可以优秀的配合HBase的数据同步和持久化。默认值为true。
属性:dfs.datanode.max.transfer.threads
文件:hdfs-site.xml
解释:HBase一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为4096或者更高。默认值:4096
注意这里设置的是一个DataNode允许打开的最大文件数,之前设置的是linux允许允许打开的最大文件数,为什么linux的设置的很大,这里只能设置很小?因为在linux中不是一个DataNode。
属性:dfs.image.transfer.timeout
文件:hdfs-site.xml
解释:如果对于某一次数据操作来讲,延迟非常高,socket需要等待更长的时间,建议把该值设置为更大的值(默认60000毫秒),以确保socket不会被timeout掉。
jvm在进行gc操作的时候RegionServer是不可用的,虽然只有几毫秒,但是假设现在RegionServer中有一个非常非常大的region,垃圾回收一次需要大量的时间,比如是五秒,也就意味着RegoinServer五秒钟之内没办法工作,只能等待gc完成,RegionServer在不能工作的状态下,是不能和zookeeper相互通信的,HMaster去zookeeper中找RegionServer,找不到,认为RegionServer死掉了,可是RegionServer明明还是可用的。
还有当前的region要分配给另外一个RegoinServer管理的时候,也会涉及到数据的传输,如果太的的话也会相应超时,也会没有挂掉,但是被认为挂掉了。
所以把上面配置的时间调的大一点
属性:
mapreduce.map.output.compress
mapreduce.map.output.compress.codec
文件:mapred-site.xml
解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec
mapreduce.map.output.compress,map这个过程输出的文件进行压缩,压缩完之后再给reduce,传输的效率会很高,往磁盘里面写的速度也会提高
mapreduce.map.output.compress.codec ,通过gzip的的方式压缩map输出的文件
属性:dfs.datanode.failed.volumes.tolerated
文件:hdfs-site.xml
解释:默认为0,意思是当DataNode中有一个磁盘出现故障,则会认为该DataNode shutdown了。如果修改为1,则一个磁盘出现故障时,数据会被复制到其他正常的DataNode上,当前的DataNode继续工作。
假如DataNode中有三个数据块,如果当前客户端访问某个数据块的时候,数据块坏了,当时DataNode没有坏,就会认为DataNode挂了。
如果设置为1的话,就是当前的数据块挂掉就挂掉了,将挂掉的数据块中的数据复制到当前的DataNode的其他的数据块中,然后继续使用。
属性:hbase.regionserver.handler.count
文件:hbase-site.xml
解释:默认值为30,用于指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
如果单位时间内调用频发的话,可以改的高一点,但是不要太高,否则可能出现问题,比如急群众可能会出现日志文件的错误、数据文件的错误等错误,出现错误之后会自己大量的重试,大量的数据迁移,就会导致rpc的值上升,然后rpc又设置的特别高,就会导致一直到达不了阈值,性能容易被拖死。
属性:hbase.hregion.max.filesize
文件:hbase-site.xml
解释:默认值10737418240(10GB),如果需要运行HBase的MR任务,可以减小此值,因为一个region对应一个map任务,如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果HFile的大小达到这个数值,则这个region会被切分为两个Hfile。
就是store file,store file里面有Hfile,官网的描述是,如果Hfile如果到达10g的话就会分成两个,优化的方法是减小map任务的延迟,减小map任务的压力,一个region对应一个map任务,如果region10g的话,map任务处理的数据相当的打,需要减小值,比如1g。
不要把Hfile的分别和region的分裂搞混。一个RegionServer包含多个region,一个region包含多个Hfile。
属性:hbase.client.write.buffer
文件:hbase-site.xml
解释:用于指定HBase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的。默认2g,根据实际情况修改
客户端访问HBase的时候,第一次产生了一些数据流,然后缓存到客户端里,下次再访问的时候,直接就返回了。
属性:hbase.client.scanner.caching
文件:hbase-site.xml
解释:用于指定scan.next方法获取的默认行数,值越大,消耗内存越大。
扫描表的时候默认返回的行数,可能当前的表中有十几亿行,只返回默认的100多行,建议不要设置太大,容易消耗过多的内存,卡死。
HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。 但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~48G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。
涉及文件:hbase-env.sh
参数:-XX:+UseParallelGC
解释:开启并行GC
参数:-XX:ParallelGCThreads=cpu_core – 1
解释:该属性设置了同时处理垃圾回收的线程数。一般是cpu的核数减一
参数:-XX:DisableExplicitGC
解释:防止开发人员手动调用GC,GC会造成RegionServer短暂的不可用,不要开发人员去调度gc,HBase有自己的方式
参数:zookeeper.session.timeout
文件:hbase-site.xml
解释:In hbase-site.xml, set zookeeper.session.timeout to 30 seconds or less to bound failure detection (20-30 seconds is a good start).该值会直接关系到master发现服务器宕机的最大周期,默认值为30秒,如果该值过小,会在HBase在写入大量数据发生而GC时,导致RegionServer短暂的不可用,从而没有向ZK发送心跳包,最终导致认为从节点shutdown。一般20台左右的集群需要配置5台zookeeper。
RegionServer在被回收的时候会有短暂的不可用,无法向zookeeper报告自己的状态,如果在一个时间周期内,RegionServer一直没有汇报自己的状态,HMaster就认为它已经挂掉了,这个RegionServer以后再也没有权利处理region了,这个时候需要把zookeeper这个延迟调高一点。