0


Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive

说明

Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive 完全分布式高可用集群搭建

下载

https://archive.apache.org/dist/

Mysql下载地址

Index of /MySQL/Downloads/

我最终选择 Zookeeper3.7.1 +Hadoop3.3.5 + Spark-3.2.4 + Flink-1.16.1 + Kafka2.12-3.4.0 + HBase2.4.17 + Hive3.1.3** +JDK1.8.0_391**

一、服务器

IP规划
IPhostname192.168.1.5node1192.168.1.6node2192.168.1.7node3

二、系统配置

2.1配置hostname、ip

  1. hostnamectl set-hostname node1
  2. hostnamectl set-hostname node2
  3. hostnamectl set-hostname node3

2.2编辑hosts

vim /etc/hosts

  1. [root@node1 ~]# cat >> /etc/hosts << EOF
  2. 192.168.1.5 node1
  3. 192.168.1.6 node2
  4. 192.168.1.7 node3
  5. EOF
  6. [root@node1 ~]# for i in {5,6,7}
  7. do
  8. scp /etc/hosts 192.168.1.$i:/etc/hosts
  9. done

2.3优化ssh连接

优化ssh连接

  1. #优化ssh连接速度
  2. vim /etc/ssh/sshd_config
  3. UseDNS no
  4. GSSAPIAuthentication no
  5. #或者写成
  6. sed -i 's/#UseDNS\ yes/UseDNS\ no/g; s/GSSAPIAuthentication\ yes/GSSAPIAuthentication\ no/g' /etc/ssh/sshd_config
  7. systemctl restart sshd

2.4配置时间同步

  1. #以node1为服务端
  2. [root@node1 ~]# yum install chrony -y
  3. [root@node1 ~]# grep -vE '^#|^$' /etc/chrony.conf
  4. pool ntp.aliyun iburst
  5. driftfile /var/lib/chrony/drift
  6. makestep 1.0 3
  7. rtcsync
  8. allow 192.168.0.0/24
  9. local stratum 10
  10. logdir /var/log/chrony
  11. [root@node1 ~]# systemctl enable --now chronyd
  12. [root@node1 ~]# chronyc sources -v
  13. 210 Number of sources = 1
  14. .-- Source mode '^' = server, '=' = peer, '#' = local clock.
  15. / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
  16. | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
  17. || .- xxxx [ yyyy ] +/- zzzz
  18. || Reachability register (octal) -. | xxxx = adjusted offset,
  19. || Log2(Polling interval) --. | | yyyy = measured offset,
  20. || \ | | zzzz = estimated error.
  21. || | | \
  22. MS Name/IP address Stratum Poll Reach LastRx Last sample
  23. ===============================================================================
  24. ^* 203.107.6.88 2 6 7 0 +54ms[ +69ms] +/- 193ms
  25. #其他节点为客户端
  26. #node2配置
  27. [root@node2 ~]# yum install chrony -y
  28. [root@node2 ~]# grep -vE '^#|^$' /etc/chrony.conf
  29. pool 192.168.1.11 iburst
  30. driftfile /var/lib/chrony/drift
  31. makestep 1.0 3
  32. rtcsync
  33. logdir /var/log/chrony
  34. [root@node2 ~]# systemctl enable --now chronyd
  35. #验证
  36. [root@node2 ~]# chronyc sources -v
  37. 210 Number of sources = 1
  38. .-- Source mode '^' = server, '=' = peer, '#' = local clock.
  39. / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
  40. | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
  41. || .- xxxx [ yyyy ] +/- zzzz
  42. || Reachability register (octal) -. | xxxx = adjusted offset,
  43. || Log2(Polling interval) --. | | yyyy = measured offset,
  44. || \ | | zzzz = estimated error.
  45. || | | \
  46. MS Name/IP address Stratum Poll Reach LastRx Last sample
  47. ===============================================================================
  48. ^? node1 0 6 0 - +0ns[ +0ns] +/- 0ns
  49. #node3配置
  50. [root@node3 ~]# yum install chrony -y
  51. [root@node3 ~]# scp 192.168.1.12:/etc/chrony.conf /etc/chrony.conf
  52. [root@node3 ~]# systemctl enable --now chronyd
  53. #验证
  54. [root@node3 ~]# chronyc sources -v
  55. 210 Number of sources = 1
  56. .-- Source mode '^' = server, '=' = peer, '#' = local clock.
  57. / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
  58. | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
  59. || .- xxxx [ yyyy ] +/- zzzz
  60. || Reachability register (octal) -. | xxxx = adjusted offset,
  61. || Log2(Polling interval) --. | | yyyy = measured offset,
  62. || \ | | zzzz = estimated error.
  63. || | | \
  64. MS Name/IP address Stratum Poll Reach LastRx Last sample
  65. ===============================================================================
  66. ^? node1 0 6 0 - +0ns[ +0ns] +/- 0ns

2.5关闭防火墙和selinux

  1. #永久关闭防火墙
  2. [root@node1 ~]#for i in {5,6,7}
  3. do
  4. ssh 192.168.1.$i "systemctl disable --now firewalld"
  5. done
  6. #永久关闭selinux
  7. [root@node1 ~]# for i in {5,6,7}
  8. do
  9. ssh 192.168.1.$i "setenforce 0 && sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config"
  10. done

2.6修改文件打开限制

  1. [root@node1 ~]# vim /etc/security/limits.conf
  2. #End of file
  3. * soft nofile 65536
  4. * hard nofile 65536
  5. * soft nproc 131072
  6. * hard nproc 131072
  7. [root@node1 ~]# for i in {node2,node3}
  8. do
  9. scp /etc/security/limits.conf $i:/etc/security/limits.conf
  10. done

2.7JDK环境

本次安装hadoop3.3.5,根据官网描述Apache Hadoop 3.3.5需要Java 8以上或Java 11才能运行,这里建议使用Java 8;查看habase与jdk对应版本,根据官方描述,建议安装使用 JDK8

上传jdk-8u391-linux-x64.tar.gz

解压

tar -zxvf jdk-8u391-linux-x64.tar.gz -C /usr/local

  1. 配置java环境变量
  2. [root@node1 ~]# cat >> .bash_profile << 'EOF'
  3. #Java环境变量
  4. export JAVA_HOME=/usr/local/jdk1.8.0_391
  5. export PATH=$PATH:$JAVA_HOME/bin
  6. EOF
  7. #让配置环境变量生效
  8. [root@node1 ~]# source .bash_profile
  9. #其他节点重复上述步骤安装,或者直接发送过去
  10. [root@node1 ~]# for i in {node2,node3}
  11. do
  12. scp -r /usr/local/jdk1.8.0_391/ $i:/usr/local/
  13. scp /root/.bash_profile $i:/root/
  14. done

2.8创建大数据用户

创建用户

adduser bigdata

设置密码

passwd bigdata

2.9配置免密登录

node1节点操作

切换用户

su bigdata

  1. ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  1. for i in {5,6,7}
  2. do
  3. ssh-copy-id 192.168.1.$i
  4. done

三、部署zookeeper集群

node1服务

su bigdata

下载上传apache-zookeeper-3.7.1-bin.tar.gz 到bigdata用户

tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

mv apache-zookeeper-3.7.1-bin zookeeper

配置zookeeper

  1. cd zookeeper/conf/
  2. cp zoo_sample.cfg zoo.cfg
  3. #修改完如下
  4. [bigdata@node1 conf]# grep -Ev '^#|^$' zoo.cfg
  5. tickTime=2000
  6. initLimit=10
  7. syncLimit=5
  8. dataDir=/home/bigdata/zookeeper/data
  9. clientPort=2181
  10. server.1=node1:2888:3888
  11. server.2=node2:2888:3888
  12. server.3=node3:2888:3888

说明:Zookeeper 集群中有三种角色:Leader、Follower 和 Observer。在一个 Zookeeper 集群中,同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。Zookeeper 的配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样 ,Observer 角色是在 Zookeeper 集群中的一种特殊角色,它的作用是在集群中提供一个只读服务,不参与 Leader 选举,不参与写操作,只是接收 Leader 发送的数据变更通知,并将这些变更通知转发给客户端

设置myid

  1. cd ..
  2. mkdir data
  3. echo 1>data/myid

配置zk环境变量

  1. bigdata@node1 zookeeper]# cd
  2. [bigdata@node1 ~]# cat >> .bash_profile << 'EOF'
  3. #zookeeper环境变量
  4. export ZOOKEEPER_HOME=/home/bigdata/zookeeper
  5. export PATH=$PATH:$ZOOKEEPER_HOME/bin
  6. EOF
  7. [root@node1 ~]# source .bash_profile

分发文件到其他节点并配置

  1. #将zookeeper文件夹发送到其他节点
  2. [bigdata@node1 ~]$ for i in {node2,node3}
  3. do
  4. scp -r ~/zookeeper $i:~/
  5. scp ~/.bash_profile $i:~/
  6. done
  7. #修改其他节点的myid
  8. [bigdata@node2 ~]$ echo 2 > ~/zookeeper/data/myid
  9. [bigdata@node3 ~]$ echo 3 > ~/zookeeper/data/myid

启动,停止,重启服务

  1. #所有节点启动,需要在每个节点执行
  2. zkServer.sh start
  3. #编写脚本对zookeeper集群实现批量启动,停止,重启
  4. [bigdata@node1 ~]$ cat > zkserver_manage_all.sh << 'EOF'
  5. #!/bin/bash
  6. echo "$1 zkServer ..."
  7. for i in node1 node2 node3
  8. do
  9. ssh $i "source ~/.bash_profile && zkServer.sh $1"
  10. done
  11. EOF
  12. #添加可执行权限
  13. [bigdata@node1 ~]$ chmod +x zkserver_manage_all.sh
  14. #启动
  15. [bigdata@node1 ~]$ ./zkserver_manage_all.sh start
  16. #停止
  17. [bigdata@node1 ~]$ ./zkserver_manage_all.sh stop
  18. #重启
  19. [bigdata@node1 ~]$ ./zkserver_manage_all.sh restart
  20. [bigdata@node1 ~]$ mv zkserver_manage_all.sh ~/zookeeper/bin/

查看状态

  1. #查看服务状态,只能查看执行节点的zookeeper状态
  2. zkServer.sh status
  3. #通过编写脚本实现批量检查
  4. [bigdata@node1 ~]$ cat > zkstatus_all.sh << 'EOF'
  5. #!/bin/bash
  6. for node in {node1,node2,node3}
  7. do
  8. status=$(ssh $node 'source ~/.bash_profile && zkServer.sh status 2>&1 | grep Mode')
  9. if [[ $status == "Mode: follower" ]];then
  10. echo "$node是从节点"
  11. elif [[ $status == "Mode: leader" ]];then
  12. echo "$node是主节点"
  13. else
  14. echo "未查询到$node节点zookeeper状态,请检查服务"
  15. fi
  16. done
  17. EOF
  18. #添加执行权限
  19. [bigdata@node1 ~]$ chmod +x zkstatus_all.sh
  20. #通过脚本查看主从
  21. [bigdata@node1 ~]$ ./zkstatus_all.sh
  22. node1是从节点
  23. node2是主节点
  24. node3是从节点

四、部署Hadoop集群

介绍:
Hadoop 是一个开源的分布式计算平台,其中包含了一个分布式文件系统 HDFS。在 HDFS 中,NameNode 和 DataNode 是两个重要的组件。NameNode 是 HDFS 的主服务器,负责管理文件系统的命名空间和客户端对文件的访问。DataNode 是存储实际数据块的服务器,负责存储和检索数据块。

具体来说,NameNode 负责维护整个文件系统的目录树和文件元数据信息,包括文件名、文件属性、文件块列表等。它还负责处理客户端的读写请求,并将这些请求转发给相应的 DataNode。DataNode 负责存储和检索数据块,并向 NameNode 定期汇报自己所持有的数据块列表。

NameNode 和 DataNode 的主要区别在于它们所管理的信息不同。NameNode 管理文件系统的元数据信息,而 DataNode 管理实际的数据块。

本次安装的Hadoop集群为3个节点,两个namenode,三个datanode,规划如下:
IP节点NameNodeDataNode192.168.1.5node1YY192.168.1.6node2YY192.168.1.7node3NY
下载上传hadoop-3.3.5.tar.gz

解压并配置环境变量

  1. #解压缩
  2. [bigdata@node1 ~]$ tar -xf hadoop-3.3.5.tar.gz -C /home/bigdata/
  3. [bigdata@node1 ~]$ mv ~/hadoop-3.3.5/ ~/hadoop
  4. #配置hadoop环境变量
  5. [bigdata@node1 ~]$ cat >> /root/.bash_profile << 'EOF'
  6. #Hadoop环境变量
  7. export HADOOP_HOME=/home/bigdata/hadoop
  8. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  9. EOF
  10. [bigdata@node1 ~]$ source ~/.bash_profile
  11. #验证
  12. [bigdata@node1 ~]$ hadoop version
  13. Hadoop 3.3.5
  14. Source code repository https://github/apache/hadoop.git -r 706d88266abcee09ed78fbaa0ad5f74d818ab0e9
  15. Compiled by stevel on 2023-03-15T15:56Z
  16. Compiled with protoc 3.7.1
  17. From source with checksum 6bbd9afcf4838a0eb12a5f189e9bd7
  18. This command was run using /opt/bigdata/hadoop-3.3.5/share/hadoop/common/hadoop-common-3.3.5.jar

创建hadoop需要用到的目录

  1. #所有节点执行,不然启动服务会报错,可以根据自己hdfs-site.xml文件自行配置
  2. [bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
  3. [bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
  4. [bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
  5. [bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
  6. [bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
  7. [bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
  8. [bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
  9. [bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
  10. [bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
  11. [bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
  12. [bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
  13. [bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
  14. #一次执行方式
  15. mkdir -p /home/bigdata/data/hadoop/tmp && mkdir -p /home/bigdata/data/hadoop/hdfs/name && mkdir -p /home/bigdata/data/hadoop/hdfs/data && mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn

配置集群节点

  1. workers

文件是用来指定Hadoop集群中所有的工作节点(即DataNode和NodeManager节点)的配置文件

  1. [bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
  2. [bigdata@node1 hadoop]$ cat > workers << 'EOF'
  3. node1
  4. node2
  5. node3
  6. EOF

修改核心配置文件

  1. #三个节点配置一样
  2. [bigdata@node1 hadoop]$ vim core-site.xml
  3. <configuration>
  4. <property>
  5. <!--配置默认的文件系统-->
  6. <name>fs.defaultFS</name>
  7. <!--用的是HDFS作为文件系统,还要指定HDFS放在哪台主机上运行,9000默认端口号,如果配置了HA,fs.defaultFs的值应该是nameservice的名称,如hdfs-site.xml文件中dfs.nameservices的值为mycluster,此处填写hdfs://mycluster-->
  8. <value>hdfs://mycluster</value>
  9. </property>
  10. <property>
  11. <name>hadoop.tmp.dir</name>
  12. <value>/home/bigdata/data/hadoop/tmp</value>
  13. </property>
  14. <property>
  15. <name>ha.zookeeper.quorum</name>
  16. <value>node1:2181,node2:2181,node3:2181</value>
  17. <!--HDFS连接zookeeper集群的地址和端口-->
  18. </property>
  19. <property>
  20. <name>ipc.client.connect.max.retries</name>
  21. <value>100</value>
  22. <!--设置重连次数,默认10次-->
  23. </property>
  24. <property>
  25. <name>ipc.client.connect.retry.interval</name>
  26. <value>10000</value>
  27. <!--设置客户端在重试建立服务器连接之前等待的毫秒数,默认1000-->
  28. </property>
  29. <property>
  30. <name>io.file.buffer.size</name>
  31. <value>65536</value>
  32. <!--设置在读写数据时的缓存大小,这个缓存区的大小应该是硬件页面大小的倍数(在 Intel x86 上是 4096),它决定了在读写操作中缓冲了多少数据。较大的缓存可以提供更高的数据传输,但这也意味着更大的内存消耗和延迟.默认情况下,io.file.buffer.size 的值为 4096,但是建议将其设置为6553664k),也可以设置更高,比如131702等-->
  33. </property>
  34. </configuration>

修改HDFS配置文件

  1. #多master高可用配置,所有节点配置一样
  2. #HA中的NameNode最少要有2个,也可以配置更多。建议不要超过5个,最好是3个,因为更多的NameNode意味着更多的通讯开销。
  3. #fencing 和 edits 在实验中,如果你不想配置,可以去掉
  4. [bigdata@node1 hadoop]$ vim hdfs-site.xml
  5. <configuration>
  6. <property>
  7. <name>dfs.nameservices</name>
  8. <value>mycluster</value>
  9. <!--定义hdfs集群id号,需要和core-site.xml中的fs.defaultFS保持一致-->
  10. </property>
  11. <property>
  12. <name>dfs.ha.namenodes.mycluster</name>
  13. <value>nn1,nn2</value>
  14. <!--定义hdfs集群中的namenodeid号-->
  15. </property>
  16. <property>
  17. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  18. <value>node1:9000</value>
  19. <!--nn1RPC通信地址-->
  20. </property>
  21. <property>
  22. <name>dfs.namenode.http-address.mycluster.nn1</name>
  23. <value>node1:50070</value>
  24. <!--nn1http通信地址-->
  25. </property>
  26. <property>
  27. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  28. <value>node2:9000</value>
  29. </property>
  30. <property>
  31. <name>dfs.namenode.http-address.mycluster.nn2</name>
  32. <value>node2:50070</value>
  33. </property>
  34. <property>
  35. <name>dfs.namenode.name.dir</name>
  36. <value>/home/bigdata/data/hadoop/hdfs/name</value>
  37. <description>namenode上存储hdfs命名空间元数据 </description>
  38. </property>
  39. <property>
  40. <name>dfs.datanode.data.dir</name>
  41. <value>/home/bigdata/data/hadoop/hdfs/data</value>
  42. <description>datanode上数据块的物理存储位置</description>
  43. </property>
  44. <property>
  45. <name>dfs.replication</name>
  46. <value>3</value>
  47. <description>副本个数,默认是3,应小于datanode数量</description>
  48. </property>
  49. <!--如果想让solr索引存放到hdfs中,则还须添加下面2个属性-->
  50. <property>
  51. <name>dfs.webhdfs.enabled</name>
  52. <value>true</value>
  53. </property>
  54. <property>
  55. <name>dfs.permissions.enabled</name>
  56. <value>false</value>
  57. <!--用于启用或禁用 HDFS ACL(简单权限)。当 dfs.permissions.enabled 设置为 false 时,任何用户都可以在 HDFS 中的任何位置创建或删除文件或目录。将此属性设置为 false 后,您可以访问所有其他 Hadoop 服务,例如 HiveHBase 等-->
  58. </property>
  59. <property>
  60. <name>dfs.datanode.max.transfer.threads</name>
  61. <value>4096</value>
  62. <!--用于设置 DataNode 在进行文件传输时的最大线程数. 如果集群中有某台 DataNode 主机的这个值比其他主机的大,那么出现的问题是,这台主机上存储的数据相对别的主机比较多,导致数据分布不均匀的问题,即使 balance 仍然会不均匀-->
  63. </property>
  64. <property>
  65. <name>dfs.ha.fencing.methods</name>
  66. <value>sshfence</value>
  67. <!-- HDFS集群中两个namenode切换状态时的隔离方法 -->
  68. </property>
  69. <property>
  70. <name>dfs.ha.fencing.ssh.private-key-files</name>
  71. <value>/home/bigdata/.ssh/id_rsa</value>
  72. <!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
  73. </property>
  74. <property>
  75. <name>dfs.ha.automatic-failover.enabled</name>
  76. <value>true</value>
  77. <!-- 故障自动转移,HAHDFS集群自动切换namenode的开关-->
  78. </property>
  79. <property>
  80. <name>dfs.namenode.shared.edits.dir</name>
  81. <value>qjournal://node1:8485;node2:8485/mycluster</value>
  82. <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  83. </property>
  84. <property>
  85. <name>dfs.journalnode.edits.dir</name>
  86. <value>/home/bigdata/data/hadoop/hdfs/ha/jn</value>
  87. <!-- journalnode集群中用于保存edits文件的目录 -->
  88. </property>
  89. <property>
  90. <name>dfs.client.failover.proxy.provider.mycluster</name>
  91. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  92. <!-- 定义HDFS的客户端连接HDFS集群时返回active namenode地址 -->
  93. </property>
  94. </configuration>

hadoop-env.sh配置

vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

  1. export JAVA_HOME=/usr/local/jdk1.8.0_391
  2. export HADOOP_HOME=/home/bigdata/hadoop
  3. export HADOOP_CONF_DIR=/home/bigdata/hadoop/etc/hadoop
  4. export YARN_CONF_DIR=/home/bigdata/hadoop/etc/hadoop

同步hadoop文件到其他节点

  1. for i in {node2,node3}
  2. do
  3. scp -r ~/hadoop $i:~/
  4. scp ~/.bash_profile $i:~/
  5. done

启动服务

  1. #启动JN,格式化之前要优先启动JN,现在是两个nn,要通过JN传递数据。
  2. [bigdata@node1 ~]$ hdfs --daemon start journalnode
  3. [bigdata@node2 ~]$ hdfs --daemon start journalnode
  4. #格式化NN,将node1作为主节点
  5. [bigdata@node1 ~]$ hdfs namenode -format
  6. #格式化NameNode会在指定的NameNode数据目录中创建一个名为current的子目录,用于存储NameNode的元数据和命名空间信息
  7. [bigdata@node1 ~]$ ll /home/bigdata/data/hadoop/hdfs/name/
  8. 总用量 0
  9. drwx------ 2 bigdata bigdata 112 7 21 21:51 current
  10. #node2上的nn作为主备,在node2执行拷贝元数据之前,需要先启动node1上的namanode
  11. [bigdata@node1 ~]$ hdfs --daemon start namenode
  12. #拷贝元数据,在Hadoop HDFS中初始化一个备用的NameNode节点。当主要的NameNode节点出现故障时,备用的NameNode节点就可以快速启动并接管服务,而无需重新加载整个文件系统的元数据,提供高可用性。注意在node2上执行
  13. [bigdata@node2 ~]$ hdfs namenode -bootstrapStandby
  14. #启动node2上的namenode
  15. [bigdata@node2 ~]$ hdfs --daemon start namenode
  16. #格式化zk,用于监控和管理Hadoop HDFS中的主备NameNode节点切换的组件。此命令会创建一个ZooKeeper目录结构,并将初始的主备NameNode节点信息存储在ZooKeeper中。这样,ZKFC就可以使用ZooKeeper来进行主备节点的管理和切换。
  17. #在设置Hadoop HDFS的高可用性环境时,需要先使用hdfs namenode -bootstrapStandby命令初始化备用的NameNode节点,然后使用hdfs zkfc -formatZK 命令初始化ZKFC。这两个命令的组合可以确保Hadoop HDFS的主备节点切换的可靠性和高可用性。
  18. [bigdata@node1 ~]$ hdfs zkfc -formatZK
  19. #启动zk客户端
  20. zkCli.sh #可以通过ls查看目录结构
  21. [zk: localhost:2181(CONNECTED) 0] ls /
  22. [hadoop-ha, zookeeper]
  23. #启动datanode,或者下面用集群命令 start-dfs.sh 一键启动所有服务
  24. hdfs --daemon start datanode
  25. #注意:以后启动hdfs就只需要先启动zookeeper,然后执行start-dfs.sh就可以了
  26. [bigdata@node1 hadoop]$ stop-dfs.sh
  27. Stopping namenodes on [node1 node2]
  28. Stopping datanodes
  29. Stopping journal nodes [node2 node1]
  30. Stopping ZK Failover Controllers on NN hosts [node1 node2]
  31. #启动所有节点
  32. [bigdata@node1 hadoop]$ start-dfs.sh
  33. Starting namenodes on [node1 node2]
  34. Starting datanodes
  35. node3: WARNING: /home/bigdata/hadoop/logs does not exist. Creating.
  36. Starting journal nodes [node2 node1]
  37. Starting ZK Failover Controllers on NN hosts [node1 node2]
  38. #验证高可用
  39. [bigdata@node1 hadoop]$ hdfs haadmin -getServiceState nn1
  40. active
  41. [bigdata@node1 hadoop]$ hdfs haadmin -getServiceState nn2
  42. standby
  43. #如果两台都是standby,可以通过 hdfs haadmin -transitionToActive --forcemanual nn1 命令强制将nn1转换为为active
  44. #访问页面验证
  45. 到浏览器访问,192.168.1.5:50070 192.168.1.6:50070 验证

配置yarn和MapReduce

修改mapred-site.xml

  1. [bigdata@node1 hadoop]$ pwd
  2. /home/bigdata/hadoop/etc/hadoop
  3. [bigdata@node1 hadoop]$ vim mapred-site.xml
  4. <configuration>
  5. <property>
  6. <name>mapreduce.framework.name</name>
  7. <value>yarn</value>
  8. <description>指定mapreduce使用yarn框架</description>
  9. </property>
  10. </configuration>

修改yarn-site.xml

  1. [bigdata@node1 hadoop]$ vim yarn-site.xml
  2. <configuration>
  3. <property>
  4. <name>yarn.nodemanager.aux-services</name>
  5. <value>mapreduce_shuffle</value>
  6. </property>
  7. <property>
  8. <name>yarn.resourcemanager.ha.enabled</name>
  9. <value>true</value>
  10. <description>是否开启高可用</description>
  11. </property>
  12. <property>
  13. <name>yarn.resourcemanager.cluster-id</name>
  14. <value>yrc</value>
  15. </property>
  16. <property>
  17. <name>yarn.resourcemanager.ha.rm-ids</name>
  18. <value>rm1,rm2</value>
  19. </property>
  20. <property>
  21. <name>yarn.resourcemanager.hostname.rm1</name>
  22. <value>node1</value>
  23. </property>
  24. <property>
  25. <name>yarn.resourcemanager.hostname.rm2</name>
  26. <value>node2</value>
  27. </property>
  28. <!-- 指定 rm 的内部通信地址 -->
  29. <property>
  30. <name>yarn.resourcemanager.address.rm1</name>
  31. <value>node1:8032</value>
  32. </property>
  33. <property>
  34. <name>yarn.resourcemanager.address.rm2</name>
  35. <value>node2:8032</value>
  36. </property>
  37. <!-- 指定 AM rm 申请资源的地址 -->
  38. <property>
  39. <name>yarn.resourcemanager.scheduler.address.rm1</name>
  40. <value>node1:8030</value>
  41. </property>
  42. <property>
  43. <name>yarn.resourcemanager.scheduler.address.rm2</name>
  44. <value>node2:8030</value>
  45. </property>
  46. <!-- 指定供 NM 连接的地址 -->
  47. <property>
  48. <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  49. <value>node1:8031</value>
  50. </property>
  51. <property>
  52. <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  53. <value>node2:8031</value>
  54. </property>
  55. <property>
  56. <name>yarn.resourcemanager.zk-address</name>
  57. <value>node1:2181,node2:2181,node3:2181</value>
  58. </property>
  59. <!-- 启用自动恢复 -->
  60. <property>
  61. <name>yarn.resourcemanager.recovery.enabled</name>
  62. <value>true</value>
  63. </property>
  64. <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
  65. <property>
  66. <name>yarn.resourcemanager.store.class</name>
  67. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  68. </property>
  69. <!-- 环境变量的继承 -->
  70. <property>
  71. <name>yarn.nodemanager.env-whitelist</name>
  72. <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  73. </property>
  74. </configuration>

同步配置文件到其他节点

  1. [bigdata@node1 hadoop]$ for i in {node2,node3}
  2. do
  3. scp mapred-site.xml yarn-site.xml $i:~/hadoop/etc/hadoop/
  4. done

启动yarn服务

  1. #启动服务
  2. [bigdata@node1 hadoop]$ start-yarn.sh
  3. Starting resourcemanagers on [ node1 node2]
  4. Starting nodemanagers
  5. #查看resourcemanagers主从
  6. [bigdata@node1 hadoop]$ yarn rmadmin -getServiceState rm1
  7. active
  8. [bigdata@node1 hadoop]$ yarn rmadmin -getServiceState rm2
  9. standby
  10. #如果某些原因yarn没有启动成功,可以单独启动
  11. yarn-daemon.sh start resourcemanager

验证

  1. 浏览器访问 192.168.1.5:8088
  2. 浏览器访问 192.168.1.6:8088
  3. 可以看到自动跳转到http://node1:8088/cluster,前提需要在电脑的hosts里配置上如下信息,不然ip变成node1时访问会失败
  4. #配置电脑文件路径
  5. C:\Windows\System32\drivers\etc\hosts
  6. 192.168.1.5 node1
  7. 192.168.1.6 node2
  1. #访问hdfs目录,查看是否正常
  2. [bigdata@node3 ~]$ hdfs dfs -ls /
  3. #hdfs相关命令
  4. hdfs dfsadmin -report #获取HDFS集群的详细报告信息:数据节点状态,容量和使用情况,块数量,网络拓扑信息
  5. hdfs dfsadmin -safemode get #查看hdfs是否为安全模式
  6. hdfs haadmin -getServiceState nn1 #nn1 为配置文件中设置的namenode的id
  7. hdfs haadmin -getServiceState nn2
  8. #hdfs相关命令
  9. hdfs dfs -mkdir -p /a/b/c
  10. hdfs dfs -ls /a/b/
  11. touch mytest.txt
  12. hdfs dfs -put mytest.txt /a/b/c
  13. hdfs dfs -get /a/b/c/mytest.txt
  14. hdfs dfs -cp /a/b/c/mytest.txt /home/
  15. hdfs dfs -cat /a/b/c/mytest.txt
  16. hdfs dfs -mv /a/b/c/mytest.txt /a/
  17. hdfs dfs -du [-s] [-h] /a
  18. hdfs dfs -rm /a/mytest.txt
  19. hdfs dfs -chown oldsixl /a/b/c
  20. hdfs dfs -chomd 777 /a/b/c

五、部署Spark集群

集群节点规划,双master实现高可用,所有节点也可以同时配置成master和worker
节点角色node1masternode2Master,slavenode3slave
上传 spark-3.2.4-bin-hadoop3.2-scala2.13.tgz

解压缩并配置环境变量

  1. 解压 tar -zxvf spark-3.2.4-bin-hadoop3.2-scala2.13.tgz -C /home/bigdata/
  2. mv spark-3.2.4-bin-hadoop3.2-scala2.13 spark
  3. [bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
  4. #Spark环境变量
  5. export SPARK_HOME=/home/bigdata/spark
  6. export PATH=$PATH:$SPARK_HOME/bin
  7. EOF

配置spark文件

  1. [bigdata@node1 ~]$ cd /home/bigdata/spark/conf/
  2. [bigdata@node1 conf]$ cp spark-env.sh.template spark-env.sh
  3. #修改spark-env.sh
  4. [bigdata@node1 conf]$ grep -v ^# spark-env.sh
  5. export JAVA_HOME=/usr/local/jdk1.8.0_391/
  6. export HADOOP_CONF_DIR=/home/bigdata/hadoop/etc/hadoop/
  7. export YARN_CONF_DIR=/home/bigdata/hadoop/etc/hadoop/
  8. export SPARK_MASTER_IP=node1
  9. export SPARK_MASTER_PORT=7077
  10. export SPARK_MASTER_WEBUI_PORT=8090
  11. export SPARK_WORKER_WEBUI_PORT=8091
  12. export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/home/bigdata/zookeeper"
  13. 说明:
  14. JAVA_HOEM:设置Java安装目录的路径
  15. HADOOP_CONF_DIR:设置Hadoop的配置目录路径
  16. YARN_CONF_DIR:设置YARN的配置目录路径,YARNHadoop的资源管理器
  17. SPARK_MASTER_IP:设置Spark主节点的IP地址或主机名。Spark主节点负责协调集群中的各个工作节点。
  18. SPARK_MASTER_PORT:设置Spark主节点的端口号。通过该端口,工作节点可以与Spark主节点进行通信。
  19. SPARK_MASTER_WEBUI_PORT:设置Spark主节点的Web界面端口号。可以通过该端口访问Spark主节点的Web界面。
  20. SPARK_WORKER_WEBUI_PORT:设置Spark工作节点的Web界面端口号。可以通过该端口访问Spark工作节点的Web界面。
  21. [bigdata@node1 conf]$ cp workers.template workers
  22. #修改workers文件
  23. [bigdata@node1 conf]$ cat > workers << EOF
  24. node2
  25. node3
  26. EOF

复制hadoop配置到spark配置目录下

  1. [bigdata@node1 conf]$ cd /home/bigdata/hadoop/etc/hadoop/
  2. [bigdata@node1 hadoop]$ cp core-site.xml hdfs-site.xml /home/bigdata/spark/conf/

将spark文件分发到其他节点

  1. [bigdata@node1 hadoop]$ for i in {node2,node3}
  2. do
  3. scp -r /home/bigdata/spark $i:/home/bigdata/
  4. scp ~/.bash_profile $i:~/
  5. done
  6. #在node2上配置备用master节点
  7. [bigdata@node2 ~]$ vim /home/bigdata/spark/conf/spark-env.sh
  8. #将 export SPARK_MASTER_IP=node1 改为
  9. export SPARK_MASTER_IP=node2

启动spark

  1. #由于启动命令和hadoop下的命令文件名一样,我们需要cd到spark目录下执行
  2. [bigdata@node1 hadoop]$ cd /home/bigdata/spark/sbin/
  3. [bigdata@node1 sbin]$ ./start-all.sh
  4. #启动备master
  5. [bigdata@node2 ~]$ cd /home/bigdata/spark/sbin
  6. [bigdata@node2 sbin]$ ./start-master.sh
  7. #jps查看主节点都有Master,node3节点有Worker

页面访问查看主备

浏览器访问 192.168.1.5:8090 可以看到上面状态 Status: ALIVE

浏览器访问 192.168.1.6:8090 可以看到上面状态 Status: STANDBY

可以看到两个master,node1节点alive为主,node2节点standby为备用master

我们关闭node1上的master

  1. [bigdata@node1 sbin]$ jps
  2. 5265 DFSZKFailoverController
  3. 4835 DataNode
  4. 2133 QuorumPeerMain
  5. 4693 NameNode
  6. 6901 Master
  7. 5079 JournalNode
  8. 6167 ResourceManager
  9. 7191 Jps
  10. 6319 NodeManager
  11. [bigdata@node1 sbin]$ kill -9 6901

刷新页面,192.168.1.5:8090 已经访问不到了,我们在访问node2,多刷新几次,可以看到master已经切换到node2

再次启动node1上的master,关闭node2 可以看到,master切换回了node1,状态为alive

运行测试

  1. [bigdata@node1 sbin]$ spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /home/bigdata/spark/examples/jars/spark-examples_2.13-3.2.4.jar
  2. #再次测试,没有报错了
  3. [bigdata@node1 sbin]$ spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /home/bigdata/spark/examples/jars/spark-examples_2.13-3.2.4.jar
  4. client token: N/A
  5. diagnostics: N/A
  6. ApplicationMaster host: node2
  7. ApplicationMaster RPC port: 39869
  8. queue: default
  9. start time: 1704966405185
  10. final status: SUCCEEDED
  11. tracking URL: http://node1:8088/proxy/application_1704964396313_0001/
  12. user: bigdata

查看yarn

浏览器访问 http://192.168.1.5:8088

可以看到执行的任务,第一次失败,第二次成功

配置历史服务器

配置yarn历史服务器
  1. #修改Hdfs配置
  2. [bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
  3. # vim mapred-site.xml 编辑 添加以下内容
  4. <!--Spark on Yarn-->
  5. <property>
  6. <name>mapreduce.jobhistory.address</name>
  7. <value>node1:10020</value>
  8. </property>
  9. <property>
  10. <name>mapreduce.jobhistory.webapp.address</name>
  11. <value>node1:19888</value>
  12. </property>
  13. #修改yarn配置文件
  14. # vim yarn-site.xml 编辑添加以下内容
  15. <!--Spark on Yarn-->
  16. <!-- 是否开启聚合日志 -->
  17. <property>
  18. <name>yarn.log-aggregation-enable</name>
  19. <value>true</value>
  20. </property>
  21. <!-- 配置日志服务器的地址 -->
  22. <property>
  23. <name>yarn.log.server.url</name>
  24. <value>http://node1:19888/jobhistory/logs/</value>
  25. </property>
  26. <!-- 配置日志过期时间,单位秒 -->
  27. <property>
  28. <name>yarn.log-aggregation.retain-seconds</name>
  29. <value>86400</value>
  30. </property>
  31. #同步配置到其他节点以及saprk目录下
  32. [bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
  33. [bigdata@node1 hadoop]$ for i in {node1,node2,node3}
  34. do
  35. scp mapred-site.xml yarn-site.xml $i:/home/bigdata/hadoop/etc/hadoop/
  36. scp mapred-site.xml yarn-site.xml $i:/home/bigdata/spark/conf/
  37. done
配置spark历史服务器
  1. #修改配置文件
  2. [bigdata@node1 sbin]$ cd ../conf/
  3. [bigdata@node1 conf]$ cp spark-defaults.conf.template spark-defaults.conf
  4. [bigdata@node1 conf]$ vim spark-defaults.conf
  5. #添加或者放开注释并修改
  6. spark.eventLog.enabled true
  7. spark.eventLogpress true
  8. spark.eventLog.dir hdfs://mycluster/spark-logs
  9. spark.yarn.historyServer.address node1:18080,node2:18080
  10. spark.history.ui.port 18080
  11. spark.history.fs.logDirectory hdfs://mycluster/spark-logs
  12. spark.history.retainedApplications 30
  13. #说明:
  14. spark.eventLog.enabled 设置为 true 表示启用Spark事件日志记录功能。
  15. spark.eventLogpress 指定Spark事件日志是否需要进行压缩
  16. spark.eventLog.dir 指定了事件日志的存储路径
  17. spark.yarn.historyServer.address 指定了YARN历史服务器的地址
  18. spark.history.ui.port 指定了Spark历史服务器UI的端口号
  19. spark.history.fs.logDirectory 指定了历史记录文件在文件系统中的存储路径
  20. spark.history.retainedApplications 指定了历史服务器要保留的应用程序数量,设置为 30,表示历史服务器将保留最近提交的30个应用程序的历史记录。
  21. #同步上述文件至其他节点
  22. [bigdata@node1 conf]$ scp spark-defaults.conf node2:/home/bigdata/spark/conf/
  23. [bigdata@node1 conf]$ scp spark-defaults.conf node3:/home/bigdata/spark/conf/
  24. #创建时间日志的存储路径,需要在启动历史服务器之前创建,不然报错找不到路径或文件
  25. [bigdata@node1 conf]$ hdfs dfs -mkdir /spark-logs
重启服务并验证
  1. #重启hdfs,yarn,spark
  2. #停止spark服务
  3. [bigdata@node1 ~]$ $SPARK_HOME/sbin/stop-all.sh
  4. #停止yarn,hdfs
  5. [bigdata@node1 ~]$ $HADOOP_HOME/sbin/stop-all.sh
  6. #启动hadoop服务
  7. [bigdata@node1 ~]$ which start-all.sh
  8. /home/bigdata/hadoop/sbin/start-all.sh
  9. [bigdata@node1 ~]$ start-all.sh
  10. #启动yarn历史服务器
  11. [bigdata@node1 ~]$ mapred --daemon start historyserver
  12. #启动spark
  13. [bigdata@node1 ~]$ $SPARK_HOME/sbin/start-all.sh
  14. #启动spark历史服务器
  15. [bigdata@node1 ~]$ $SPARK_HOME/sbin/start-history-server.sh
  16. [bigdata@node2 ~]$ $SPARK_HOME/sbin/start-history-server.sh
  17. #停止spark历史服务器
  18. # $SPARK_HOME/sbin/stop-history-server.sh

浏览器访问查看

  1. 配置 C:\Windows\System32\drivers\etc\hosts 添加
  2. 192.168.1.5 node1
  3. 192.168.1.6 node2
  4. 192.168.1.7 node3

访问 http://192.168.1.5:19888
访问 http://192.168.1.6:18080
查看日志

至此,spark集群部署完成

六、部署Flink集群

上传flink-1.16.1-bin-scala_2.12.tgz

解压缩并配置环境变量

  1. #解压安装包
  2. [bigdata@node1 ~]$ tar -xf flink-1.16.1-bin-scala_2.12.tgz -C /home/bigdata/
  3. [bigdata@node1 ~]$ mv /home/bigdata/flink-1.16.1/ /home/bigdata/flink
  4. #配置环境变量
  5. [bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
  6. #Flink环境变量
  7. export FLINK_HOME=/home/bigdata/flink
  8. export PATH=$PATH:$FLINK_HOME/bin
  9. EOF
  10. #让环境变量生效
  11. [bigdata@node1 ~]$ source .bash_profile

配置FLINK

  1. #查看并修改flink的配置文件
  2. [bigdata@node1 ~]$ cd /home/bigdata/flink/conf/
  3. #修改masters文件
  4. [bigdata@node1 conf]$ cat > masters << 'EOF'
  5. node1:8081
  6. node2:8081
  7. EOF
  8. #修改workers文件
  9. [bigdata@node1 conf]$ cat > workers << 'EOF'
  10. node1
  11. node2
  12. node3
  13. EOF
  14. #修改flink-conf.yaml文件,如下
  15. [bigdata@node1 conf]$ grep -Ev '^#|^$' flink-conf.yaml
  16. jobmanager.rpc.address: localhost
  17. jobmanager.rpc.port: 6123
  18. jobmanager.bind-host: 0.0.0.0
  19. jobmanager.memory.process.size: 1600m
  20. taskmanager.bind-host: 0.0.0.0
  21. taskmanager.host: node1 #node2节点改成node2,node3节点改成node3
  22. taskmanager.memory.process.size: 1728m
  23. taskmanager.numberOfTaskSlots: 1
  24. parallelism.default: 1
  25. high-availability: zookeeper
  26. high-availability.storageDir: hdfs://mycluster/flink/ha/
  27. high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
  28. high-availability.zookeeper.client.acl: open
  29. state.backend: filesystem
  30. state.checkpoints.dir: hdfs://mycluster/flink/checkpoints
  31. state.savepoints.dir: hdfs://mycluster/flink/savepoints
  32. state.backend.incremental: false
  33. jobmanager.execution.failover-strategy: region
  34. rest.address: localhost
  35. rest.bind-address: 0.0.0.0
  36. web.submit.enable: true
  37. 说明
  38. #jobmanager.rpc.address: localhost #指定JobManager的RPC地址
  39. #jobmanager.rpc.port: 6123: #指定JobManager的RPC端口号
  40. #jobmanager.bind-host: 0.0.0.0 #JobManager绑定的主机为0.0.0.0,表示可以接受来自任何主机的连接。
  41. #jobmanager.memory.process.size: 1600m #每个JobManager的可用内存大小
  42. #taskmanager.bind-host: 0.0.0.0 #TaskManager绑定的主机为0.0.0.0,表示可以接受来自任何主机的连接。
  43. #taskmanager.host: localhost #指定TaskManager的主机名
  44. #taskmanager.memory.process.size: 1728m #每个TaskManager的可用内存大小
  45. #taskmanager.numberOfTaskSlots: 2 #指定每个TaskManager的任务槽数量
  46. #parallelism.default: 1 #指定默认的并行度,即每个任务的并行执行线程数
  47. #high-availability: zookeeper #指定高可用性模式,这里设置为 zookeeper。表示Flink将使用Zookeeper来进行高可用性管理。
  48. #high-availability.storageDir: hdfs:///flink/ha/ #指定高可用性存储目录的路径
  49. #high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181 #指定Zookeeper集群的地址列表
  50. #high-availability.zookeeper.client.acl: open #指定Zookeeper客户端的访问控制列表(ACL),默认是 open,如果 zookeeper security 启用了更改成 creator
  51. #state.backend: filesystem #指定状态后端,即Flink任务的状态数据存储方式,这里设置为 filesystem,表示使用文件系统进行状态存储。
  52. #state.checkpoints.dir: hdfs:///flink/checkpoints #指定检查点数据的存储路径
  53. #state.savepoints.dir: hdfs:///flink/savepoints #指定保存点数据的存储路径
  54. #state.backend.incremental: false #指定是否启用增量检查点。设置为 false 表示禁用增量检查点,而是使用全量检查点。
  55. #jobmanager.execution.failover-strategy: region #指定作业管理器的故障转移策略,full: 当作业管理器发生故障时,使用全量故障转移策略。全量故障转移会将作业状态和所有任务的状态从故障的作业管理器迁移到另一个作业管理器。这是默认的故障转移策略。;region: 当作业管理器发生故障时,使用区域故障转移策略。区域故障转移会将作业状态和一部分任务的状态从故障的作业管理器迁移到另一个作业管理器,而不是全部迁移;none: 当作业管理器发生故障时,不进行故障转移。这意味着作业将终止,并且需要手动重新启动。
  56. #rest.address: 0.0.0.0 #指定REST接口的地址,表示可以接受来自任何主机的连接。
  57. #rest.bind-address: localhost #指定REST绑定的地址
  58. #web.submit.enable: true #指定是否启用Web提交界面
  59. #修改zoo.cfg
  60. [bigdata@node1 conf]$ cp /home/bigdata/zookeeper/conf/zoo.cfg .
  61. #复制hadoop配置到flink目录下
  62. [bigdata@node1 conf]$ cd /home/bigdata/hadoop/etc/hadoop/
  63. [bigdata@node1 hadoop]$ cp core-site.xml hdfs-site.xml /home/bigdata/flink/conf/

将flink目录发送到其他节点

  1. [bigdata@node1 hadoop]$ for i in {node2,node3}
  2. do
  3. scp -r /home/bigdata/flink/ $i:/home/bigdata/
  4. scp ~/.bash_profile $i:~/
  5. done

修改其他节点的flink-conf.yaml

  1. [bigdata@node2 ~]$ grep -Ev '^#|^$' /home/bigdata/flink/conf/flink-conf.yaml
  2. jobmanager.rpc.address: localhost
  3. jobmanager.rpc.port: 6123
  4. jobmanager.bind-host: 0.0.0.0
  5. jobmanager.memory.process.size: 1600m
  6. taskmanager.bind-host: 0.0.0.0
  7. taskmanager.host: node2 ##修改此行
  8. taskmanager.memory.process.size: 1728m
  9. taskmanager.numberOfTaskSlots: 1
  10. parallelism.default: 1
  11. high-availability: zookeeper
  12. high-availability.storageDir: hdfs://mycluster/flink/ha/
  13. high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
  14. high-availability.zookeeper.client.acl: open
  15. state.backend: filesystem
  16. state.checkpoints.dir: hdfs://mycluster/flink/checkpoints
  17. state.savepoints.dir: hdfs://mycluster/flink/savepoints
  18. state.backend.incremental: false
  19. jobmanager.execution.failover-strategy: region
  20. rest.address: localhost
  21. rest.bind-address: 0.0.0.0
  22. web.submit.enable: true
  23. [bigdata@node3 ~]$ grep -Ev '^#|^$' /home/bigdata/flink/conf/flink-conf.yaml
  24. jobmanager.rpc.address: localhost
  25. jobmanager.rpc.port: 6123
  26. jobmanager.bind-host: 0.0.0.0
  27. jobmanager.memory.process.size: 1600m
  28. taskmanager.bind-host: 0.0.0.0
  29. taskmanager.host: node3 #修改此行
  30. taskmanager.memory.process.size: 1728m
  31. taskmanager.numberOfTaskSlots: 1
  32. parallelism.default: 1
  33. high-availability: zookeeper
  34. high-availability.storageDir: hdfs://mycluster/flink/ha/
  35. high-availability.zookeeper.quorum: node1:2181,node2:2181,node3:2181
  36. high-availability.zookeeper.client.acl: open
  37. state.backend: filesystem
  38. state.checkpoints.dir: hdfs://mycluster/flink/checkpoints
  39. state.savepoints.dir: hdfs://mycluster/flink/savepoints
  40. state.backend.incremental: false
  41. jobmanager.execution.failover-strategy: region
  42. rest.address: localhost
  43. rest.bind-address: 0.0.0.0
  44. web.submit.enable: true

相关的 JAR 文件

  1. 目录中包含了所需的 Hadoop 相关的 JAR 文件。这些文件通常位于 Hadoop 的安装目录下的 share/hadoop/common 目录中。将这些文件复制到 Flink lib 目录中
  2. [bigdata@node1 bin]$ cd /home/bigdata/hadoop/share/hadoop/common/
  3. [bigdata@node1 common]$ ls -1
  4. hadoop-common-3.3.5.jar #Hadoop的通用库文件,包含了与文件系统交互和访问HDFS需要的功能
  5. hadoop-common-3.3.5-tests.jar
  6. hadoop-kms-3.3.5.jar #Hadoop KMS的库文件,用于管理和访问加密密钥
  7. hadoop-nfs-3.3.5.jar #Hadoop的NFS(Network File System)库文件,用于访问和操作基于NFS的文件系统
  8. hadoop-registry-3.3.5.jar #Hadoop的注册表库文件,用于管理和访问注册表服务。
  9. jdiff
  10. lib
  11. sources
  12. webapps
  13. #所有节点放入
  14. [bigdata@node1 common]$ for i in {node1,node2,node3}
  15. do
  16. scp hadoop-common-3.3.5.jar hadoop-kms-3.3.5.jar hadoop-nfs-3.3.5.jar hadoop-registry-3.3.5.jar $i:/home/bigdata/flink/lib/
  17. done
  18. #登录flink官网
  19. /zh/downloads/ ctrl+f 搜索hadoop
  20. 找到Pre-bundled Hadoop 2.8.3 Source Release (asc, sha512) 点击下载
  21. #完整下载路径如下:
  22. /maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
  23. [bigdata@node1 ~]$ wget /maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
  24. #将jar包放入 /home/bigdata/flink/lib 目录下,所有节点都要放入
  25. [bigdata@node1 ~]$ for i in {node1,node2,node3}
  26. do
  27. scp flink-shaded-hadoop-2-uber-2.8.3-10.0.jar $i:/home/bigdata/flink/lib/
  28. done

启动flink集群

  1. [bigdata@node1 hadoop]$ cd /home/bigdata/flink/bin/
  2. [bigdata@node1 bin]$ ./start-cluster.sh
  3. Starting HA cluster with 2 masters.
  4. Starting standalonesession daemon on host node1.
  5. Starting standalonesession daemon on host node2.
  6. Starting taskexecutor daemon on host node1.
  7. Starting taskexecutor daemon on host node2.
  8. Starting taskexecutor daemon on host node3.
  9. #jps查看进程,如果启动成功会有 StandaloneSessionClusterEntrypoint 和 TaskManagerRunner 进程,没有就查看日志报错,参考后面排查步骤
  10. [bigdata@node1 bin]$ jps
  11. 5265 DFSZKFailoverController
  12. 4835 DataNode
  13. 9140 Jps
  14. 2133 QuorumPeerMain
  15. 4693 NameNode
  16. 6901 Master
  17. 5079 JournalNode
  18. 6167 ResourceManager
  19. 7624 HistoryServer
  20. 6319 NodeManager
  21. #查看日志报错信息
  22. [bigdata@node1 bin]$ less ../log/flink-root-standalonesession-0-node1.log
  23. Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme 'hdfs'. The scheme is not directly supported by Flink and no Hadoop file system to support this scheme could be loaded.
  24. #这个错误通常是由于缺少 Hadoop 的依赖引起的。Flink 需要 Hadoop 的相关库文件才能与 HDFS 进行交互。
  25. #确保 Flink 的 lib 目录中包含了所需的 Hadoop 相关的 JAR 文件。这些文件通常位于 Hadoop 的安装目录下的 share/hadoop/common 目录中。将这些文件复制到 Flink 的 lib 目录中
  26. [bigdata@node1 bin]$ cd /home/bigdata/hadoop/share/hadoop/common/
  27. [bigdata@node1 common]$ ls -1
  28. hadoop-common-3.3.5.jar #Hadoop的通用库文件,包含了与文件系统交互和访问HDFS需要的功能
  29. hadoop-common-3.3.5-tests.jar
  30. hadoop-kms-3.3.5.jar #Hadoop KMS的库文件,用于管理和访问加密密钥
  31. hadoop-nfs-3.3.5.jar #Hadoop的NFS(Network File System)库文件,用于访问和操作基于NFS的文件系统
  32. hadoop-registry-3.3.5.jar #Hadoop的注册表库文件,用于管理和访问注册表服务。
  33. jdiff
  34. lib
  35. sources
  36. webapps
  37. #所有节点放入
  38. [bigdata@node1 common]$ for i in {node1,node2,node3}
  39. do
  40. scp hadoop-common-3.3.5.jar hadoop-kms-3.3.5.jar hadoop-nfs-3.3.5.jar hadoop-registry-3.3.5.jar $i:/home/bigdata/flink/lib/
  41. done
  42. #再次启动
  43. [bigdata@node1 common]$ $FLINK_HOME/bin/start-cluster.sh
  44. [bigdata@node1 common]$ jps #仍然没有
  45. 5265 DFSZKFailoverController
  46. 4835 DataNode
  47. 2133 QuorumPeerMain
  48. 4693 NameNode
  49. 6901 Master
  50. 5079 JournalNode
  51. 6167 ResourceManager
  52. 7624 HistoryServer
  53. 10139 Jps
  54. 6319 NodeManager
  55. #登录flink官网
  56. /zh/downloads/ ctrl+f 搜索hadoop
  57. 找到Pre-bundled Hadoop 2.8.3 Source Release (asc, sha512) 点击下载
  58. #完整下载路径如下:
  59. /maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
  60. [bigdata@node1 ~]$ wget /maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
  61. #将jar包放入 /home/bigdata/flink/lib 目录下,所有节点都要放入
  62. [bigdata@node1 ~]$ for i in {node1,node2,node3}
  63. do
  64. scp flink-shaded-hadoop-2-uber-2.8.3-10.0.jar $i:/home/bigdata/flink/lib/
  65. done
  66. #再次启动查看进程
  67. [bigdata@node1 ~]$ $FLINK_HOME/bin/start-cluster.sh
  68. [bigdata@node1 ~]$ jps
  69. 5265 DFSZKFailoverController
  70. 4835 DataNode
  71. 10643 StandaloneSessionClusterEntrypoint ##
  72. 10948 TaskManagerRunner ##
  73. 2133 QuorumPeerMain
  74. 4693 NameNode
  75. 6901 Master
  76. 11093 Jps
  77. 5079 JournalNode
  78. 6167 ResourceManager
  79. 7624 HistoryServer
  80. 6319 NodeManager
  81. [bigdata@node2 ~]$ jps
  82. 2752 DataNode
  83. 7106 TaskManagerRunner ##
  84. 2851 JournalNode
  85. 2670 NameNode
  86. 3822 Worker
  87. 1873 QuorumPeerMain
  88. 4433 HistoryServer
  89. 6802 StandaloneSessionClusterEntrypoint ##
  90. 3316 NodeManager
  91. 3221 ResourceManager
  92. 3928 Master
  93. 2937 DFSZKFailoverController
  94. 7231 Jps
  95. [bigdata@node3 ~]$ jps
  96. 2114 DataNode
  97. 1860 QuorumPeerMain
  98. 2884 Worker
  99. 2263 NodeManager
  100. 4395 TaskManagerRunner ##
  101. 4350 Jps
  102. #可以看到有StandaloneSessionClusterEntrypoint和TaskManagerRunner进程
  103. #master角色进程: StandaloneSessionClusterEntrypoint; slave角色进程: TaskManagerRunner
  104. #停止集群 ./stop-cluster.sh
  105. #单独启动
  106. ./jobmanager.sh start/stop
  107. ./taskmanager.sh start/stop

页面访问验证

浏览器访问 http://192.168.1.5:8081/

提交任务测试

  1. #使用官方example 运行测试看看
  2. [bigdata@node3 ~]$ cd /home/bigdata/flink/bin/
  3. [bigdata@node3 bin]$ flink run -m yarn-cluster ../examples/batch/WordCount

这就是代表运行成功了,我们访问yarn查看applicationId

其他常用操作命令

  1. #使用yarn-session.sh命令(yarn-session.sh命令在flink的bin下)
  2. #启动一个Flink YARN session。其中,-n 3表示启动3个TaskManager,-jm 500表示JobManager的内存为500MB,-tm 500表示每个TaskManager的内存为500MB,-d表示在后台运行
  3. [bigdata@node3 bin]$ yarn-session.sh -n 3 -jm 500 -tm 500 -d
  4. ...
  5. JobManager Web Interface: http://192.168.1.5:33563

访问日志上的网址可以访问此任务的flink dashboard

  1. #命令行查询命令
  2. [bigdata@node1 ~]$ yarn application -list
  3. Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):1
  4. Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
  5. application_1689949756263_0005 Flink session cluster Apache Flink root default RUNNING UNDEFINED 100% http://192.168.1.11:33563
  6. #查看日志命令
  7. [bigdata@node1 ~]$ yarn logs -applicationId application_1689949756263_0005
  8. #结束杀掉任务
  9. [bigdata@node1 ~]$ yarn application -kill application_1689949756263_0005

至此,flink on yarn 高可用集群部署完成

部署kafka集群

下载上传kafka_2.12-3.4.0.tgz

解压缩并配置环境变量

  1. #解压缩
  2. [bigdata@node1 ~]$ tar -xf kafka_2.12-3.4.0.tgz -C /home/bigdata/
  3. [bigdata@node1 ~]$ mv /home/bigdata/kafka_2.12-3.4.0/ /home/bigdata/kafka
  4. #配置环境变量
  5. [bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
  6. #Kafka环境变量
  7. export KAFKA_HOME=/home/bigdata/kafka
  8. export PATH=$PATH:$KAFKA_HOME/bin
  9. EOF
  10. [bigdata@node1 ~]$ source .bash_profile

配置kafka

  1. [bigdata@node1 ~]$ cd /home/bigdata/kafka/config/
  2. #主要配置文件为server.properties,vim 编辑修改,最后如下
  3. [bigdata@node1 config]$ grep -Ev '^$|^#' server.properties
  4. #broker的全局唯一编号,不能重复,只能是数字。每个节点唯一,不能重复
  5. broker.id=5
  6. #修改为当前节点的ip
  7. listeners = PLAINTEXT://node1:9092
  8. numwork.threads=3
  9. num.io.threads=8
  10. socket.send.buffer.bytes=102400
  11. socket.receive.buffer.bytes=102400
  12. socket.request.max.bytes=104857600
  13. #运行日志存放的路径,不需提前创建,kafka会自动创建
  14. log.dirs=/home/bigdata/kafka/logs
  15. #默认分区数
  16. num.partitions=1
  17. num.recovery.threads.per.data.dir=1
  18. offsets.topic.replication.factor=1
  19. transaction.state.log.replication.factor=1
  20. transaction.state.log.min.isr=1
  21. #日志保留时间
  22. log.retention.hours=168
  23. log.retention.check.interval.ms=300000
  24. #连接zookeeper集群地址
  25. zookeeper.connect=node1:2181,node2:2181,node3:2181
  26. zookeeper.connection.timeout.ms=18000
  27. group.initial.rebalance.delay.ms=0

分发文件到其他节点并配置

  1. [bigdata@node1 config]$ cd
  2. [bigdata@node1 ~]$ for i in {node2,node3}
  3. do
  4. scp -r /home/bigdata/kafka/ $i:/home/bigdata/
  5. scp .bash_profile $i:~/
  6. done
  7. #修改node2和nide3的配置文件,如下
  8. [bigdata@node2 ~]$ grep -Ev '^$|^#' /home/bigdata/kafka/config/server.properties
  9. ##修改此处id值
  10. broker.id=6
  11. #修改当前节点名
  12. listeners = PLAINTEXT://node2:9092
  13. numwork.threads=3
  14. num.io.threads=8
  15. socket.send.buffer.bytes=102400
  16. socket.receive.buffer.bytes=102400
  17. socket.request.max.bytes=104857600
  18. log.dirs=/home/bigdata/kafka/logs
  19. num.partitions=1
  20. num.recovery.threads.per.data.dir=1
  21. offsets.topic.replication.factor=1
  22. transaction.state.log.replication.factor=1
  23. transaction.state.log.min.isr=1
  24. log.retention.hours=168
  25. log.retention.check.interval.ms=300000
  26. zookeeper.connect=node1:2181,node2:2181,node3:2181
  27. zookeeper.connection.timeout.ms=18000
  28. group.initial.rebalance.delay.ms=0
  29. [bigdata@node3 ~]$ grep -Ev '^$|^#' /home/bigdata/kafka/config/server.properties
  30. ##修改此处id值
  31. broker.id=7
  32. #修改当前节点名
  33. listeners = PLAINTEXT://node3:9092
  34. numwork.threads=3
  35. num.io.threads=8
  36. socket.send.buffer.bytes=102400
  37. socket.receive.buffer.bytes=102400
  38. socket.request.max.bytes=104857600
  39. log.dirs=/home/bigdata/kafka/logs
  40. num.partitions=1
  41. num.recovery.threads.per.data.dir=1
  42. offsets.topic.replication.factor=1
  43. transaction.state.log.replication.factor=1
  44. transaction.state.log.min.isr=1
  45. log.retention.hours=168
  46. log.retention.check.interval.ms=300000
  47. zookeeper.connect=node1:2181,node2:2181,node3:2181
  48. zookeeper.connection.timeout.ms=18000
  49. group.initial.rebalance.delay.ms=0

启动kafka集群

  1. #每个节点都要启动
  2. [bigdata@node1 ~]$ cd /home/bigdata/kafka/bin
  3. [bigdata@node1 bin]$ ./kafka-server-start.sh -daemon ../config/server.properties
  4. [bigdata@node2 ~]$ cd /home/bigdata/kafka/bin
  5. [bigdata@node2 bin]$ ./kafka-server-start.sh -daemon ../config/server.properties
  6. [bigdata@node3 ~]$ cd /home/bigdata/kafka/bin
  7. [bigdata@node3 bin]$ ./kafka-server-start.sh -daemon ../config/server.properties

集群测试以及常用kafka命令

  1. #创建topic,1分区,1副本,topic名字 Mytopic_test
  2. [bigdata@node3 ~]$ kafka-topics.sh --create --topic Mytopic_test --partitions 1 --replication-factor 1 --bootstrap-server node1:9092,node2:9092,node3:9092
  3. WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
  4. Created topic mytopic_test.
  5. #查看topic列表
  6. [bigdata@node3 ~]$ kafka-topics.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --list
  7. Mytopic_test
  8. #更改topic分区为3
  9. [bigdata@node3 ~]$ kafka-topics.sh --alter --bootstrap-server node1:9092,node2:9092,node3:9092 --topic Mytopic_test --partitions 3
  10. #添加配置,当producer发送了100条消息后,就会强制将缓存中的消息刷新到磁盘上
  11. [bigdata@node3 ~]$ kafka-configs.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --entity-type topics --entity-name Mytopic_test --alter --add-config flush.messages=100
  12. Completed updating config for topic Mytopic_test.
  13. #查看Topic描述
  14. [bigdata@node3 ~]$ kafka-topics.sh --describe --bootstrap-server node1:9092,node2:9092,node3:9092 --topic Mytopic_test
  15. Topic: Mytopic_test TopicId: L1V4yI1UQy6_ZMkwgMHUmA PartitionCount: 3 ReplicationFactor: 1 Configs: flush.messages=100
  16. Topic: Mytopic_test Partition: 0 Leader: 11 Replicas: 11 Isr: 11
  17. Topic: Mytopic_test Partition: 1 Leader: 12 Replicas: 12 Isr: 12
  18. Topic: Mytopic_test Partition: 2 Leader: 13 Replicas: 13 Isr: 13
  19. #启动生产者
  20. #在任意Kafka节点上启动Producer生产数据
  21. [bigdata@node3 ~]$ kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic Mytopic_test
  22. >abcd
  23. #在任意kafka节点上启动消费者
  24. [bigdata@node3 ~]$ kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic Mytopic_test
  25. abcd
  26. #消费多主题
  27. #新建topic名为topic_test2
  28. [bigdata@node3 ~]$ kafka-topics.sh --create --topic topic_test2 --partitions 1 --replication-factor 1 --bootstrap-server node1:9092,node2:9092,node3:9092
  29. #同时消费Mytopic_test和topic_test2
  30. [bigdata@node3 ~]$ kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --consumer-property group.id=grouptest --consumer-property consumer.id=old-consumer-cl --whiteli
  31. st "Mytopic_test|topic_test2"
  32. #创建消费组
  33. [bigdata@node3 ~]$ kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic Mytopic_test --group mygroup_test
  34. #查看消费组列表
  35. [bigdata@node3 ~]$ kafka-consumer-groups.sh --list --bootstrap-server node1:9092,node2:9092,node3:9092
  36. mygroup_test
  37. grouptest
  38. console-consumer-18469
  39. #查看消费组详细信息,LOG-END-OFFSET下一条将要被加入到日志的消息的位移,CURRENT-OFFSET当前消费的位移,LAG 消息堆积量
  40. [bigdata@node3 ~]$ kafka-consumer-groups.sh --describe --bootstrap-server node1:9092,node2:9092,node3:9092 --group mygroup_test
  41. GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
  42. mygroup_test Mytopic_test 0 0 0 0 console-consumer-66df351d-4457-4278-9900-b3d0c95b4e69 /192.168.1.12 console-consumer
  43. mygroup_test Mytopic_test 1 5 5 0 console-consumer-66df351d-4457-4278-9900-b3d0c95b4e69 /192.168.1.12 console-consumer
  44. mygroup_test Mytopic_test 2 0 0 0 console-consumer-66df351d-4457-4278-9900-b3d0c95b4e69 /192.168.1.12 console-consumer
  45. #移动消费组偏移到某个位置
  46. #最早处
  47. [bigdata@node3 ~]$ kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --group mygroup_test --reset-offsets --all-topics --to-earliest --execute
  48. #最新处
  49. [bigdata@node3 ~]$ kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --group mygroup_test --reset-offsets --all-topics --to-latest --execute
  50. #某个位置
  51. [bigdata@node3 ~]$ kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --group mygroup_test --reset-offsets --all-topics --to-offset 2000 --execute
  52. #删除topic
  53. [bigdata@node3 ~]$ kafka-topics.sh --delete --topic topic_test2 --bootstrap-server node1:9092,node2:9092,node3:9092
  54. #删除消费组
  55. [bigdata@node3 ~]$ kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --group mygroup_test --delete

部署HBase集群

HBase是一个开源的分布式、面向列的NoSQL数据库,它是构建在Hadoop分布式文件系统(HDFS)上的。HBase的设计目标是提供高可靠性、高性能的随机读写能力,以适应大规模数据存储和处理的需求。

集群节点规划
节点名HMasterHRegionServernode1YYnode2YYnode3NY

上传HBase安装包

hbase-2.4.17-bin.tar.gz

解压缩并配置环境变量

  1. #解压软件包
  2. [bigdata@node1 ~]$ tar -xf hbase-2.4.17-bin.tar.gz -C /home/bigdata/
  3. [bigdata@node1 ~]$ mv /home/bigdata/hbase-2.4.17/ /home/bigdata/hbase
  4. #配置环境变量
  5. [bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
  6. #HBase环境变量
  7. export HBASE_HOME=/home/bigdata/hbase
  8. export PATH=$PATH:$HBASE_HOME/bin
  9. EOF
  10. #让环境变量生效
  11. [bigdata@node1 ~]$ source .bash_profile

配置HBase

  1. [bigdata@node1 ~]$ cd /home/bigdata/hbase/conf/
  2. #修改hbase配置文件
  3. [bigdata@node1 conf]$ vim hbase-env.sh #去掉#注释并修改
  4. export JAVA_HOME=/usr/local/jdk1.8.0_391
  5. #export HBASE_SSH_OPTS="-p 12122" #实际生产环境中,一般ssh端口会修改为其他端口,则需要配置此处
  6. export HBASE_PID_DIR=/home/bigdata/hbase/pids #保存pid文件
  7. export HBASE_MANAGES_ZK=false #禁用HBase自带的Zookeeper,因为我们是使用独立的Zookeeper
  1. <configuration>
  2. <!-- 设置HRegionServers共享目录 -->
  3. <property>
  4. <name>hbase.rootdir</name>
  5. <value>hdfs://mycluster/hbase</value>
  6. </property>
  7. <property>
  8. <name>hbase.master.info.port</name>
  9. <value>60010</value>
  10. </property>
  11. <!-- 启用分布式模式 -->
  12. <property>
  13. <name>hbase.cluster.distributed</name>
  14. <value>true</value>
  15. </property>
  16. <!-- 指定Zookeeper集群位置 -->
  17. <property>
  18. <name>hbase.zookeeper.quorum</name>
  19. <value>node1:2181,node2:2181,node3:2181</value>
  20. </property>
  21. <!-- 指定独立Zookeeper安装路径 -->
  22. <property>
  23. <name>hbase.zookeeper.property.dataDir</name>
  24. <value>/home/bigdata/zookeeper/data</value>
  25. </property>
  26. <!-- 指定ZooKeeper集群端口 -->
  27. <property>
  28. <name>hbase.zookeeper.property.clientPort</name>
  29. <value>2181</value>
  30. </property>
  31. <property>
  32. <name>hbase.tmp.dir</name>
  33. <value>/home/bigdata/hbase/tmp</value>
  34. </property>
  35. <!--HBase将按照正常的写入路径进行处理与检查-->
  36. <property>
  37. <name>hbase.unsafe.stream.capability.enforce</name>
  38. <value>false</value>
  39. </property>
  40. <property>
  41. <name>hbase.wal.provider</name>
  42. <value>filesystem</value>
  43. </property>
  44. </configuration>
  1. #配置regionserver节点
  2. [bigdata@node1 conf]$ cat > regionservers << EOF
  3. node1
  4. node2
  5. node3
  6. EOF

将hadoop的相关配置文件放到hbase目录下

  1. [bigdata@node1 conf]$ cd /home/bigdata/hadoop/etc/hadoop/
  2. [bigdata@node1 hadoop]$ cp core-site.xml hdfs-site.xml /home/bigdata/hbase/conf/

拷贝hbase相关文件到其他节点

  1. [bigdata@node1 hadoop]$ cd
  2. [bigdata@node1 ~]$ for i in {node2,node3}
  3. do
  4. scp -r /home/bigdata/hbase/ $i:/home/bigdata/
  5. scp ~/.bash_profile $i:~/
  6. done

启动HBase

主节点启动,主节点是namenode为active状态的节点

可通过命令hdfs haadmin -getServiceState nn1 , hdfs haadmin -getServiceState nn2 查看

  1. [bigdata@node1 ~]$ hdfs haadmin -getServiceState nn1
  2. active
  3. [bigdata@node1 ~]$ hdfs haadmin -getServiceState nn2
  4. standby
  5. #启动hbase,此时的zookeeper和hadoop集群为启动状态
  6. [bigdata@node1 ~]$ start-hbase.sh
  7. #备用主节点需要单独启动,一定记得执行
  8. [bigdata@node2 ~]$ hbase-daemon.sh start master
  9. #启动成功后主节点有HMaster、Regionserver进程,node3上有Regionserver进程
  10. [bigdata@node1 ~]$ jps
  11. 4835 DataNode
  12. 10948 TaskManagerRunner
  13. 15173 HRegionServer
  14. 7624 HistoryServer
  15. 6319 NodeManager
  16. 15632 Jps
  17. 5265 DFSZKFailoverController
  18. 10643 StandaloneSessionClusterEntrypoint
  19. 14964 HMaster
  20. 2133 QuorumPeerMain
  21. 4693 NameNode
  22. 6901 Master
  23. 5079 JournalNode
  24. 6167 ResourceManager
  25. 11837 TaskManagerRunner
  26. 14495 Kafka
  27. [bigdata@node2 ~]$ jps
  28. 2752 DataNode
  29. 7106 TaskManagerRunner
  30. 9986 Jps
  31. 2851 JournalNode
  32. 9738 HMaster
  33. 9197 Kafka
  34. 2670 NameNode
  35. 3822 Worker
  36. 1873 QuorumPeerMain
  37. 4433 HistoryServer
  38. 6802 StandaloneSessionClusterEntrypoint
  39. 9458 HRegionServer
  40. 3316 NodeManager
  41. 3221 ResourceManager
  42. 3928 Master
  43. 2937 DFSZKFailoverController
  44. 7836 TaskManagerRunner
  45. [bigdata@node3 ~]$ jps
  46. 2114 DataNode
  47. 1860 QuorumPeerMain
  48. 2884 Worker
  49. 6246 Kafka
  50. 2263 NodeManager
  51. 7049 HRegionServer
  52. 4395 TaskManagerRunner
  53. 7295 Jps

浏览器访问HBase

http://192.168.1.5:60010
http://192.168.1.6:60010

可以看到 node1上显示 Master node1 ,在node2上显示Backup Master node2

Current Active Master: node1

高可用测试

  1. kill node1上的 HMaster ,在浏览器中查看备用主节点node2上的HBase是否切换为active
  2. 再次启动node1 hbase-daemon.sh start master ,访问node1页面显示 node2active
  3. 再次kill node2 HMaster ,再次查看,又切换了回去,在启动node2查看。hbase-daemon.sh start master
  4. 再次查看node2 的页面 显示node1active,测试成功。

hbase的常用命令

  1. #随便找个节点,进入hbase
  2. [bigdata@node3 ~]$ hbase shell #进入hbase
  3. hbase:003:0> version #查看hbase版本
  4. 2.4.17, r7fd096f39b4284da9a71da3ce67c48d259ffa79a, Fri Mar 31 18:10:45 UTC 2023
  5. Took 0.0004 seconds
  6. hbase:004:0> help #帮助命令,所有的帮助
  7. hbase:005:0> help 'create' #指定命令的帮助
  8. hbase:006:0> create_namespace 'oldsixl' #创建命名空间
  9. Took 0.1468 seconds
  10. hbase:007:0> list_namespace #查看所有命名空间
  11. NAMESPACE
  12. default
  13. hbase
  14. oldsixl
  15. 3 row(s)
  16. Took 0.0433 seconds
  17. hbase:011:0> status #查看集群状态
  18. 1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load
  19. Took 0.0833 seconds
  20. hbase:012:0> drop_namespace 'oldsixl' #删除命名空间,该命名空间必须为空,否则系统不让删除。
  21. Took 0.1446 seconds
  22. hbase:013:0> create_namespace 'oldsixlns'
  23. Took 0.1256 seconds
  24. hbase:016:0> create 'oldsixlns:test_table','cf' #创建表test_table,这个表只有一个 列族 为 cf
  25. Created table oldsixlns:test_table
  26. Took 0.6492 seconds
  27. => Hbase::Table - oldsixlns:test_table
  28. hbase:017:0> list #列出所有表
  29. TABLE
  30. oldsixlns:test_table
  31. 1 row(s)
  32. Took 0.0044 seconds
  33. => ["oldsixlns:test_table"]
  34. hbase:019:0> put 'oldsixlns:test_table','row1','cf:a','value1' #表中插入数据
  35. Took 0.1267 seconds
  36. hbase:020:0> put 'oldsixlns:test_table','row2','cf:b','value2'
  37. Took 0.5323 seconds
  38. hbase:021:0> put 'oldsixlns:test_table','row3','cf:c','value3'
  39. Took 0.0086 seconds
  40. hbase:022:0> scan 'oldsixlns:test_table' #查看表中所有数据
  41. ROW COLUMN+CELL
  42. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  43. row2 column=cf:b, timestamp=2023-07-19T23:30:12.444, value=value2
  44. row3 column=cf:c, timestamp=2023-07-19T23:30:21.700, value=value3
  45. 3 row(s)
  46. hbase:024:0> get 'oldsixlns:test_table','row1' #精确查询某行数据
  47. COLUMN CELL
  48. cf:a timestamp=2023-07-19T23:30:01.368, value=value1
  49. 1 row(s)
  50. Took 0.0217 seconds
  51. hbase:025:0> scan 'oldsixlns:test_table',{ROWPREFIXFILTER=>'row1'} #查看roukey前面是row1,可以写成前面的任意n为字符
  52. ROW COLUMN+CELL
  53. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  54. 1 row(s)
  55. Took 0.0081 seconds
  56. hbase:026:0> scan 'oldsixlns:test_table',{ROWPREFIXFILTER=>'row',LIMIT=>2}
  57. ROW COLUMN+CELL
  58. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  59. row2 column=cf:b, timestamp=2023-07-19T23:30:12.444, value=value2
  60. 2 row(s)
  61. Took 0.0064 second
  62. hbase:036:0> scan 'oldsixlns:test_table',{FILTER=>"PrefixFilter('row')",LIMIT =>10} #查看表中包含row的数据
  63. ROW COLUMN+CELL
  64. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  65. row2 column=cf:b, timestamp=2023-07-19T23:30:12.444, value=value2
  66. row3 column=cf:c, timestamp=2023-07-19T23:30:21.700, value=value3
  67. 3 row(s)
  68. Took 0.0118 seconds
  69. hbase:038:0> scan 'oldsixlns:test_table',{TIMERANGE=>[1689779520000,1689783120000],LIMIT=>1} #获取指定时间的时间戳 date -d '2023-06-08 16:12:00' +%s%3N ,当前服务器的时间的时间戳:date +%s%3N
  70. ROW COLUMN+CELL
  71. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  72. 1 row(s)
  73. Took 0.0071 seconds
  74. hbase:045:0> scan 'oldsixlns:test_table',{FILTER=>"ValueFilter(=,'substring:va') AND ValueFilter(=,'substring:1')",LIMIT=>10} #查询数据中既有va,又有1的数据
  75. ROW COLUMN+CELL
  76. row1 column=cf:a, timestamp=2023-07-19T23:30:01.368, value=value1
  77. 1 row(s)
  78. Took 0.0075 seconds
  79. hbase:046:0> describe 'oldsixlns:test_table' #查看表结构
  80. Table oldsixlns:test_table is ENABLED
  81. oldsixlns:test_table
  82. COLUMN FAMILIES DESCRIPTION
  83. {NAME => 'cf', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS =>
  84. '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
  85. 1 row(s)
  86. Quota is disabled
  87. Took 0.0392 seconds
  88. hbase:057:0> alter 'namespace:table',{NAME=>'cf',COMPRESSION=>'SNAPPY'} #开启压缩
  89. hbase:058:0> alter 'oldsixlns:test_table',NAME=>'cf',TTL=>'86400' #修改ttl,单位秒,数据保存的时间
  90. hbase:059:0> count 'oldsixlns:test_table'
  91. 3 row(s)
  92. hbase:060:0> deleteall 'oldsixlns:test_table','row1' #删除rowkey为row1的所有数据
  93. Took 0.0075 seconds
  94. hbase:063:0> delete 'oldsixlns:test_table','row2','cf:b' #删除row2,cf:b的数据
  95. Took 0.0089 seconds
  96. hbase:064:0> scan 'oldsixlns:test_table'
  97. ROW COLUMN+CELL
  98. row3 column=cf:c, timestamp=2023-07-19T23:30:21.700, value=value3
  99. 1 row(s)
  100. Took 0.0053 seconds
  101. hbase:070:0> is_disabled 'oldsixlns:test_table' #查看表是否被禁用
  102. false
  103. Took 0.0103 seconds
  104. => false
  105. hbase:071:0> truncate 'oldsixlns:test_table' #清空表数据
  106. Truncating 'oldsixlns:test_table' table (it may take a while):
  107. Disabling table...
  108. Truncating table...
  109. Took 1.4789 seconds
  110. hbase:076:0> disable 'oldsixlns:test_table' #禁用表,如果要删除表,必须先禁用表
  111. Took 0.3266 seconds
  112. hbase:077:0> drop 'oldsixlns:test_table' #删除表
  1. #在终端导出hbase库的数据到本地,不要进入hbase,直接执行。有特殊字符报错的话,加上\ 转义符就好了
  2. [bigdata@node3 ~]$ echo "scan 'oldsixlns:test_table',{FILTER=>\"ValueFilter(=,'substring:value1')\"}" | hbase shell > test.txt

hbase表结构形式

创建下面的一张表

  1. create_namespace 'MrLOAM'
  2. create 'MrLOAM:employee_info', 'info', 'detail', 'address'
  3. 第一行
  4. put 'MrLOAM:employee_info', 'xiaoming', 'info:id', '1'
  5. put 'MrLOAM:employee_info', 'xiaoming', 'info:name', '小明'
  6. put 'MrLOAM:employee_info', 'xiaoming', 'info:age', '25'
  7. put 'MrLOAM:employee_info', 'xiaoming', 'detail:birth', '1997-03-06'
  8. put 'MrLOAM:employee_info', 'xiaoming', 'detail:w_time', '2023-07-01 13:00:00'
  9. put 'MrLOAM:employee_info', 'xiaoming', 'detail:email', 'a@gmail'
  10. put 'MrLOAM:employee_info', 'xiaoming', 'address', '上海'
  11. 第二行
  12. put 'MrLOAM:employee_info', 'xiaohong', 'info:id', '2'
  13. put 'MrLOAM:employee_info', 'xiaohong', 'info:name', '小红'
  14. put 'MrLOAM:employee_info', 'xiaohong', 'info:age', '26'
  15. put 'MrLOAM:employee_info', 'xiaohong', 'detail:birth', '1998-06-05'
  16. put 'MrLOAM:employee_info', 'xiaohong', 'detail:w_time', '2023-07-01 13:05:00'
  17. put 'MrLOAM:employee_info', 'xiaohong', 'detail:email', 'c@sina'
  18. put 'MrLOAM:employee_info', 'xiaohong', 'address', '北京'
  19. 第二行
  20. put 'MrLOAM:employee_info', 'xiaohei', 'info:id', '3'
  21. put 'MrLOAM:employee_info', 'xiaohei', 'info:name', '小黑'
  22. put 'MrLOAM:employee_info', 'xiaohei', 'info:age', '28'
  23. put 'MrLOAM:employee_info', 'xiaohei', 'detail:birth', '2000-01-01'
  24. put 'MrLOAM:employee_info', 'xiaohei', 'detail:w_time', '2023-07-01 13:10:30'
  25. put 'MrLOAM:employee_info', 'xiaohei', 'detail:email', 'e@qq'
  26. put 'MrLOAM:employee_info', 'xiaohei', 'address', '广州'

查看表数据

部署hive高可用集群

Hive需要使用其他关系型数据作为其元数据存储,如mysql、Oracle、PostgreSQL等。Hive与其他类型的数据库(如Oracle、PostgreSQL等)的集成有限,主要是通过自定义配置和JDBC驱动程序进行实现。

MySQL是Hive的推荐数据库之一,有以下几个优点:

  • 成熟稳定:MySQL是一种成熟、稳定且广泛使用的关系型数据库管理系统。它经过了多年的发展和测试,并且在各种生产环境中得到了广泛应用。这使得MySQL在可靠性和稳定性方面表现优秀。
  • 兼容性:Hive与MySQL的集成非常紧密,它提供了与MySQL数据库的无缝连接和交互。Hive提供了专门的MySQL存储处理程序,可以直接使用MySQL作为其元数据存储。这种紧密的集成使得Hive能够有效地管理和查询大规模的数据。
  • 易用性:MySQL具有简单易用的特点,它提供了直观的命令行和图形界面工具,使得用户可以方便地管理和操作数据库。这使得MySQL成为了许多开发者和数据工程师的首选数据库。
  • 社区支持:MySQL拥有庞大的开源社区支持,这意味着你可以轻松地找到关于MySQL的文档、教程、示例代码以及问题解答。这种社区支持为用户提供了丰富的资源和帮助,使得使用和维护MySQL变得更加容易。

此处将使用MySQL作为hive的元数据存储

在安装 Hive 之前,需要先确定 Hive 所需的 MySQL 版本。一般来说,Hive 2.x 版本需要 MySQL 5.6 或更高版本,而 Hive 3.x 版本需要 MySQL 5.7 或更高版本。

Apache Hive 3.1.3 需要 MySQL 5.7 或更高版本。具体来说,需要使用 MySQL 5.7.17 或更高版本,因为 Hive 3.1.3 使用了 MySQL 5.7.17 中引入的一些功能。如果使用的是 MySQL 8.x 版本,则需要将 Hive 的 JDBC 驱动程序升级到 MySQL 8.x 版本的驱动程序。

上传mysql

mysql-5.7.38-el7-x86_64.tar.gz

安装mysql

卸载系统自带的mariadb

  1. #查看并卸载系统的mariadb软件
  2. [root@node1 ~]# rpm -qa | grep mariadb
  3. mariadb-libs-5.5.68-1.el7.x86_64
  4. #卸载mariadb
  5. [root@node1 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
  6. #查看系统是否有mysql
  7. [root@node1 ~]# rpm -qa | grep mysql
  8. #创建mysql用户并禁止登录
  9. [root@node1 ~]# useradd mysql -s /sbin/nologin

解压mysql安装包并安装

  1. [root@node1 ~]# tar -xf mysql-5.7.35-el7-x86_64.tar.gz -C /usr/local/
  2. [root@node1 ~]# cd /usr/local/
  3. [root@node1 local]# mv mysql-5.7.35-el7-x86_64/ mysql
  4. #创建mysql数据目录以及配置目录
  5. [root@node1 local]# mkdir mysql/{data,conf,logs,binlog}
  6. #添加mysql环境变量
  7. [root@node1 ~]# cat >> .bash_profile << 'EOF'
  8. #MySQL环境变量
  9. export MYSQL_HOME=/usr/local/mysql
  10. export PATH=$PATH:$MYSQL_HOME/bin
  11. EOF
  12. [root@node1 ~]# source .bash_profile

配置mysql

  1. cat > my.cnf << 'EOF'
  2. #客户端配置,包括客户端连接mysql服务器的相关配置
  3. [client]
  4. port = 3306
  5. socket = /usr/local/mysql/mysqld.sock
  6. default-character-set = utf8mb4
  7. #MySQL命令行客户端的配置
  8. [mysql]
  9. #指定MySQL命令行提示符的格式。
  10. prompt="\u@mysqldb \R:\m:\s [\d]> "
  11. #禁用自动补全功能
  12. no-auto-rehash
  13. #指定MySQL命令行客户端的默认字符集
  14. default-character-set = utf8mb4
  15. #MySQL服务器的配置
  16. [mysqld]
  17. #指定MySQL服务器运行的用户 (一般设置为mysql,需要提前创建mysql用户)
  18. user = mysql
  19. #指定MySQL服务器监听的端口号
  20. port = 3306
  21. socket = /usr/local/mysql/mysqld.sock
  22. #禁用DNS反向解析
  23. skip-name-resolve
  24. # 设置字符编码
  25. character-set-server = utf8
  26. collation-server = utf8_general_ci
  27. # 设置默认时区
  28. #default-time_zone='+8:00'
  29. #指定MySQL服务器的唯一标识
  30. server-id = 1
  31. # Directory
  32. #安装目录
  33. basedir = /usr/local/mysql
  34. #数据存储目录
  35. datadir = /usr/local/mysql/data
  36. #安全文件目录
  37. secure_file_priv = /usr/local/mysql/data
  38. #PID文件的路径
  39. pid-file = /usr/local/mysql/mysql.pid
  40. #MySQL服务器的最大连接数
  41. max_connections = 1024
  42. #最大连接错误数
  43. max_connect_errors = 100
  44. #连接超时时间
  45. wait_timeout = 100
  46. #最大允许数据包大小
  47. max_allowed_packet = 128M
  48. #表缓存数量
  49. table_open_cache = 2048
  50. #连接请求队列长度
  51. back_log = 600
  52. #指定MySQL服务器的默认存储引擎
  53. default-storage-engine = innodb
  54. #允许二进制日志中包含函数创建语句
  55. log_bin_trust_function_creators = 1
  56. # Log
  57. #关闭通用查询日志
  58. general_log=off
  59. #general_log_file = /usr/local/mysql/logs/mysql.log
  60. #错误日志的路径
  61. log-error = /usr/local/mysql/logs/error.log
  62. # binlog
  63. #指定二进制日志的路径和格式
  64. log-bin = /usr/local/mysql/binlog/mysql-binlog
  65. binlog_format=mixed
  66. #slowlog慢查询日志
  67. slow_query_log = 1
  68. slow_query_log_file = /usr/local/mysql/logs/slow.log
  69. long_query_time = 2
  70. log_output = FILE
  71. log_queries_not_using_indexes = 0
  72. #global_buffers
  73. innodb_buffer_pool_size = 2G
  74. innodb_log_buffer_size = 16M
  75. innodb_flush_log_at_trx_commit = 2
  76. key_buffer_size = 64M
  77. innodb_log_file_size = 512M
  78. innodb_log_file_size = 2G
  79. innodb_log_files_in_group = 2
  80. innodb_data_file_path = ibdata1:20M:autoextend
  81. sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  82. [mysqldump]
  83. #指定mysqldump工具使用快速导出模式
  84. quick
  85. #指定mysqldump工具允许的最大数据包大小为32M
  86. max_allowed_packet = 32M
  87. EOF

初始化MySQL并启动

  1. [root@node1 conf]# ln my.cnf /etc/my.cnf
  2. #将mysql文件下的文件归属设置为mysql
  3. [root@node1 conf]# chown -R mysql.mysql /usr/local/mysql/
  4. #初始化mysql
  5. [root@node1 conf]# cd ..
  6. [root@node1 mysql]# ./bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql
  7. #配置mysql快捷启动
  8. [root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
  9. [root@node1 mysql]# chmod +x /etc/init.d/mysqld
  10. #启动mysql
  11. [root@node1 mysql]# /etc/init.d/mysqld start
  12. Starting MySQL. SUCCESS!
  1. #设置mysql开机自启
  2. [root@node1 mysql]# chkconfig --level 35 mysqld on
  3. [root@node1 mysql]# chkconfig --list mysqld
  4. [root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld
  5. [root@node1 mysql]# chkconfig --add mysqld
  6. [root@node1 mysql]# chkconfig --list mysqld
  7. [root@node1 mysql]# service mysqld status
  8. [root@node1 mysql]# reboot
  9. [root@node1 ~]# ss -ntulp | grep mysql
  10. tcp LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=1712,fd=32))

创建Hive使用的相关用户并授权

  1. #登录mysql
  2. #查看mysql初始化密码
  3. [root@node1 ~]# grep password /usr/local/mysql/logs/error.log
  4. A temporary password is generated for root@localhost: rk#SdSy6&BB1
  5. #修改mysql密码方法1
  6. [root@node1 ~]# mysqladmin -uroot -p'rk#SdSy6&BB1' password 123456
  7. [root@node1 ~]# mysql -uroot -p123456
  8. root@mysqldb 22:50: [(none)]> set PASSWORD = PASSWORD('123'); #修改密码方法2
  9. root@mysqldb 22:55: [(none)]> flush privileges;
  10. #添加远程访问权限
  11. root@mysqldb 22:55: [(none)]> grant all privileges on *.* to 'root'@'%' identified by '123' with grant option;
  12. #创建hive库并授权
  13. root@mysqldb 22:58: [(none)]> create database hive;
  14. root@mysqldb 22:58: [(none)]> create user "hive"@"%" identified by "123";
  15. root@mysqldb 22:59: [(none)]> grant all privileges on hive.* to "hive"@"%";
  16. root@mysqldb 23:00: [(none)]> flush privileges;

解压hive安装包并配置环境变量

  1. [bigdata@node1 ~]$ tar -xf apache-hive-3.1.3-bin.tar.gz -C /home/bigdata/
  2. [bigdata@node1 ~]$ mv /home/bigdata/apache-hive-3.1.3-bin/ /home/bigdata/hive
  3. #配置环境变量
  4. [bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
  5. #Hive环境变量
  6. export HIVE_HOME=/home/bigdata/hive
  7. export PATH=$PATH:$HIVE_HOME/bin
  8. EOF
  9. [bigdata@node1 ~]$ source .bash_profile

修改hive配置

  1. [bigdata@node1 ~]$ cd /home/bigdata/hive/conf/
  2. #配置hive日志文件
  3. [bigdata@node1 conf]$ cp hive-log4j2.properties.template hive-log4j2.properties
  4. [bigdata@node1 conf]$ vim hive-log4j2.properties
  5. property.hive.log.dir = /home/bigdata/hive/logs
  6. [bigdata@node1 conf]$ cp hive-env.sh.template hive-env.sh
  7. #用vim修改hive-env.sh,最后修改如下:
  8. [bigdata@node1 conf]$ grep -vE '^$|^#' hive-env.sh
  9. HADOOP_HOME=/home/bigdata/hadoop
  10. export HIVE_CONF_DIR=/home/bigdata/hive/conf
  11. export HIVE_AUX_JARS_PATH=/home/bigdata/hive/lib

配置metastore

metastore是Hive用于管理库表元数据的服务,它存储了Hive中的元数据信息。元数据信息包括表的结构、列、分区等信息,以及表的索引、约束、视图等。有了Metastore服务,Hive的客户端应用程序可以通过连接Metastore服务来获取这些元数据信息,而无需直接访问底层的文件系统。这使得客户端可以基于结构化的库表信息构建计算框架,简化了数据访问和管理。
在hive-metastore节点上操作,即node1和node2上

  1. #创建hdfs相关目录,记得启动zk、hdfs和yarn,上面我重启过系统
  2. [bigdata@node1 conf]$ hdfs dfs -mkdir -p /home/bigdata/data/hive/{warehouse,tmp,logs}
  1. #创建配置文件metastore-site.xml,是Hive的元数据存储配置文件,用于指定Hive元数据存储的位置和相关配置。创建metastore-site.xml文件后,可以在其中配置Hive元数据存储的数据库类型、连接信息、用户名、密码等信息。
  2. [bigdata@node1 conf]$ cat > metastore-site.xml << 'EOF'
  3. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  4. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  5. <configuration>
  6. <!--指定Hive元数据存储在本地 -->
  7. <property>
  8. <name>hive.metastore.local</name>
  9. <value>true</value>
  10. </property>
  11. <!--Hive作业的HDFS根目录位置 -->
  12. <property>
  13. <name>hive.exec.scratchdir</name>
  14. <value>/home/bigdata/data/hive/tmp</value>
  15. </property>
  16. <!--Hive作业的HDFS根目录创建和写权限 -->
  17. <property>
  18. <name>hive.scratch.dir.permission</name>
  19. <value>775</value>
  20. </property>
  21. <!--指定Hive元数据存放在HDFS上的位置 -->
  22. <property>
  23. <name>hive.metastore.warehouse.dir</name>
  24. <value>/home/bigdata/data/hive/warehouse</value>
  25. </property>
  26. <!--连接数据库地址,名称 -->
  27. <property>
  28. <name>javax.jdo.option.ConnectionURL</name>
  29. <value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true</value>
  30. </property>
  31. <!--连接数据库驱动 -->
  32. <property>
  33. <name>javax.jdo.option.ConnectionDriverName</name>
  34. <value>com.mysql.jdbc.Driver</value>
  35. </property>
  36. <!--连接数据库用户名称 -->
  37. <property>
  38. <name>javax.jdo.option.ConnectionUserName</name>
  39. <value>hive</value>
  40. </property>
  41. <!--连接数据库用户密码 -->
  42. <property>
  43. <name>javax.jdo.option.ConnectionPassword</name>
  44. <value>123</value>
  45. </property>
  46. <!-- 指定metastore连接地址 -->
  47. <property>
  48. <name>hive.metastore.uris</name>
  49. <value>thrift://node1:9083,thrift://node2:9083</value>
  50. </property>
  51. </configuration>
  52. EOF

分发文件到其他节点

  1. [bigdata@node1 conf]$ for i in {node2,node3}
  2. do
  3. scp -r /home/bigdata/hive/ $i:/home/bigdata/
  4. scp ~/.bash_profile $i:~/
  5. done

初始化MYSQL

下载mysql驱动包到Hive的lib目录下

MySQL :: Download MySQL Connector/J (Archived Versions)

  1. mv mysql-connector-java-5.1.49.jar hive/lib/
  2. scp lib/mysql-connector-java-5.1.49.jar node2:~/hive/lib/
  3. scp lib/mysql-connector-java-5.1.49.jar node3:~/hive/lib/
  1. 删除hive下的log4j-slf4j-impl-2.17.1.jar,会与hadoop下的slf4j-reload4j-1.7.36.jar 冲突
  2. [bigdata@node1 ~]$ for i in {node1,node2,node3}
  3. do
  4. ssh $i "rm -f /home/bigdata/hive/lib/log4j-slf4j-impl-2.17.1.jar"
  5. done
标签: hadoop zookeeper spark

本文转载自: https://blog.csdn.net/nsa65223/article/details/135381295
版权归原作者 nsa65223 所有, 如有侵权,请联系我们删除。

“Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive”的评论:

还没有评论