docker5_搭建hadoop集群
链接: 基于CentOS 8 x86的hadoop docker集群搭建
连接进入node1容器
docker exec -it gpb_hdp_node1 bash
或
ssh -p 10122 root@localhost
1、安装Mysql
因为是在线安装Mysql,而服务器无法连接外网,先安装离线的组件。
2、安装Zookeeper
下载并上传zookeeper-3.4.9.tar.gz安装包到node1
ubuntu@node2:/home/data$ scp -P 10122 apache-zookeeper-3.5.7-bin.tar.gz root@localhost:/root
解压到/export/server/目录
[root@69432059c763 server]# tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /export/server/
创建软连接
ln -s /export/server/apache-zookeeper-3.5.7-bin /export/server/zookeeper
修改配置文件
第一台机器修改配置文件
cd /export/server/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/server/zookeeper/zkdatas/
编辑zoo.cfg
,修改或增加下面几项
dataDir=/export/server/zookeeper/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少个小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
安装包分发并修改myid值
scp -r /export/server/zookeeper/ node2:/export/server/
scp -r /export/server/zookeeper/ node3:/export/server/
添加myid配置
在/export/server/zookeeper/zkdatas/ 下创建myid文件,并写入1
echo "1" > /export/server/zookeeper/zkdatas/myid
ssh node2 "echo \"2\" > /export/server/zookeeper/zkdatas/myid"
ssh node3 "echo \"3\" > /export/server/zookeeper/zkdatas/myid"
三台机器启动zookeeper服务
启动服务(三台服务器分别执行)
/export/server/zookeeper/bin/zkServer.sh start
ssh node2
/export/server/zookeeper/bin/zkServer.sh start
ssh node3
/export/server/zookeeper/bin/zkServer.sh start
检查zookeeper是否启动成功
[root@068874a8c481 ~]# ssh node1
Last login: Thu May 25 11:48:00 2023 from 172.17.0.5
[root@69432059c763 ~]# jps
1876 Jps
1770 QuorumPeerMain
[root@69432059c763 ~]# /export/server/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /export/server/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@69432059c763 ~]#
3、安装Hadoop
下载并上传hadoop-3.1.3.tar.gz安装包到node1
ubuntu@node2:/home/data$ scp -P 10122 hadoop-3.1.3.tar.gz root@localhost:/root
解压到/export/server/目录
tar -zxvf hadoop-3.1.3.tar.gz -C /export/server/
重命名文件夹
mv /export/server/hadoop-3.1.3 /export/server/hadoop
这里用软连接会有点问题,日志文件会默认走/export/server/hadoop-3.1.3/logs这个路径,导致从节点找不到这个路径
修改配置文件
1.hadoop-env.sh
vim /export/server/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/export/server/jdk1.8.0_231
export HADOOP_HOME=/export/server/hadoop
#文件最后添加 设置用户以执行对应角色shell命令
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
2.core-site.xml
mkdir -p /export/server/hadoop/hadoopDatas/tempDatas/
vim /export/server/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<!-- hdfs的服务端口 -->
<value>hdfs://node1:8020</value>
</property>
<property>
<!-- 指定临时存储空间 -->
<name>hadoop.tmp.dir</name>
<!-- 这个路径需要手动创建 -->
<value>/export/server/hadoop/hadoopDatas/tempDatas</value>
</property>
<!-- 缓冲区大小,实际工作中根据服务器的性能动态调整 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
<name>fs.trash.interval</name>
<!-- 7天 -->
<value>10080</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
3.hdfs-site.xml
mkdir -p /export/server/hadoop/hadoopDatas/namenodeDatas/
mkdir -p /export/server/hadoop/hadoopDatas/namenodeDatas2/
mkdir -p /export/server/hadoop/hadoopDatas/nn/edits/
mkdir -p /export/server/hadoop/hadoopDatas/snn/name/
mkdir -p /export/server/hadoop/hadoopDatas/dfs/snn/edits/
vim /export/server/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<!-- 指定secondaryNameNode的web地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:50090</value>
</property>
<!-- 指定namenode的web访问地址和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>node1:50070</value>
</property>
<!-- 指定namenode元数据的存放位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/server/hadoop/hadoopDatas/namenodeDatas,file:///export/server/hadoop/hadoopDatas/namenodeDatas2</value>
</property>
<!-- 定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///export/server/hadoop/hadoopDatas/datanodeDatas,file:///export/server/hadoop/hadoopDatas/datanodeDatas2</value>
</property>
<!-- 指定namenode日志文件的存放目录 -->
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/server/hadoop/hadoopDatas/nn/edits</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///export/server/hadoop/hadoopDatas/snn/name</value>
</property>
<property>
<name>dfs.namenode.checkpoint.edits.dir</name>
<value>file:///export/server/hadoop/hadoopDatas/dfs/snn/edits</value>
</property>
<!-- 文件切片的副本个数,也就是每个切片冗余存储的个数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 设置HDFS的文件权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!-- 设置一个文件切片的大小:128M-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
</configuration>
4.mapred-site.xml
/export/server/hadoop/etc/hadoop/mapred-site.xml
如果这个没有源文件,有一个模板文件(mapred-site.xml.template
),复制模板文件再重命名mapred-site.xml
即可
vim /export/server/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定分布式计算使用的框架是yarn。yarn集群模式 local本地模式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 开启MapReduce小任务模式 -->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!-- 设置历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- 设置网页访问历史任务的主机和端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/export/server/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/export/server/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/export/server/hadoop</value>
</property>
</configuration>
5.yarn-site.xml
vim /export/server/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<!-- 配置yarn主节点的位置 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MR程序。-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启日志聚合功能,收集每个容器的日志集中存储在一个地方 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置聚合日志在hdfs上的保存时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 设置yarn集群的内存分配方案 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器虚拟内存与物理内存之间的比率。-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
</configuration>
6.mapred-env.sh
vim /export/server/hadoop/etc/hadoop/mapred-env.sh
export JAVA_HOME=/export/server/jdk1.8.0_231
7.workers
vim /export/server/hadoop/etc/hadoop/workers
node1
node2
node3
配置Hadoop环境变量
1.创建文件夹
mkdir -p /export/server/hadoop/hadoopDatas/tempDatas
mkdir -p /export/server/hadoop/hadoopDatas/namenodeDatas
mkdir -p /export/server/hadoop/hadoopDatas/namenodeDatas2
mkdir -p /export/server/hadoop/hadoopDatas/datanodeDatas
mkdir -p /export/server/hadoop/hadoopDatas/datanodeDatas2
mkdir -p /export/server/hadoop/hadoopDatas/nn/edits
mkdir -p /export/server/hadoop/hadoopDatas/snn/name
mkdir -p /export/server/hadoop/hadoopDatas/dfs/snn/edits
使用tree命令进行检查
[root@69432059c763 hadoopDatas]# tree /export/server/hadoop/hadoopDatas
/export/server/hadoop/hadoopDatas
├── datanodeDatas
├── datanodeDatas2
├── dfs
│ └── snn
│ └── edits
├── namenodeDatas
├── namenodeDatas2
├── nn
│ └── edits
├── snn
│ └── name
└── tempDatas
12 directories, 0 files
2.分发hadoop到node2、node3
cd /export/server/
scp -r hadoop node2:$PWD
scp -r hadoop node3:$PWD
3.配置环境变量
vim /etc/profile.d/my_env.sh
export HADOOP_HOME=/export/server/hadoop
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
保存退出后使用source /etc/profile.d/my_env.sh
使其生效
在三台机器上都要进行配置
scp /etc/profile.d/my_env.sh node2:/etc/profile.d/
scp /etc/profile.d/my_env.sh node3:/etc/profile.d/
source /etc/profile.d/my_env.sh
ssh node2
source /etc/profile.d/my_env.sh
ssh node3
source /etc/profile.d/my_env.sh
4.配置环境变量
注意在启动Hadoop之前,要先启动Zookeeper
主要启动两个模块:HDFS和YARN
HDFS首次启动需要格式化,之后启动不需要。
在第一台机器执行以下命令
cd /export/server/hadoop
bin/hdfs namenode -format # 注意:这一步是对namenode的格式化,创建一些文件与目录,只需要创建一次即可,如果再次使用则会导致数据丢失
sbin/start-dfs.sh # 启动hdfs
sbin/stop-dfs.sh # 关闭hdfs
sbin/start-yarn.sh # 启动yarn
sbin/stop-yarn.sh # 关闭yarn
sbin/mr-jobhistory-daemon.sh start historyserver#运行以后docker卡死
web浏览器访问端口,查看界面(注意提前映射好端口)
http://172.23.27.197:50070/explorer.html#/ 查看hdfs集群
http://172.23.27.197:8088/cluster 查看yarn集群
http://172.23.27.197:19888/jobhistory 查看历史完成的任务
4、安装Hive
上传安装包并解压
ubuntu@node2:/home/data$ scp -P 10122 apache-hive-3.1.2-bin.tar.gz root@localhost:/root
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /export/server/
创建软连接
cd /export/server/
ln -s apache-hive-3.1.2-bin/ hive
修改配置文件
解决 hadoop、 hive 之间 guava 版本差异
如果不一样的话需要进行如下操作,当前所选版本是一致的
cd /export/server/hive
rm -rf lib/guava-19.0.jar
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
添加 mysql jdbc 驱动到 hive 安装包 lib/文件下
mysql-connector-java-5.1.27-bin.jar
修改 hive 环境变量文件 添加 Hadoop_HOME
cd /export/server/hive/conf/
mv hive-env.sh.template hive-env.sh
vim hive-env.sh
export HADOOP_HOME=/export/server/hadoop
export HIVE_CONF_DIR=/export/server/hive/conf
export HIVE_AUX_JARS_PATH=/export/server/hive/lib
新增 hive-site.xml 配置 mysql 等相关信息
vim hive-site.xml
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://node3:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- H2S运行绑定host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>
<!-- 远程模式部署metastore 服务地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
<!-- 关闭元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 关闭元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
初始化
初始化metadata
cd /export/server/hive
bin/schematool -initSchema -dbType mysql -verbos
初始化成功会在mysql中创建74张表
启动
// An highlighted block
var foo = 'bar';