tubaobaoya3 发表于 2016-12-5 10:05:42

【转载】hadoop/hbase 搭建

本文转载自http://shift-alt-ctrl.iyunv.com/blog/2073581 
 
因为工作需要,我们使用hbase + hadoop存储基于用户内容的数据(UGC),本文将描述如何逐步搭建此平台,仅作参考。
 
1. 环境
    操作系统:Red hat 6.3,300G硬盘,双核CPU
    JAVA:JDK1.6                    
    HBASE:hbase-0.98.1
    Hadoop:hadoop-2.2.0
 
    现在我们使用3台机器(虚拟机),来搭建hadoop环境,如下为机器列表,首先我们需要在三台机器上hosts文件中都增加如下信息,同时需要注意,局域网内的机器都需要设定网卡为“静态IP”,以防止机器重启后IP不断变化。本例中所有机器使用root用户操作。
Java代码  


[*]127.0.0.1    localhost  
[*]::1    localhost  
[*]192.168.0.110    node1.hadoop.virtual  
[*]192.168.0.111    node2.hadoop.virtual  
[*]192.168.0.112    node2.hadoop.virtual  
[*]##需要注意当前的机器名  
[*]## 192.168.0.110(本机IP)    机器名  

 
    当然使用“hostname”转义成IP并非必须的,我们也可以直接在hadoop、hbase的配置文件使用IP,不过本人为了便于定位node所在的机器位置,就“额外”的在hosts中增加了上述配置。
 
2. SSH
    hadoop、hbase中使用ssh实现无密码登录,在hadoop集群启动时将会依次跳转到集群中所有的机器上启动相应的进程,所以我们首先配置ssh授权信息(请首先安装ssh-keygen客户端,关于ssh客户端配置请参见其他文档):
Java代码  


[*]ssh-keygen -t rsa  

    一路回车,均采用默认配置,无password设置。最终会在:/root/.ssh目录下生成id_rsa.pub(如果使用其他用户登录,则保存在~/.ssh目录下),这个文件中所包含的的就是登陆本机所需要的rsa-pub值。我们依次在上述三台机器上执行ssh-keygen命令。
 
     我们把三台机器生成的三个rsa-pub值都依次写入每台机器的/root/.ssh/authorized_keys文件中,很多人忘记把本机的rsa-pub值写入自己的authorized_keys,这会导致本机的hadoop实例无法启动。
 
3. JDK安装
    现在JDK1.6+版本,然后直接安装,并在配置JAVA_HOME,本实例中JDK安装在/opt/app目录下。在/etc/profile文件的尾部增加如下配置:
Java代码  


[*]## set java  
[*]JAVA_HOME=/opt/app/jdk1.6.0_45  
[*]PATH=$PATH:/$JAVA_HOME/bin  
[*]CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
[*]JRE_HOME=$JAVA_HOME/jre  
[*]export JAVA_HOME PATH CLASSPATH JRE_HOME  
[*]export LD_LIBRARY_PATH=/usr/local/lib  

 
    配置完毕之后,执行“source /etc/profile”使环境变量生效;如果你的机器上已经安装了其他的JDK(比如openJDK),你应该首先卸载或者禁用其启动文件,然后再执行上述“source”命令。(比如,使用"whereis java"指令查找出java启动文件所在位置,然后删除它,它可能位于“/usr/bin/java”中)
 
    建议三台机器中,JDK、hadoop、hbase的安装目录都相同,这样排查问题和文件配置都会非常的方便。
 
4. ulimit设置
    因为hadoop和hbase在运行时需要打开很多的文件,同时在面向众多Client连接时也会消耗文件描述符,所以我们需要简单的将ulimit设置的稍微大一些(默认为1024,显然太小了),在/etc/security/limits.conf文件的尾部增加:
Java代码  


[*]*       soft    nofile          20480  
[*]*       hard    nofile          20480  

 
    此外还需要检测/etc/profile文件中是否也指定了“ulimit”选项,如果有,可以考虑暂时先移除它,ulimit参数将会在root用户重登陆后生效。关于linux下如何调整机器支撑的最大文件打开个数以及线程的并发数,请参见其他文档。
 
5. hadoop搭建与配置
    hadoop-2.2是目前相对稳定和“低调”的版本,不过hadoop的版本简直是“不尽其数”,为了配合hbase-0.98,我们需要使用hadoop-2.2版本作为支撑;不过如果条件允许,建议使用hadoop-2.4+,因为hbase-1.0.x里程碑版本将最低支持到hadoop-2.4。【hbase与hadoop版本对应表】
 
    通过apache网站下载hadoop-2.2.tar.gz文件包,解压到指定目录,本实例中将hadoop安装在“/opt/app”目录下;我们首先在一台机器上安装hadoop并配置,稍后再把依次同步到另外两台机器即可。
 
    我们约定,node1.hadoop.virtual作为namenode,其他两台作为datanode,其中node2.hadoop.virtual作为辅助master(即secondarynamenode),本文中将不引入yarn(mapreduce),所以我们暂时不关心resourceManager等进程。同时约定hadoop与hbase中关于file blocksize的设定保持一致,为128M。我们依次配置如下文件(${hadoop}/etc/hadoop):
 
    1) masters文件:此文件只需要放置在namenode和secondarynamenode上,datanode上不需要此文件;masters文件用来指定“secondarynamenode”的地址;集群中,通常需要一个secondarynamenode。
Java代码  


[*]node2.hadoop.virtual  

    2) slaves文件:用来指定datanode的地址,只有datanode上需要此文件;
Java代码  


[*]node1.hadoop.virtual  
[*]node2.hadoop.virtual  
[*]node3.hadoop.virtual  

     如果你不希望node1同时作为datanode和namenode两种角色,你可以在slaves文件中移除它。
 
    3) hdfs-site.xml文件:hadoop主要有hdfs和mapreduce两种核心特性,hdfs-site.xml用来配置hdfs特性。如下配置参数,仅供参考。
Java代码  


[*]<?xml version="1.0" encoding="UTF-8"?>  
[*]<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
[*]<!-- 默认配置以及全量参数请参考hdfs-default.xml -->  
[*]<!-- http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml -->  
[*]<configuration>  
[*]    <!-- important -->  
[*]    <property>  
[*]        <name>dfs.replication</name>  
[*]        <value>3</value>  
[*]        <!-- default 3 -->  
[*]        <!-- but will be changed by "file.replication" of core-site.xml -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.blocksize</name>  
[*]        <value>128m</value>  
[*]        <!-- default 64m -->  
[*]    </property>  
[*]    <!-- optional -->  
[*]    <property>  
[*]        <name>dfs.client.block.write.retries</name>  
[*]        <value>3</value>  
[*]        <!-- default 3 -->  
[*]        <!-- if one of replication is failure when writting,How many times shoud be retry -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.heartbeat.interval</name>  
[*]        <value>3</value>  
[*]        <!-- heartbeat between namenode and datanode,seconds -->  
[*]    </property>  
[*]  
[*]    <property>  
[*]        <name>dfs.namenode.replication.interval</name>  
[*]        <value>3</value>  
[*]        <!-- namenode check all for replication,seconds -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.namenode.logging.level</name>  
[*]        <value>info</value>  
[*]        <!-- default info -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.datanode.handler.count</name>  
[*]        <value>32</value>  
[*]        <!-- default 10 -->  
[*]        <!-- production,can be more higher than it,such as 128 -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.namenode.handler.count</name>  
[*]        <value>32</value>  
[*]        <!-- default 10 -->  
[*]        <!-- production,can be more higher than it,but reference the number of datanodes -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.namenode.name.dir</name>  
[*]        <value>/data/hadoop/dfs/name</value>  
[*]        <!-- namenode,name table -->  
[*]        <!-- local filesystem -->  
[*]    </property>  
[*]        <property>  
[*]        <name>dfs.namenode.name.dir.restore</name>  
[*]        <value>false</value>  
[*]        <!-- default false. -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.datanode.data.dir</name>  
[*]        <value>/data/hadoop/dfs/data</value>  
[*]        <!-- datanode,data-->  
[*]        <!-- should be local filesystem,if as SAN system,you should test it enough -->  
[*]    </property>  
[*]    <property>  
[*]        <name>dfs.namenode.checkpoint.dir</name>  
[*]        <value>/data/hadoop/dfs/namesecondary</value>  
[*]        <!-- datanode,data-->  
[*]    </property>  
[*]    <!--  
[*]    <property>  
[*]        <name>dfs.datanode.address</name>  
[*]        <value>0.0.0.0:50010</value>  
[*]    </property>  
[*]    -->  
[*]</configuration>  

 
    4) core-site.xml:hadoop全局配置
Java代码  


[*]<?xml version="1.0" encoding="UTF-8"?>  
[*]<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
[*]<!--  
[*]http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/core-default.xml  
[*]-->  
[*]<configuration>  
[*]    <!-- very important -->  
[*]    <property>  
[*]        <name>fs.default.name</name>  
[*]        <value>hdfs://node1.hadoop.virtual:8020</value>  
[*]        <!-- you should know the ip of domain,default port is 8020 -->  
[*]    </property>  
[*]    <property>  
[*]        <name>file.blocksize</name>  
[*]        <value>134217728</value>  
[*]        <!-- 128M,default 64M,local file -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hadoop.tmp.dir</name>  
[*]        <value>/var/hadoop/tmp</value>  
[*]    </property>  
[*]    <property>  
[*]        <name>file.replication</name>  
[*]        <value>2</value>  
[*]        <!-- replication factor,default 1 -->  
[*]    </property>  
[*]  
[*]    <!-- optional -->  
[*]    <property>  
[*]        <name>hadoop.security.authorization</name>  
[*]        <value>false</value>  
[*]        <!-- default false -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.file.buffer.size</name>  
[*]        <value>131072</value>  
[*]        <!-- default 4096,4KB -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.bytes.per.checksum</name>  
[*]        <value>512</value>  
[*]        <!-- default 512 -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.skip.checksum.errors</name>  
[*]        <value>false</value>  
[*]        <!-- default false -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.compression.codecs</name>  
[*]        <value></value>  
[*]        <!-- default empty,a list of codecs classes,separated by ","-->  
[*]        <!-- but HDFS Client can specify it,use native lib -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.seqfile.local.dir</name>  
[*]        <value>/data/hadoop/io/local</value>  
[*]        <!-- default ${hadoop.tmp.dir}/io/local -->  
[*]        <!-- io.seqfile.compress.blocksize -->  
[*]        <!-- io.seqfile.lazydecompress -->  
[*]        <!-- io.seqfile.sorter.recordlimit -->  
[*]    </property>  
[*]    <property>  
[*]        <name>fs.trash.interval</name>  
[*]        <value>10080</value>  
[*]        <!-- max time of trash file can be kept,(:minute),default 0,disabled -->  
[*]    </property>  
[*]  
[*]    <!-- bloom filter -->  
[*]    <property>  
[*]        <name>io.map.index.skip</name>  
[*]        <value>0</value>  
[*]        <!-- Number of index entries to skip between each entry.   
[*]            Zero by default.   
[*]            Setting this to values larger than zero can facilitate opening large MapFiles using less memory.   
[*]        -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.map.index.interval</name>  
[*]        <value>128</value>  
[*]        <!-- MapFile consist of two files - data file (tuples) and index file (keys).   
[*]        For every io.map.index.interval records written in the data file,   
[*]        an entry (record-key, data-file-position) is written in the index file.   
[*]        This is to allow for doing binary search later within the index file to look up records   
[*]        by their keys and get their closest positions in the data file.  
[*]        -->  
[*]    </property>  
[*]        <property>  
[*]        <name>io.mapfile.bloom.size</name>  
[*]        <value>1048576</value>  
[*]        <!-- max time of trash file can be kept,(:minute),default 0,disabled -->  
[*]    </property>  
[*]    <property>  
[*]        <name>io.mapfile.bloom.error.rate</name>  
[*]        <value>0.005</value>  
[*]        <!-- max time of trash file can be kept,(:minute),default 0,disabled -->  
[*]    </property>  
[*]  
[*]    <!-- ha,default:disabled -->  
[*]    <!--  
[*]    <property>  
[*]        <name>ha.zookeeper.quorum</name>  
[*]        <value></value>  
[*]    </property>  
[*]    -->  
[*]  
[*]</configuration>  

 
    5) hadoop-env.sh: hadoop启动脚本,这个脚本中包含了JVM参数调优以及全局性参数,为了便于参考,如下为全部信息。
Java代码  


[*]# Set Hadoop-specific environment variables here.  
[*]  
[*]# The only required environment variable is JAVA_HOME.  All others are  
[*]# optional.  When running a distributed configuration it is best to  
[*]# set JAVA_HOME in this file, so that it is correctly defined on  
[*]# remote nodes.  
[*]  
[*]# The java implementation to use.  
[*]export JAVA_HOME=/opt/app/jdk1.6.0_45  
[*]  
[*]# The jsvc implementation to use. Jsvc is required to run secure datanodes.  
[*]#export JSVC_HOME=${JSVC_HOME}  
[*]  
[*]export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}  
[*]  
[*]# Extra Java CLASSPATH elements.  Automatically insert capacity-scheduler.  
[*]for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do  
[*]  if [ "$HADOOP_CLASSPATH" ]; then  
[*]    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f  
[*]  else  
[*]    export HADOOP_CLASSPATH=$f  
[*]  fi  
[*]done  
[*]  
[*]# The maximum amount of heap to use, in MB. Default is 1000.  
[*]## 1G,every damon processor,there are about 2 ~ 4 procesors,so this value should be suitable.  
[*]export HADOOP_HEAPSIZE=1024  
[*]export HADOOP_NAMENODE_INIT_HEAPSIZE="512"  
[*]  
[*]# Extra Java runtime options.  Empty by default.  
[*]## default for all ,will append to name_node/data_node OPTS  
[*]export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -XX:MaxPermSize=256M -XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=3 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection"  
[*]  
[*]# Command specific options appended to HADOOP_OPTS when specified  
[*]export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS -Xmx2048M"  
[*]  
[*]export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS -Xmx2048M"  
[*]  
[*]export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS -Xmx2048M"  
[*]  
[*]# The following applies to multiple commands (fs, dfs, fsck, distcp etc)  
[*]export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"  
[*]#HADOOP_JAVA_PLATFORM_OPTS="-XX:-UsePerfData $HADOOP_JAVA_PLATFORM_OPTS"  
[*]  
[*]# On secure datanodes, user to run the datanode as after dropping privileges  
[*]export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}  
[*]  
[*]# Where log files are stored.  $HADOOP_HOME/logs by default.  
[*]export HADOOP_LOG_DIR=/data/hadoop/logs/hadoop  
[*]  
[*]# Where log files are stored in the secure data environment.  
[*]export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}  
[*]  
[*]# The directory where pid files are stored. /tmp by default.  
[*]# NOTE: this should be set to a directory that can only be written to by   
[*]#       the user that will run the hadoop daemons.  Otherwise there is the  
[*]#       potential for a symlink attack.  
[*]export HADOOP_PID_DIR=/var/hadoop/pids  
[*]export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}  
[*]  
[*]# A string representing this instance of hadoop. $USER by default.  
[*]export HADOOP_IDENT_STRING=$USER  

 
    配置文件调整结束后,将此hadoop-2.2安装文件全部copy到其他两台机器上(node2,node3)上;然在node1上启动集群,需要注意,在启动集群之前需要在“namenode”和“secondarynamenode”上指定format指令:
Java代码  


[*]#在bin目录下  
[*]> ./hadoop namenode -format   

 
    然后依次运行${hadoop}/sbin目录下的“start-dfs.sh”。如果集群启动过程中,没有任何异常,可以依次在每台机器上执行“jps”指令查看基于JMX的java进程,你或许会看到如下字样:
Java代码  


[*]@node1.hadoop.virtual ~]# jps  
[*]19922 DataNode  
[*]19757 NameNode  
[*]21569 Jps  
[*]  
[*]@node2.hadoop.virtual hadoop]# jps  
[*]31627 Jps  
[*]31466 SecondaryNameNode  
[*]31324 DataNode  
[*]  
[*]@node3.hadoop.virtual ~]# jps  
[*]15913 DataNode  
[*]23508 Jps  
[*]16530 NodeManager  

 
    如果某台机器上,namenode、datanode等进程启动不符合预期,请到日志文件中查看原因(本实例中,日志位于:/data/hadoop/logs)
 
6. hbase搭建与配置
    如果上述hadoop环境就绪后,我们就可以搭建hbase集群了,不过此处需要提醒,并不是hbase存储必须使用hadoop,它可以基于本地文件系统或者其他任何hbase支持远端文件系统。
    我们将hbase-0.98安装文件解压到/opt/app目录下,和hadoop目录平级,便于管理。
    1) hbase-core.xml:hbase核心配置
Java代码  


[*]<?xml version="1.0"?>  
[*]<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
[*]<configuration>  
[*]    <property>  
[*]        <name>hbase.regionserver.port</name>  
[*]        <value>60020</value>  
[*]        <!-- server instance: service port -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.hregion.max.filesize</name>  
[*]        <value>2147483648</value>  
[*]        <!-- 2G,default 10G,max region-file size before splited -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.hregion.memstore.flush.size</name>  
[*]        <value>134217728</value>  
[*]        <!-- 128M,default -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.regionserver.handler.count</name>  
[*]        <value>32</value>  
[*]        <!-- worker thread for client RPC -->  
[*]        <!-- sometimes,online instance can be more higher than it -->  
[*]        <!-- eg: 64,or 100 -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.regionserver.lease.period</name>  
[*]        <value>120000</value>  
[*]        <!-- 2min,mr -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.rootdir</name>  
[*]        <value>hdfs://node1.hadoop.virtual:8020/hbase</value>  
[*]        <!-- hdfs -->  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.cluster.distributed</name>  
[*]        <value>true</value>  
[*]    </property>  
[*]        <!--  
[*]    <property>  
[*]        <name>hbase.zookeeper.property.clientPort</name>  
[*]        <value>2181</value>  
[*]    </property>  
[*]    <property>  
[*]        <name>hbase.zookeeper.property.dataDir</name>  
[*]        <value>../zookeeper</value>  
[*]    </property>  
[*]        -->  
[*]    <property>  
[*]        <name>hbase.zookeeper.quorum</name>  
[*]        <value>node1.hadoop.virtual,node2.hadoop.virtual,node2.hadoop.virtual</value>  
[*]    </property>  
[*]    <!-- 开发者自定义的filter或者processor类,可以放置在hdfs上,这是一种推荐的方式 -->  
[*]    <!-- 不过本人不希望额外引入复杂度,暂且将自定义的类放置在每个实例的本地文件中,参见hbase-env.sh -->  
[*]      
[*]    <property>  
[*]        <name>hbase.dynamic.jars.dir</name>  
[*]        <value>hdfs://node1.hadoop.virtual:8020/hbase-extlib</value>  
[*]    </property>  
[*]  
[*]    <property>  
[*]        <name>zookeeper.session.timeout</name>  
[*]        <value>30000</value>  
[*]        <!-- tradeoff,you should find a proper value -->  
[*]    </property>  
[*]    <property>  
[*]        <name>zookeeper.znode.parent</name>  
[*]        <value>/online-hbase</value>  
[*]    </property>  
[*]</configuration>  

 
    hadoop并不依赖于zookeeper来保存META信息,甚至hadoop本身不具有master选举的特性;不过hbase则不同,hbase将会把META信息保存在zookeeper中,以及使用zookeeper来感知reginserver的存活状态、HMaster选举等等,所以在搭建hbase之前,需要一个即备的zookeeper集群,具体zookeeper的搭建此处将不再赘言。
 
    2) regionservers文件:配置集群中regionserver的列表,我们将会在如下三台机器上搭建hbase集群
Java代码  


[*]node1.hadoop.virtual  
[*]node2.hadoop.virtual  
[*]node2.hadoop.virtual  

 
    3) hbase-env.sh:hbase启动脚本,其中包含了JVM参数选项,为了便于查阅,此处为全文。
Java代码  


[*]# Set environment variables here.  
[*]  
[*]# This script sets variables multiple times over the course of starting an hbase process,  
[*]# so try to keep things idempotent unless you want to take an even deeper look  
[*]# into the startup scripts (bin/hbase, etc.)  
[*]  
[*]# The java implementation to use.  Java 1.6 required.  
[*]export JAVA_HOME=/opt/app/jdk1.6.0_45  
[*]  
[*]# Extra Java CLASSPATH elements.  Optional.  
[*]export HBASE_CLASSPATH="/opt/app/hbase-0.98.1/extlib/hadoop-ext-1.0.0-SNAPSHOT.jar"  
[*]  
[*]# The maximum amount of heap to use, in MB. Default is 1000.  
[*]# export HBASE_HEAPSIZE=1000  
[*]  
[*]# Extra Java runtime options.  
[*]# Below are what we set by default.  May only work with SUN JVM.  
[*]# For more on why as well as other possible settings,  
[*]# see http://wiki.apache.org/hadoop/PerformanceTuning  
[*]export HBASE_OPTS="-XX:+UseConcMarkSweepGC -XX:MaxPermSize=256M -XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=5 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection"  
[*]  
[*]# Uncomment one of the below three options to enable java garbage collection logging for the server-side processes.  
[*]  
[*]# This enables basic gc logging to the .out file.  
[*]# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps"  
[*]  
[*]# This enables basic gc logging to its own file.  
[*]# If FILE-PATH is not replaced, the log file(.gc) would still be generated in the HBASE_LOG_DIR .  
[*]# export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH>"  
[*]  
[*]# This enables basic GC logging to its own file with automatic log rolling. Only applies to jdk 1.6.0_34+ and 1.7.0_2+.  
[*]# If FILE-PATH is not replaced, the log file(.gc) would still be generated in the HBASE_LOG_DIR .  
[*]export SERVER_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/hadoop/logs/hbase/server-gc.log.$(date +%Y%m%d%H%M) -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M"  
[*]  
[*]# Uncomment one of the below three options to enable java garbage collection logging for the client processes.  
[*]  
[*]# This enables basic gc logging to the .out file.  
[*]# export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps"  
[*]  
[*]# This enables basic gc logging to its own file.  
[*]# If FILE-PATH is not replaced, the log file(.gc) would still be generated in the HBASE_LOG_DIR .  
[*]# export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<FILE-PATH>"  
[*]  
[*]# This enables basic GC logging to its own file with automatic log rolling. Only applies to jdk 1.6.0_34+ and 1.7.0_2+.  
[*]# If FILE-PATH is not replaced, the log file(.gc) would still be generated in the HBASE_LOG_DIR .  
[*]export CLIENT_GC_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/hadoop/logs/hbase/client-gc.log.$(date +%Y%m%d%H%M) -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M"  
[*]  
[*]# Uncomment below if you intend to use the EXPERIMENTAL off heap cache.  
[*]# export HBASE_OPTS="$HBASE_OPTS -XX:MaxDirectMemorySize="  
[*]# Set hbase.offheapcache.percentage in hbase-site.xml to a nonzero value.  
[*]  
[*]  
[*]# Uncomment and adjust to enable JMX exporting  
[*]# See jmxremote.password and jmxremote.access in $JRE_HOME/lib/management to configure remote password access.  
[*]# More details at: http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html  
[*]#  
[*]export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"  
[*]export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10101 -Xmx2048M -Xms2048M -XX:MaxNewSize=512M"  
[*]export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10102 -Xmx4096M -Xms4096M -XX:MaxNewSize=1024M"  
[*]# export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10103"  
[*]# export HBASE_ZOOKEEPER_OPTS="$HBASE_ZOOKEEPER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10104"  
[*]# export HBASE_REST_OPTS="$HBASE_REST_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10105"  
[*]  
[*]# File naming hosts on which HRegionServers will run.  $HBASE_HOME/conf/regionservers by default.  
[*]# export HBASE_REGIONSERVERS=${HBASE_HOME}/conf/regionservers  
[*]  
[*]# Uncomment and adjust to keep all the Region Server pages mapped to be memory resident  
[*]#HBASE_REGIONSERVER_MLOCK=true  
[*]#HBASE_REGIONSERVER_UID="hbase"  
[*]  
[*]# File naming hosts on which backup HMaster will run.  $HBASE_HOME/conf/backup-masters by default.  
[*]# export HBASE_BACKUP_MASTERS=${HBASE_HOME}/conf/backup-masters  
[*]  
[*]# Extra ssh options.  Empty by default.  
[*]# export HBASE_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HBASE_CONF_DIR"  
[*]  
[*]# Where log files are stored.  $HBASE_HOME/logs by default.  
[*]export HBASE_LOG_DIR=/data/hadoop/logs/hbase  
[*]  
[*]# Enable remote JDWP debugging of major HBase processes. Meant for Core Developers   
[*]# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8070"  
[*]# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8071"  
[*]# export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8072"  
[*]# export HBASE_ZOOKEEPER_OPTS="$HBASE_ZOOKEEPER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8073"  
[*]  
[*]# A string representing this instance of hbase. $USER by default.  
[*]# export HBASE_IDENT_STRING=$USER  
[*]  
[*]# The scheduling priority for daemon processes.  See 'man nice'.  
[*]# export HBASE_NICENESS=10  
[*]  
[*]# The directory where pid files are stored. /tmp by default.  
[*]export HBASE_PID_DIR=/var/hadoop/pids  
[*]  
[*]# Seconds to sleep between slave commands.  Unset by default.  This  
[*]# can be useful in large clusters, where, e.g., slave rsyncs can  
[*]# otherwise arrive faster than the master can service them.  
[*]# export HBASE_SLAVE_SLEEP=0.1  
[*]  
[*]# Tell HBase whether it should manage it's own instance of Zookeeper or not.  
[*]export HBASE_MANAGES_ZK=false  
[*]  
[*]# The default log rolling policy is RFA, where the log file is rolled as per the size defined for the   
[*]# RFA appender. Please refer to the log4j.properties file to see more details on this appender.  
[*]# In case one needs to do log rolling on a date change, one should set the environment property  
[*]# HBASE_ROOT_LOGGER to "<DESIRED_LOG LEVEL>,DRFA".  
[*]# For example:  
[*]# HBASE_ROOT_LOGGER=INFO,DRFA  
[*]# The reason for changing default to RFA is to avoid the boundary case of filling out disk space as   
[*]# DRFA doesn't put any cap on the log size. Please refer to HBase-5655 for more context.  

 
 
    到此为之,可以把调整配置之后的hbase安装包,在三台机器上部署,并在bin目录下,我们将node3作为HMaster,所以需要在node3上执行“start-hbase.sh”,此后hbase集群将会全部启动。
 
    可以使用jps指令查看节点是否启动正常,在node3上将会看到“HMaster,HRegionServer”两个进程,其他2个node上只会看到“HRegionServer”进程。
页: [1]
查看完整版本: 【转载】hadoop/hbase 搭建