zoukankan      html  css  js  c++  java
  • HBase的安装与部署

    一、硬件环境

    假设有4台机,IP及主机名如下:

    192.168.100.105 c1
    192.168.100.110 c2
    192.168.100.115 c3
    192.168.100.120 c4

    二、软件环境

    * 这里的ZooKeeper、Hadoop、HBase根目录都放在/home/目录下

    1.安装JDK

    https://www.cnblogs.com/live41/p/14235891.html

    2.安装ZooKeeper

    https://www.cnblogs.com/live41/p/15522363.html

    * 虽然HBase内置了ZooKeeper,但一般是关闭内置版,使用独立部署版(因为还有其它进程需要用到ZooKeeper,以免维护2套)。

    3.安装分布式Hadoop

    https://www.cnblogs.com/live41/p/15483192.html

    三、部署HBase

    1.下载安装包

    http://hbase.apache.org/downloads.html

    下载bin文件,例如hbase-2.4.6-bin.tar

    * 以下步骤在每台机都要执行

    2.上传安装包到服务器并解压

    假设安装在home目录

    cd /home
    rz

    3.解压

    tar -xvf hbase-2.4.6-bin.tar
    mv hbase-2.4.6 hbase

    4.配置环境变量

    vim ~/.bashrc

    在里面加入以下内容:

    export PATH=$PATH:/usr/local/hbase/bin

    保存退出后,更新环境变量:

    source ~/.bashrc

    三、配置HBase

    * 先在c1机执行操作,再用scp把配置文件同步到其它机。

    1.配置hbase-env.sh

    vim /home/hbase/conf/hbase-env.sh

    添加或反注释后添加以下内容:

    export JAVA_HOME=/usr/bin/java1.8.0
    export HBASE_CLASSPATH=/home/hbase/conf
    export HBASE_MANAGES_ZK=false

    2.配置hbase-site.xml

    <configuration>
        <property>
            <name>hbase.rootdir</name>
            <value>hdfs://ns6/hbase</value>  <!--该属性对应的是hdfs-site.xml的dfs.nameservices属性-->
        </property>
        <property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
        </property>
        <property>
            <name>hbase.zookeeper.quorum</name>
            <value>c1:2181,c2:2181,c3:2181,c4:2181</value>
            <!--如果配置为<value>c1,c2,c3,c4</value>,则需要配置hbase.zookeeper.property.clientPort属性-->
        </property>
        <property>
            <name>hbase.master</name>
            <value>60000</value> <!--HBase HA 方式下只需配置端口-->
        </property>
        <!-- <property>
            <name>hbase.zookeeper.property.clientPort</name>
            <value>2181</value>
        </property> -->
    </configuration>

     

    3.配置regionservers

    vim regionservers

    添加以下内容,如果原来有localhost,先删除。

    c1
    c2
    c3
    c4

    这里是对应hosts文件的配置,前面已经提及过。


    4.复制Hadoop的关键配置文件到conf目录

    * 执行这步需要先配置免密登录

    cd /home/hadoop/etc/hadoop
    cp core-site.xml hdfs-site.xml /home/hbase/conf

    * 如果不执行这一步,启动HBase时会报错:

    ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
    java.lang.IllegalArgumentException: java.net.UnknownHostException: ns6

    原因是hbase-site.xml的hbase.rootdir属性使用了dfs.nameservices的值(也就是上面的ns6)。

    如果不用dfs.nameservices的值,而是写死某个NameNode入口(例如c1:9000),则会有单点故障风险。

    5.复制配置文件到其它节点

    scp /home/hbase/conf/*.* c2:/home/hbase/conf
    scp /home/hbase/conf/*.* c3:/home/hbase/conf
    scp /home/hbase/conf/*.* c4:/home/hbase/conf

    四、启动和停止HBase

    1.在主节点机

    * 这里是c1机

    start-hbase.sh

    2.在备用节点机(可选操作)

    * 这里是c2机

    需要手动启动,否则ZooKeeper只会启动1个。也可以选择不启动。

    hbase-daemon.sh start master

    3.停止

    stop-hbase.sh

    五、测试

    1.命令行测试

    登入HBase(跟MySQL类似)

    hbase shell

    hbase shell命令介绍:

    https://blog.csdn.net/vbirdbest/article/details/88236575


    2.浏览器测试

    用浏览器打开:

    http://192.168.100.105:16010/

    HBase v1.0版本之前默认端口是60010,之后的版本是16010。

    3.程序测试

    使用Java编写程序调用HBase API来操作HBase。

    (1) 先配置hosts的机器名和IP映射

    需要先在运行Java程序的机器的hosts文件加入机器名和IP的映射。否则程序运行时会卡死或连接失败。

    192.168.100.105 c1
    192.168.100.110 c2
    192.168.100.115 c3
    192.168.100.120 c4

    (2) 修改Maven配置文件(pom.xml)

    在<dependencies></dependencies>节点内加入:

    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.4.7</version>
    </dependency>

    * 其中三个version节点的2.4.7是对应HBase的版本。例如,安装的HBase是v2.4.0,那三个version节点就填2.4.0

    (3) 实现代码

    创建一张表,表名叫"User",添加2个列族分别叫"login"、"profile"。

    public class HBaseCreateTable
    {
        public static void main(String[] args)
        {
            String quorum = "c1,c2,c3,c4";
            String tableName = "Users";
            String[] familyNames = {"login", "profile"};
            try
            {
                createTable(quorum, tableName, familyNames);
            }
            catch (Exception e)
            {
                System.out.println(e);
            }
        }
    
        private static void createTable(String quorum, String tableName, String[] familyNames) throws Exception
        {
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", quorum);
    
            Connection conn = ConnectionFactory.createConnection(conf);
            Admin admin = conn.getAdmin();
            TableName tb = TableName.valueOf(tableName);
            if (!admin.tableExists(tb))
            {
                TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tb);
                for (String name : familyNames)
                {
                    ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.of(name);
                    builder.setColumnFamily(cfd);
                }
                TableDescriptor desc = builder.build();
                admin.createTable(desc);
            }
    
            if (admin != null)
            {
                admin.close();
            }
            if (conn != null)
            {
                conn.close();
            }
        }
    }

    * 切记务必要执行第(1)点,否则程序运行会卡死。

    参考文章:https://www.cnblogs.com/live41/p/15504691.html

    附录:hbase-site.xml参数说明

    • hbase.rootdir

    这个目录是 RegionServer 的共享目录,用来持久化 HBase。特别注意的是 hbase.rootdir 里面的 HDFS 地址是要跟 Hadoop 的 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致。(HA环境下,dfs.nameservices  是由zookeeper来决定的)

    • hbase.cluster.distributed

    HBase 的运行模式。为 false 表示单机模式,为 true 表示分布式模式。若为 false,HBase 和 ZooKeeper 会运行在同一个 JVM 中

    • hbase.master

    如果只设置单个 Hmaster,那么 hbase.master 属性参数需要设置为 master:60000 (主机名:60000)

    如果要设置多个 Hmaster,那么我们只需要提供端口 60000,因为选择真正的 master 的事情会有 zookeeper 去处理

    • hbase.tmp.dir

    本地文件系统的临时文件夹。可以修改到一个更为持久的目录上。(/tmp会在重启时清除)

    • hbase.zookeeper.quorum

    对于 ZooKeeper 的配置。至少要在 hbase.zookeeper.quorum 参数中列出全部的 ZooKeeper 的主机,用逗号隔开。该属性值的默认值为 localhost,这个值显然不能用于分布式应用中。

    • hbase.zookeeper.property.dataDir

    这个参数用户设置 ZooKeeper 快照的存储位置,默认值为 /tmp,显然在重启的时候会清空。因为笔者的 ZooKeeper 是独立安装的,所以这里路径是指向了 $ZOOKEEPER_HOME/conf/zoo.cfg 中 dataDir 所设定的位置。

    • hbase.zookeeper.property.clientPort

    客户端连接 ZooKeeper 的端口。默认是2181。

    • zookeeper.session.timeout

    ZooKeeper 会话超时。Hbase 把这个值传递改 zk 集群,向它推荐一个会话的最大超时时间

    • hbase.regionserver.restart.on.zk.expire

    当 regionserver 遇到 ZooKeeper session expired , regionserver 将选择 restart 而不是 abort。

  • 相关阅读:
    Scrapy 扩展中间件: 针对特定响应状态码,使用代理重新请求
    Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
    Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
    Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API
    简单示例理解神闭包
    ejs 模板使用方法
    我使用的开源组件汇总,以备学习使用
    了不起的Node.js--之五 TCP连接
    Windows7下Java运行时环境搭建
    了不起的Node.js--之四
  • 原文地址:https://www.cnblogs.com/live41/p/15494279.html
Copyright © 2011-2022 走看看