Springboot 系列 (23) - Springboot+HBase 大数据存储(一)| 安装配置 Apache Hadoop

发布时间 2023-03-22 23:19:12作者: 垄山小站


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 是适合一次写入,多次读出的场景,不支持文件修改,适用于做离线数据统计和分析的场合。

    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://localhost: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/tmp/dfs/name</value>
                </property>
                <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/home/xxx/apps/hadoop-3.2.2/tmp/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 [localhost]
            Starting datanodes
            Starting secondary namenodes [Test-Ubuntu20]
            Test-Ubuntu20: Warning: Permanently added 'test-ubuntu20' (ECDSA) to the list of known hosts.


        # 运行 jps 查看
        $ jps

            11457 Jps
            10946 NameNode
            11117 DataNode
            11326 SecondaryNameNode

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

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

            Stopping namenodes on [localhost]
            Stopping datanodes
            Stopping secondary namenodes [Test-Ubuntu20]

    4) HDFS 操作

        # 查看信息
        $ 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://localhost:8088/cluster (或 http://ip:8088/cluster) 查看任务的运行情况。

            启动 Jobhistory Server 后,可以访问 http://localhost: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>


            # 配置 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/tmp/dfs/name</value>
                    </property>
                    <property>
                        <name>dfs.datanode.data.dir</name>
                        <value>file:/home/xxx/apps/hadoop-3.2.2/tmp/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