Apache HBase 是 Apache Hadoop 项目的子项目,是 Hadoop Database 的简称。HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。

HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,HBase 基于列的而不是基于行的模式。HBase 是构建在 Apache Hadoop 和 Apache Zookeeper 之上。

Apache HBase: https://hbase.apache.org/

Apache Hadoop 是 Apache 基金会旗下的一个开源的分布式计算平台,是基于 Java 语言开发的,有很好的跨平台特性,并且可以部署在廉价的计算机集群中。用户无需了解分布式底层细节,就可以开发分布式程序,充分利用集群的威力进行高速运算和存储。

Apache Hadoop: http://hadoop.apache.org/

安装配置 Apache HBase 之前,需要先安装配置 Apache Hadoop 和 Apache Zookeeper,本文先介绍 Apache Hadoop 的安装配置过程。Java 环境搭建可以参考 “Java基础知识(1)- Java 简介、开发环境配置和基础语法”。

 

1. 系统环境

    操作系统:Ubuntu 20.04
    Java 版本:openjdk 11.0.18
    Hadoop 版本:3.2.2

 

2. 安装配置 Hadoop

    1) 下载 Hadoop

        访问 https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz 页面,下载 hadoop-3.2.2.tar.gz 保存到 ~/apps 目录,apps 目录是当前 Linux 用户 (假设为 xxx) 下的目录,即 /home/xxx/apps。

   

$ cd  ~/apps 
        $ tar -zvxf hadoop-3.2.2.tar.gz

    2) 配置 SSH 本地无密码访问

       

$ cd ~/.ssh

        # 生成 rsa 钥匙,并把公钥添加到 authorized_keys
        $ ssh-keygen -t rsa
        $ cat ./id_rsa.pub >> ./authorized_keys

        $ ssh localhsot     # 不需要输入密码

    3) 创建 hadoop 用户和组

       

$ sudo addgroup hadoop              # 创建 hadoop 组  
        $ sudo usermod -a -G hadoop xxx    # 将当前用户(xxx)加入到 hadoop 组
        $ sudo vim /etc/sudoers             # 将 hadoop 组加入到 sudoer

            ...

            hadoop ALL=(ALL:ALL) ALL   #  在 root ALL=(ALL:ALL) ALL 后添加这一行

        $ sudo chmod -R 755 ~/apps/hadoop-3.2.2
        $ sudo chown -R xxx:hadoop ~/apps/hadoop-3.2.2    # 否则 SSH 会拒绝访问

    4) 添加 HADOOP_HOME

        $ sudo vim /etc/profile

...

            JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
            JRE_HOME=$JAVA_HOME/jre
            HADOOP_HOME=/home/xxx/apps/hadoop-3.2.2
            CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
            PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin
            export JAVA_HOME JRE_HOME HADOOP_HOME CLASS_PATH PATH

 

     

$ source /etc/profile
        $ echo $HADOOP_HOME

            /home/xxx/apps/hadoop-3.2.2

 

3. 命令行模式运行 Hadoop

   

# 查看 hadoop 版本 
    $ hadoop version    

        Hadoop 3.2.2

        ...
    
    # 示例:运行 hadoop 命令统计 hadoop-3.2.2 根目录下的 README.txt 文件里的单词
    $ cd ~/apps/hadoop-3.2.2

    $ mkdir input
    $ cp README.txt input
    
    $ hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-3.2.2-sources.jar org.apache.hadoop.examples.WordCount input output
2023-03-21 11:31:49,370 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
        2023-03-21 11:31:49,436 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
        2023-03-21 11:31:49,436 INFO impl.MetricsSystemImpl: JobTracker metrics system started
        2023-03-21 11:31:49,547 INFO input.FileInputFormat: Total input files to process : 1
        2023-03-21 11:31:49,566 INFO mapreduce.JobSubmitter: number of splits:1
        2023-03-21 11:31:49,716 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local1035722801_0001
        2023-03-21 11:31:49,716 INFO mapreduce.JobSubmitter: Executing with tokens: []
        2023-03-21 11:31:49,820 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
        2023-03-21 11:31:49,821 INFO mapreduce.Job: Running job: job_local1035722801_0001
        2023-03-21 11:31:49,827 INFO mapred.LocalJobRunner: OutputCommitter set in config null
        2023-03-21 11:31:49,831 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 2

        ...

    注:运行成功,统计结果以本地文件格式保存在 output 目录下,这里没有用到 Hadoop 文件系统(HDFS),所以不需要配置和启动 HDFS。

 

4. 配置伪分布式 Hadoop

    Hadoop 可以在单节点(或一台主机)上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。


    HDFS (Hadoop Distributed File System),是一个分布式文件系统,用于存储文件,通过目录树来定位文件。HDFS 是适合一次写入,多次读出的场景,不支持文件修改,适用于做离线数据统计和分析的场合。


    主机名:hadoop-master-vm

    主机名映射 (/etc/hosts):

   

   

127.0.0.1        localhost
        192.168.0.3    hadoop-master-vm


        注:可以运行命令 sudo hostnamectl set-hostname hadoop-master-vm 来修改主机名。

    1) 配置 HDFS

    

$ cd ~/apps/hadoop-3.2.2

        # 配置 Hadoop 系统参数
        $ vim ./etc/hadoop/core-site.xml
<configuration>
                <property>
                    <name>hadoop.tmp.dir</name>
                    <value>file:/home/xxx/apps/hadoop-3.2.2/tmp</value>
                    <description>A base for other temporary directories.</description>
                </property>
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://hadoop-master-vm:9000</value>
                </property>
            </configuration>

           
            *注:路径里的 ‘xxx’ 是 Linux 用户的 home 目录名,下同

        # 配置 Hadoop 文件系统(hdfs)
        $ vim ./etc/hadoop/hdfs-site.xml

<configuration>
                <property>
                    <name>dfs.replication</name>
                    <value>1</value>
                </property>
                <property>
                    <name>dfs.http.address</name>
                    <value>0.0.0.0:50070</value>
                </property>       
                <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>file:/home/xxx/apps/hadoop-3.2.2/data/dfs/name</value>
                </property>
                <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/home/xxx/apps/hadoop-3.2.2/data/dfs/data</value>
                </property>
            </configuration>

        # 格式化 hdfs
        $ hdfs namenode -format

    2) 配置 JAVA_HOME    

      

$ cd ~/apps/hadoop-3.2.2

        # 在 hadoop-env.sh 文件最后添加 JAVA_HOME
        $ vim ./etc/hadoop/hadoop-env.sh

            ...

            export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

    3) 运行 HDFS

     

$ cd ~/apps/hadoop-3.2.2

        # 启动 dfs
        $ ./sbin/start-dfs.sh
Starting namenodes on [hadoop-master-vm]
            Starting datanodes
            Starting secondary namenodes [hadoop-master-vm]
            hadoop-master-vm: Warning: Permanently added 'hadoop-master-vm' (ECDSA) to the list of known hosts.

        # 运行 jps 查看
        $ jps

11457 Jps
            10946 NameNode
            11117 DataNode
            11326 SecondaryNameNode

            注:NameNode 和 DataNode 都要出现,可以访问 http://hadoop-master-vm:50070 (或 http://ip:50070) 查看节点信息

       

# 停止 dfs 
        $ ./sbin/stop-dfs.sh
Stopping namenodes on [hadoop-master-vm]
            Stopping datanodes
            Stopping secondary namenodes [hadoop-master-vm]

    4) HDFS 操作

     

$ cd ~/apps/hadoop-3.2.2

        # 启动 dfs
        $ ./sbin/start-dfs.sh        # 查看信息
        $ hdfs dfsadmin -report
Configured Capacity: 30994796544 (28.87 GB)
            Present Capacity: 10013954048 (9.33 GB)
            DFS Remaining: 10013921280 (9.33 GB)
            DFS Used: 32768 (32 KB)
            DFS Used%: 0.00%
            
            ...

       

# 创建目录
        $ hdfs dfs -mkdir /test

        # 把文件放入本地
        $ hdfs dfs -put README.txt /test

        # 递归显示目录
        $ hdfs dfs -ls -R /

            drwxr-xr-x   - xxx supergroup          0 2023-03-20 22:11 /test
            -rw-r--r--   1 xxx supergroup       1361 2023-03-20 22:11 /test/README.txt

        # 从本地获取文件
        $ hdfs dfs -get /test/README.txt

            get: `README.txt': File exists

        # 删除目录
        $ hdfs dfs -rm -r /test

            Deleted /test

    5) 配置 Yarn (可选项)

        Apache Hadoop Yarn 是 Apache Hadoop 的子项目,Hadoop 2.0 开始引入 Yarn 框架。Yarn 担着原本由 MapReduce 承担的资源管理的功能,同时将这部分功能打包,使得这些功能可以被其它数据处理框架(引擎)使用,比如:Spark 框架。

        引入 Yarn 框架简化了 MapReduce 的流程,使得 MapReduce 专注于数据处理。使用 Yarn,可以用共同的资源管理,在 Hadoop 上跑很多应用程序。

        (1) 配置文件

      

$ cd ~/apps/hadoop-3.2.2

            $ vim ./etc/hadoop/mapred-site.xml
<configuration>
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>

            $ vim ./etc/hadoop/yarn-site.xml

<configuration>
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value>
                    </property>
                </configuration>

 

        (2) 启动

# 启动 HDFS
            $ ./sbin/start-dfs.sh

            # 启动 Yarn
            $ ./sbin/start-yarn.sh

            # 启动 Jobhistory Server (可选项)
            $ ./bin/mapred --daemon start historyserver    # 在 Hadoop 3.x,命令 ./sbin/mr-jobhistory-daemon.sh start historyserver 已经不推荐使用,仍可以执行

            # 运行 jps 查看
66997 Jps
                66934 JobHistoryServer
                65992 DataNode
                65816 NameNode
                66203 SecondaryNameNode
                66575 NodeManager
                66398 ResourceManager

       
            启动 Yarn 后,可以访问 http://hadoop-master-vm:8088/cluster (或 http://ip:8088/cluster) 查看任务的运行情况。

            启动 Jobhistory Server 后,可以访问 http://hadoop-master-vm:19888 (或 http://ip:19888) 查看 Job History。

            注:Jobhistory Server 不依赖于 Yarn,即 Yarn 不运行时,也可以启动 Jobhistory Server。如果需要调整 Jobhistory Server 的配置参数,可以修改 ./etc/hadoop/mapred-site.xml,比如:

<configuration>

                    ...

                    <!-- Jobhistory Server -->
                    <property>
                        <name>mapreduce.jobhistory.address</name>
                        <value>0.0.0.0:10020</value>
                    </property>
                    <property>
                        <name>mapreduce.jobhistory.webapp.address</name>
                        <value>0.0.0.0:19888</value>
                    </property>
                </configuration>

        (3) 停止

          

# 停止 Jobhistory Server
            $ ./bin/mapred --daemon stop historyserver    # 在 Hadoop 3.x,命令 ./sbin/mr-jobhistory-daemon.sh stop historyserver 已经不推荐使用,仍可以执行

            # 停止 Yarn
            $ ./sbin/stop-yarn.sh

            # 停止 HDFS
            $ ./sbin/stop-dfs.sh



        注:不启用 Yarn 时,是 “mapred.LocalJobRunner” 在运行任务(管理资源)。启用 Yarn 之后,是 “mapred.YARNRunner” 在运行任务(管理资源)。

 

5. 配置集群/分布式 Hadoop

    部署 1 台主机(主机名:hadoop-master-vm)和 1 台辅机(hadoop-slave-vm),配置主辅机之间 SSH 无密码访问,即把各自的 ~/.ssh/id_rsa.pub 放入对方的 ~/.ssh/authorized_keys 中。

    修改两台主机的 /etc/hosts,内容如下:
   
      

127.0.0.1    localhost

        192.168.0.3    hadoop-master-vm
        192.168.0.4    hadoop-slave-vm

        ...

 

    1) 主机的 Hadoop 配置

        (1) 配置 HDFS

       

$ cd ~/apps/hadoop-3.2.2

            # 配置 Hadoop 系统参数
            $ vim ./etc/hadoop/core-site.xml<configuration>
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>file:/home/xxx/apps/hadoop-3.2.2/tmp</value>
                        <description>Abase for other temporary directories.</description>
                    </property>
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://hadoop-master-vm:9000</value>
                    </property>
                </configuration>
<configuration>
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>file:/home/xxx/apps/hadoop-3.2.2/tmp</value>
                        <description>Abase for other temporary directories.</description>
                    </property>
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://hadoop-master-vm:9000</value>
                    </property>
                </configuration>

            # 配置 Hadoop 文件系统(hdfs)
            $ vim ./etc/hadoop/hdfs-site.xml

<configuration>
                    <property>
                        <name>dfs.replication</name>
                        <value>1</value>
                    </property>
                    <property>
                    <name>dfs.http.address</name>
                    <value>hadoop-master-vm:50070</value>
                    </property>       
                    <property>
                        <name>dfs.namenode.name.dir</name>
                        <value>file:/home/xxx/apps/hadoop-3.2.2/data/dfs/name</value>
                    </property>
                    <property>
                        <name>dfs.datanode.data.dir</name>
                        <value>file:/home/xxx/apps/hadoop-3.2.2/data/dfs/data</value>
                    </property>
                </configuration>

          

# 格式化 hdfs
            $ hdfs namenode -format



        (2) 配置 JAVA_HOME 和 Workers

         

$ cd ~/apps/hadoop-3.2.2

            # 在 hadoop-env.sh 文件最后添加 JAVA_HOME
            $ vim ./etc/hadoop/hadoop-env.sh

                ...

                export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

            # 在 workers 里添加辅机的 hostname 
            $ vim ./etc/hadoop/workers

                #localhost
                hadoop-slave-vm



        (3) 配置 yarn (可选项)

$ cd ~/apps/hadoop-3.2.2

            $ vim ./etc/hadoop/mapred-site.xml
<configuration>
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                    <property>
                        <name>mapreduce.jobhistory.address</name>
                        <value>hadoop-master-vm:10020</value>
                    </property>
                    <property>
                        <name>mapreduce.jobhistory.webapp.address</name>
                        <value>hadoop-master-vm:19888</value>
                    </property>
                </configuration>

            $ vim ./etc/hadoop/yarn-site.xml

<configuration>
                    <property>
                        <name>yarn.resourcemanager.hostname</name>
                        <value>hadoop-master-vm</value>
                    </property>
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value>
                    </property>
                </configuration>

 

    2) 辅机的 Hadoop 配置

        把主机的 hadoop 目录(~/apps/hadoop-3.2.2)完全同步到辅机上,辅机的 JAVA_HOME、HADOOP_HOME 等参考主机的配置。

    3) 在主机上运行

     

$ cd ~/apps/hadoop-3.2.2

        # 启动 HDFS
        $ ./sbin/start-dfs.sh
        
        # 启动 Yarn
        $ ./sbin/start-yarn.sh 

        # 启动 Jobhistory Server (可选项)
        $ ./bin/mapred --daemon start historyserver 

        # 主机上查看节点
        $ jps
6807 NameNode
            7752 ResourceManager
            7082 SecondaryNameNode
            8171 Jps

        # 查看 report
        $ hdfs dfsadmin -report

Configured Capacity: 490651459584 (456.95 GB)
            Present Capacity: 410068922368 (381.91 GB)
            DFS Remaining: 410068877312 (381.91 GB)
            DFS Used: 45056 (44 KB)
            DFS Used%: 0.00%
            ...

    4) 在辅机上运行

     

# 查看节点
        $ jps
2368 remoting.jar
            6192 DataNode
            20802 Jps

      

# 查看 report
        $ hdfs dfsadmin -report



            ...

    5) Web 界面

    

# Hadoop node
        http://hadoop-master-vm:50070/    
        # Hadoop cluster
        http://hadoop-master-vm:8088/cluster  

        # Job history
        http://hadoop-master-vm:19888

6. 配置 Web 界面 Simple 安全机制

$ cd ~/apps/hadoop-3.2.2

    # 修改 core-site.xml, 添加如下内容
    $ vim ./etc/hadoop/core-site.xml
<configuration>

            ...

            <property>
                <name>hadoop.http.filter.initializers</name>
                <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
            </property>

            <!-- 验证类型:simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME# -->
            <property>
                <name>hadoop.http.authentication.type</name>
                <value>simple</value>
            </property>

            <!-- 是否允许匿名访问 -->
            <property>
                <name>hadoop.http.authentication.simple.anonymous.allowed</name>
                <value>false</value>
            </property>

            <!-- 密钥文件 -->
            <property>
                <name>hadoop.http.authentication.signature.secret.file</name>
                <value>/home/xxx/apps/hadoop-3.2.2/etc/hadoop-auth.secret</value>
            </property>


        </configuration>

   

# 创建 hadoop-auth.secret 文件 
    $ vim ./etc/hadoop-auth.secret

        hadoop123

    重启 Hadoop,访问 http://hadoop-master-vm:50070 (或 http://ip:50070),显示如下:

        HTTP ERROR 401
        Problem accessing /index.html. Reason:

            Authentication required


    
    表示安全验证已经生效,在 URL 后添加 user.name 参数 http://hadoop-master-vm:50070?user.name=hadoop123,进入 Hadoop node 页面。

    以上 Simple 安全机制,对 Hadoop cluster 页面和 Job history 页面也已经生效。