Hbase运维碎碎念

24,632 views

Published on

  • Be the first to comment

Hbase运维碎碎念

  1. 1. Hbase运维碎碎念<br />宁海元 @NinGoo<br />http://NinGoo.net<br />Ver:0.2<br />2011年6月<br />
  2. 2. Hbase运维碎碎念<br />这是一个读书笔记,可能有大量的理解错误<br />最后的参考文档比这个ppt更有价值<br />后续对Hbase有更多的理解,随时会更新ppt<br />你需要有基本的java概念和基本的Hbase概念<br />
  3. 3. Hbase运维碎碎念<br />Agenda<br />JAVA<br />HDFS<br />HBase<br />
  4. 4. Hbase运维碎碎念<br />tmpwatch<br />运行一段时间后,发现jps无法列举java进程了,崩溃。。。<br />Why?<br />Java需要将pid信息写入到 /tmp/hsperfdata_username<br />tmpwatch定期清理/tmp<br />修改sudo vi /tmp/cron.daily/tmpwatch<br />/usr/sbin/tmpwatch “$flags” -x /tmp/hsperfdata_* …<br />
  5. 5. Hbase运维碎碎念<br />JVM Heap<br />图片出处:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html<br />
  6. 6. Hbase运维碎碎念<br />JVM Heap<br />简单来说,Heap分为年轻代(Young)/年老代(Old/ Tenured)/持久代(Perm)<br />-Xms: Heap初始尺寸<br />-Xmx: Heap最大尺寸<br />-Xmn: 年轻代尺寸<br />-XX:NewRatio: 设置Young与Old的大小比例,-server时默认为1:2<br />-XX:SurvivorRatio: 设置Eden与Survivor的比例,默认为32。<br />-XX:MaxPermSize: 持久代大小,默认64M。<br />-XX:NewSize: 年轻代大小<br />-XX:MaxNewSize: 年轻代最大尺寸<br />-Xss: 每个线程的stack尺寸<br />-XX:MinHeapFreeRatio:空余堆内存小于40%时,JVM就会增大堆。 <br />-XX:MaxHeapFreeRatio:空余堆内存大于70%时,JVM会减少堆。<br />
  7. 7. Hbase运维碎碎念<br />JVM Heap<br />年轻代分为Eden,Survior 1, Survior2<br />新对象在Eden区分配内存。<br />GC时,将Eden和有对象的Survior区(From Space)的所有对象复制到另外一个Survior(To Space),然后清空Eden和原Sruvior。<br />当一个对象在from和to之间复制的次数超过一定阀值(-XX:MaxTenuringThreshold)后,进入到年老代。如果是CMS GC,这个阀值默认为0,也就是经过一次copy后就进入年老代。 -XX:+PrintTenuringDistribution可以查看详细统计信息。<br />持久代不GC,除非CMS GC且显式设置 XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled<br />
  8. 8. Hbase运维碎碎念<br />JVM GC<br />GC分为对Young的GC(minor)和同时对Young和Old的GC(Major)<br />Serial GC,单线程GC,适合小Heap单CPU。-XX:+UseSerialGC<br />Parallel GC,也称Throughput GC。与第一种GC不同在于Young区是多线程的,但Old区仍然单线程。-XX:+UseParallelGC。Java 6.0已经支持Old区并行GC: -XX:+UseParallelOldGC。GC的线程数可以通过-XX:ParallelGCThreads=<N>调整。通过-XX:MaxGCPauseMillis=<N>可以提示最大GC暂停时间,设置此参数会导致JVM自动调整Heap大小和一些JVM相关参数,慎用。<br />Concurrent GC,也称CMS GC,可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。该GC还可以开启增量模式-XX:+CMSIncrementalMode<br />
  9. 9. Hbase运维碎碎念<br />JVM GC<br />Concurrent GC<br />暂停所有线程,标记活跃对象的root,然后恢复线程访问<br />使用一个或者多个CPU标记所有活跃对象,应用线程访问不受影响。<br />使用一个CPU标记第2步过程中有修改的对象。<br />暂停所有线程,标记前面2,3步过程中有修改的对象,然后恢复线程访问。<br />使用一个CPU,并发的将非活跃对象清除,内存释放给free list。<br />使用一个CPU,并发的重整heap大小,并准备下一轮GC需要的数据结构。<br />
  10. 10. Hbase运维碎碎念<br />JVM GC<br />Concurrent GC<br />并发GC更消耗CPU,假如有N个CPU,GC可使用1 <= K <= ceil(N/4) 。<br />并发GC可能造成Heap碎片,Cloudera推出了MemStore-Local Allocation Buffers特性来改善碎片问题。<br />如果并发GC进行中,有新对象要进入年老代会导致Concurrent Mode Failure,此时只能stop the world,改用串行Full GC。<br />如果新的对象要进入年老代,但年老代没有足够大小的连续空间,会导致Promotion Failuer,此时只能stop the world,进行Full GC<br />-XX:CMSInitiatingOccupancyFraction=<N> 可以控制启动CMC GC的阀值,N表示年老代的大小百分比。如果Concurrent Mode Failure频繁出现,可以考虑降低其值。<br />
  11. 11. Hbase运维碎碎念<br />JVM GC<br />不管哪种GC,年轻代的GC都会阻塞线程。推荐年轻代使用Parallel New GC,年老代使用CMS GC<br />-XX:+UseParNewGC –XX:+UseConcMarkSweepGC<br />禁止程序显式GC<br />-XX:+DisableExplicitGC<br />打印GC Log<br />-verbose:gc -Xloggc:filename -XX:+PrintGCDetails -XX:+PrintGCTimeStamps<br />打印年老代FreeListSpace的状态<br /> -XX:PrintFLSStatistics=1<br />打印CMS的信息<br />-XX:PrintCMSStatistics=1<br />
  12. 12. Hbase运维碎碎念<br />NUMA<br />从JDK6u2开始,增加了-XX:+UseNUMA,在 UseParallelGC时,JVM会将年轻代根据节点数切分为不同的pool。<br />cat /sys/devices/system/node/node0/meminfo<br />Node 0 MemTotal: 12382196 kB<br />Node 0 MemFree: 9739412 kB<br />Node 0 MemUsed: 2642784 kB<br />Node 0 Active: 1805868 kB<br />Node 0 Inactive: 548076 kB<br />Node 0 HighTotal: 0 kB<br />Node 0 HighFree: 0 kB<br />Node 0 LowTotal: 12382196 kB<br />Node 0 LowFree: 9739412 kB<br />Node 0 Dirty: 396 kB<br />Node 0 Writeback: 0 kB<br />Node 0 FilePages: 1765192 kB<br />Node 0 Mapped: 23236 kB<br />Node 0 AnonPages: 589204 kB<br />Node 0 PageTables: 3672 kB<br />Node 0 NFS_Unstable: 0 kB<br />Node 0 Bounce: 0 kB<br />Node 0 Slab: 141612 kB<br />Node 0 HugePages_Total: 0<br />Node 0 HugePages_Free: 0<br />
  13. 13. Hbase运维碎碎念<br />NUMA<br />$ numastat<br /> node0 node1<br />numa_hit 1675519925 1659271911<br />numa_miss 0 0<br />numa_foreign 0 0<br />interleave_hit 110847 112840<br />local_node 1675317828 1658259635<br />other_node 202097 1012276<br />
  14. 14. Hbase运维碎碎念<br />NUMA<br />图片出处:http://blogs.oracle.com/jonthecollector/entry/help_for_the_numa_weary<br />
  15. 15. Hbase运维碎碎念<br />NUMA<br />关闭NUMA?<br />vi /etc/grub.conf<br />…<br />Title Red Hat Enterprise Linux Server (2.6.18-164.el5)<br /> root (hd0,0)<br /> kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ numa=off console=tty0 console=ttyS1,115200 <br />initrd /initrd-2.6.18-164.el5.img<br />
  16. 16. Hbase运维碎碎念<br />Large Page<br />OS设置<br />假设使用2G的大页面内存(2M页面)<br />echo 1000 > /proc/sys/vm/nr_hugepages<br />echo 2147483647 > /proc/sys/kernel/shmmax<br />JVM设置<br />-XX:+UseLargePages<br />-Xmx整个JVM Heap必须全部使用大页内存,或者全部不用。<br />
  17. 17. Hbase运维碎碎念<br />Agenda<br />JAVA<br />HDFS<br />HBase<br />
  18. 18. Hbase运维碎碎念<br />ulimit<br />sudo vi /etc/security/limits.conf<br />* soft nproc 65536<br />* hard nproc 65536<br />* soft nofile 65536<br />* hard nofile 65536<br />Swap<br />echo 0 > /proc/sys/vm/swappiness<br />
  19. 19. Hbase运维碎碎念<br />Sync<br />Apache官方版本的0.20.x不支持sync(hflush),有较大存在数据丢失的可能性。<br />如果作为Hbase的存储,需要使用CDH3版本或者自行编译<br />Hadoopbranch-0.20-append分支。<br />官方版本的HDFS只有在文件关闭后才能确保数据不丢失,如采用官方,可考虑加快Hlog的切换(hbase.regionserver.logroll.period),以尽量减少WAL日志的丢失,但会影响性能:<br />产生更多的小文件,影响NameNode的管理效率<br />更频繁的flush,Hlog超过一定数量(默认32)后会触发所有memstore的flush,影响regionserver的效率<br />
  20. 20. Hbase运维碎碎念<br />NameNode<br />NameNode目前的版本是单点,主要保存两类数据:<br />1. Namespace<br />通过Fsimage和Editlog持久化到硬盘<br />2. BlocksMap<br />纯内存三元组结构,重启后需要datanode做blockreport重构<br />NameNode容灾需要确保Fsimage和Editlog写两份(通过NFS)<br />NameNode重启的时间取决于Editlog的Apply时间和BlockReport的时间。<br />
  21. 21. Hbase运维碎碎念<br />Safemode<br />dfs.safemode.threshold.pct<br />默认0.999,也就是blockreport阶段NN需要收到99.9%的block的report信息才能退出安全模式<br />dfs.safemode.min.datanodes<br />退出safemode前存活的最小DN数,默认0,不限制<br />dfs.safemode.extension<br />达到阀值以后等待默认30000毫秒后才正式退出安全模式<br />手工进入safemode<br />$hadoopdfsadmin -safemode enter<br />手工退出safemode<br />hadoopdfsadmin -safemode leave<br />
  22. 22. Hbase运维碎碎念<br />DataNode<br />dfs.datanode.max.xcievers<br />默认256,建议至少4096+,太小可能导致频繁报错:hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.io.IOException: No live nodes contain current block.<br />
  23. 23. Hbase运维碎碎念<br />监控Metrics<br />Metrics可以写到Ganglia,或者本地文件<br />vi hadoop-metrics.properties<br />#dfs.class=org.apache.hadoop.metrics.file.FileContext<br />dfs.class=org.apache.hadoop.hbase.metrics.file.TimeStampingFileContext<br />dfs.period=10<br />dfs.fileName=/tmp/dfsmetrics.log<br />dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext31<br />dfs.period=10<br />dfs.servers=localhost:8649<br />注:Hadoop的FileContext没有记录timestamp,建议使用Hbase的TimeStampingFileContext<br />
  24. 24. Hbase运维碎碎念<br />监控Metrics<br />Metrics也可以同时写到Ganglia和本地文件<br />dfs.class=org.apache.hadoop.metrics.spi.CompositeContext<br />dfs.arity=2<br />dfs.period=10<br />dfs.sub1.class=org.apache.hadoop.hbase.metrics.file.TimeStampingFileContext<br />dfs.fileName=/tmp/metrics_hbase.log<br />dfs.sub2.class=org.apache.hadoop.metrics.ganglia.GangliaContext31<br />dfs.servers=localhost:8649<br />
  25. 25. Hbase运维碎碎念<br />Agenda<br />JAVA<br />HDFS<br />HBase<br />
  26. 26. Hbase运维碎碎念<br />Flush/Compaction/Split<br />图片出处:http://www.spnguru.com/?p=466<br />
  27. 27. Hbase运维碎碎念<br />Flush/Compaction/Split<br />CompactSplitThread.java<br />lock.lock();<br />try {<br /> if(!this.server.isStopped()) {<br /> // Don't interrupt us while we are working<br /> byte [] midKey = r.compactStores();<br /> if (r.getLastCompactInfo() != null) { // compaction aborted?<br />this.server.getMetrics().addCompaction(r.getLastCompactInfo());<br /> } <br /> if (shouldSplitRegion() && midKey != null &&<br /> !this.server.isStopped()) {<br /> split(r, midKey);<br /> } <br /> } <br />} finally {<br />lock.unlock();<br />} <br />
  28. 28. Hbase运维碎碎念<br />Flush/Compaction/Split<br />hbase.hregion.memstore.flush.size<br />默认64M,当一个region中所有MemStore总大小超过64M时,开始Flush。<br />hbase.hregion.max.filesize<br />默认256M,当一个StoreFile超过256M时,会启动split分裂为两个daughter region,分裂只是创建两个reference,不复制数据。<br />hbase.hregion.memstore.block.multiplier<br />默认2,当一个region所有memstore之和超过hbase.hregion.memstore.flush.size(默认64M)大小的2倍时,会强制阻塞写刷到磁盘。<br />
  29. 29. Hbase运维碎碎念<br />Flush/Compaction/Split<br />hbase.regionserver.regionSplitLimit<br />如果在线的region超过此数目,则不再split,默认int.MAX_VALUE(2147483647),设为1即可关闭自动split。<br />hbase.hstore.compactionThreshold<br />默认3,当一个store中的storefile超时3个时,触发compact。所以,将此值设置为int.MAX_VALUE可关闭自动compact。<br />hbase.hstore.blockingStoreFiles<br />默认7,当region中任一个store中的storefile超过7个时,会触发的compact,在compact完成之前,flush会延迟执行。如果此时更新较多,导致该region的memstore之和超过hbase.hregion.memstore.flush.size<br />*hbase.hregion.memstore.block.multiplier,则会阻塞更新,直到Flush完成,或者hbase.hstore.blockingWaitTime(默认90s)超时,建议加大该值。<br />
  30. 30. Hbase运维碎碎念<br />Flush/Compaction/Split<br />hbase.regionserver.maxlogs<br />默认32,当Hlog的数量超过32个时会造成flush所有的region,不管它的memstore是否满。<br />hbase.regionserver.global.memstore.upperLimit<br />默认0.4,表示region server上所有的memstore占用的内存总和最多为MaxHeap的40%,超过则会加锁刷磁盘,一直要等到某个memstore刷到磁盘,且memstore总和下去了,才会继续, Flush是串行操作,所以对memstore多或写非常频繁的场景要特别注意。 <br />hbase.regionserver.global.memstore.lowerLimit<br />默认0.35,当所有MemStore的大小超过MaxHeap的35%时,开始持续Flush,以尽量避免到upperLimit导致锁。<br />
  31. 31. Hbase运维碎碎念<br />Minor Compaction<br />Minor Compaction只合并StoreFile,不清理历史版本和删除记录<br />hbase.hstore.compaction.max<br />默认10,一次minor compaction最多只处理10个StoreFile<br />
  32. 32. Hbase运维碎碎念<br />Major Compaction<br />Major Compaction合并所有StoreFile,清理历史版本和删除记录<br />hbase.hregion.majorcompaction<br />默认86400000 毫秒=1天,同一个region两次major compaction操作的时间间隔。<br />如果一次minor compaction选中的StoreFile是这个region的所有StoreFile,minor compaction会自动升级为major compaction<br />手工触发:<br />$hbase shell<br />hbase(main):015:0> compact 'test'<br />0 row(s) in 0.2220 seconds<br />hbase(main):016:0> major_compact 'test'<br />0 row(s) in 0.3240 seconds<br />So,如果没有delete,major compaction可以不用太频繁的执行。<br />
  33. 33. Hbase运维碎碎念<br />Column Family<br />每个CF都有一套MemStore+StoreFiless<br />但是同一个table的所有CF的MemStore都会在同一时间Flush(未来或许会改善),会在同一时间split,<br />从写的角度看,一个table最好不要设计太多的CF,各个CF之间的数据长度和更新频率尽量保持平衡,他们之间有太多的紧耦合。<br />从读的角度看,读取频繁的列放到一个较小的CF较有利。<br />CF的设计需要均衡考虑业务的读写模式。<br />
  34. 34. Hbase运维碎碎念<br />MSLAB<br />MemStore-Local Allocation Buffer<br /><ul><li> 每个MemStore都有一个MemStoreLAB实例
  35. 35. MemStoreLAB有一个2MB的curChunk,其nextFreeOffset为0
  36. 36. 每次insert一个KV时,数据(byte[]数组)复制到curChunk,nextFreeOffset随之增长
  37. 37. curChunk满了以后,重新分配一个2MB的Chunk
  38. 38. 上述操作采用compare-and-swap,因此无需加锁</li></ul>优点: 原始插入的数据生命周期变短,就不用进入年老代<br />可能进入年老代的Chunk是固定以2MB为大小,消除碎片的烦恼<br />每个Chunk只可能属于一个MemStore<br />当MemStore刷到磁盘,Heap释放的内存也是以2MB为单位。<br />
  39. 39. Hbase运维碎碎念<br />MSLAB<br />hbase.hregion.memstore.mslab.enabled<br />是否启用MSLAB,默认true<br />hbase.hregion.memstore.mslab.chunksize<br />Chunk的尺寸,默认2MB<br />hbase.hregion.memstore.mslab.max.allocation<br />MSLAB中单次分配内存的最大尺寸,默认256K,超过该尺寸的内存直接在Heap上分配。<br />
  40. 40. Hbase运维碎碎念<br />Regionserver<br />zookeeper.session.timeout<br />默认3分钟,也就是rs超过3分钟没有给zk消息,Master就认为rs挂了。如果gc的过程中阻塞时间超过了3分钟,那就杯具了,so。。。<br />hfile.block.cache.size<br />默认0.2,全局公用的hfile的cache,最多占用MaxHeap的20%。当数据在memstore中读取不到时,就会从这个cache里获取,当从此cache中获取不到时,就需要读取文件。当cache的block达到了这个值的85%时,即会启动evict(日志中会出现“Block cache LRU eviction”),将cache清除到75%大小,可通过日志中的“LRU Stats: ”来观察cache的命中率<br />
  41. 41. Hbase运维碎碎念<br />Client<br />hbase.client.pause<br />默认1000ms,客户端被阻塞或者失败后重试间隔,间隔为指数避让,即1,1,1,2,2,4,4,8,16,32,建议改下这个值,同时加大重试次数,避免split造成客户端响应时间过长以及失败率增加。<br />hbase.client.retries.number<br />默认为10次,决定了客户端的重试次数<br />hbase.ipc.client.tcpnodelay<br />默认tcp的no delay是false,建议修改为true<br />ipc.ping.interval<br />RPC等待服务端响应的超时时间,默认为1分钟,有点太长了,建议改成3秒(3000)<br />
  42. 42. Hbase运维碎碎念<br />Compress<br />LZO比默认的Gzip性能更好,但Gzip压缩比更高<br />安装lzo-2.00以上版本:http://www.oberhumer.com/opensource/lzo/download/<br />到http://code.google.com/p/hadoop-gpl-compression/下载lzo相关的native库<br />io.compression.codecs<br />com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec<br />io.compression.codec.lzo.class<br />com.hadoop.compression.lzo.LzoCodec<br />参考:http://wiki.apache.org/hadoop/UsingLzoCompression<br />
  43. 43. Hbase运维碎碎念<br />Replication<br />是的,Hbase 0.90.0也开始支持replication了,不过目前版本bug较多。<br />参考:http://koven2049.iteye.com/blog/983633<br />图片出处:http://hbase.apache.org/docs/r0.89.20100726/replication.html<br />
  44. 44. Hbase运维碎碎念<br />监控Metrics<br />hbase.class=org.apache.hadoop.metrics.spi.CompositeContext<br />hbase.arity=2<br />hbase.period=10<br />hbase.sub1.class=org.apache.hadoop.hbase.metrics.file.TimeStampingFileContext<br />hbase.fileName=/tmp/metrics_hbase.log<br />hbase.sub2.class=org.apache.hadoop.metrics.ganglia.GangliaContext31<br />hbase.servers=localhost:8649<br />
  45. 45. Hbase运维碎碎念<br />备份恢复<br />导出到本地或者HDFS<br />hbaseorg.apache.hadoop.hbase.mapreduce.Driver export <br />Tablename/desctination<br />导入回Hbase<br />hbaseorg.apache.hadoop.hbase.mapreduce.Driver import <br />Tablename /source<br />导入TSV文件(以Tab分割的文本文件)<br />hbaseorg.apache.hadoop.hbase.mapreduce.Driverimporttsv <br />-Dimporttsv.columns=a,b,cTablename /source<br />如果是csv文件,只需要加参数-Dimporttsv.separator=,即可<br />
  46. 46. Hbase运维碎碎念<br />备份恢复<br />Hbase集群间CopyTable<br />hbaseorg.apache.hadoop.hbase.mapreduce.CopyTable …<br />或者<br />hbaseorg.apache.hadoop.hbase.mapreduce.Drivercopytable …<br />Hadoop集群间Copy文件<br />hadoopdistcp -p -update "hdfs://A:8020/user/foo/bar" "hdfs://B:8020/user/foo/baz“<br />Mozilla开发的Backup工具<br />对运行的Hbase进行做distcp会导致不一致,Mozilla为此开发了一个Backup工具<br />http://blog.mozilla.com/data/2011/02/04/migrating-hbase-in-the-trenches/<br />
  47. 47. Hbase运维碎碎念<br />压力测试<br /> $ ./hbaseorg.apache.hadoop.hbase.PerformanceEvaluation<br />Usage: java org.apache.hadoop.hbase.PerformanceEvaluation <br /> [--miniCluster] [--nomapred] [--rows=ROWS] <command> <nclients><br />Options:<br />miniCluster Run the test on an HBaseMiniCluster<br />nomapred Run multiple clients using threads (rather than use mapreduce)<br /> rows Rows each client runs. Default: One million<br />flushCommits Used to determine if the test should flush the table. Default: false<br />writeToWAL Set writeToWAL on puts. Default: True<br />Command:<br />filterScan Run scan test using a filter to find a specific row based on it's value (make sure to use --rows=20)<br />randomRead Run random read test<br />randomSeekScan Run random seek and scan 100 test<br />randomWrite Run random write test<br /> scan Run scan test (read every row)<br /> scanRange10 Run random seek scan with both start and stop row (max 10 rows)<br /> scanRange100 Run random seek scan with both start and stop row (max 100 rows)<br /> scanRange1000 Run random seek scan with both start and stop row (max 1000 rows)<br /> scanRange10000 Run random seek scan with both start and stop row (max 10000 rows)<br />sequentialRead Run sequential read test<br />sequentialWrite Run sequential write test<br />Args:<br />nclients Integer. Required. Total number of clients (and HRegionServers)<br /> running: 1 <= value <= 500<br />Examples:<br /> To run a single evaluation client:<br /> $ bin/hbaseorg.apache.hadoop.hbase.PerformanceEvaluationsequentialWrite 1<br />
  48. 48. Hbase运维碎碎念<br />压力测试<br /><ul><li> Grinder:http://grinder.sourceforge.net/
  49. 49. YCSB: http://wiki.github.com/brianfrankcooper/YCSB/
  50. 50. GridMix:http://hadoop.apache.org/mapreduce/docs/current/gridmix.html</li></li></ul><li>Hbase运维碎碎念<br />参考文档<br /><ul><li>《Hadoop:The Definitive Guide》
  51. 51. the Apache Hbase Book
  52. 52. hbase-hug-presentation
  53. 53. http://www.spnguru.com/
  54. 54. Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
  55. 55. Avoiding Full GCs in HBase with MemStore-Local Allocation Buffers: Part 1
  56. 56. Avoiding Full GCs in HBase with MemStore-Local Allocation Buffers: Part 2
  57. 57. Avoiding Full GCs in HBase with MemStore-Local Allocation Buffers: Part 3
  58. 58. Help for the NUMA weary</li></li></ul><li>Hbase运维碎碎念<br />参考文档<br /><ul><li>NUMA与英特尔下一代Xeon处理器学习心得
  59. 59. http://blog.bluedavy.com/?p=236
  60. 60. http://koven2049.iteye.com/blog/983502
  61. 61. VISUALIZING HBASE FLUSHES AND COMPACTION
  62. 62. namenode内部关键数据结构简介
  63. 63. http://HBase.info</li></li></ul><li>The End<br />Thanks~~<br />

×