Springboot 系列 (23) - Springboot+HBase 大数据存储(一)| 安装配置 Apache Hadoop
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>
# 配置 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 页面也已经生效。