本地源介绍
本次比赛提供相应的软件压缩包以及相关的xml配置文件、数据集,其地址为
内网地址:http://172.16.47.240/bigdata/(用于实验中下载对应软件,以下源地址使用内网IP)
外网地址:http://39.101.211.115/bigdata/(供浏览器访问查看具体路径及内容)
相关安装软件、xml配置文件Bigdata_Conf.tar.gz的路径在bigdata_tar/下。
注意:配置文件需要自己修改。
MySQL Server的yum源路径为http://172.16.47.240/bigdata/repofile,这里直接提供repo文件为bigdata.repo,直接将其下载至/etc/yum/repos.d/即可,然后就可以下载MySQL Server。
基础部分
1、基础搭建
本次集群搭建共有三个节点,包括一个主节点master,和两个从节点slave1和slave2。具体操作如下:
1.1更改本地源
1.使用本地Windows操作机提供的Xshell或MobaXterm连接比赛平台所提供的master,slave1,slave2三台机器,并按照比赛平台提供的linux用户和密码进行登录,登录成功后开始进行接下来的比赛。
注意连接工具没有在桌面上,点击(或者键入)左下角“windows”,即可看到连接工具。
- 修改主机名:hostnamectl set-hostname master(在master执行)
- 立即生效:bash
同理修改slave1和slave2的主机名。
- hostnamectl set-hostname slave1(在slave1执行)
- hostnamectl set-hostname slave2(在slave2执行)
2.配置本地源。通过比赛平台提供源文件下载路径,将本地源文件下载到/etc/yum.repos.d/目录下(三台机器都执行)。
- 发信号给yum进程:pkill -9 yum
- 进入yum源配置文件:cd /etc/yum.repos.d
- 删除所有文件:rm -rf *
- 下载yum源:wget http://172.16.47.240/bigdata/repofile/bigdata.repo
- 清除YUM缓存:yum clean all
1.2 配置hosts文件
可以通过ifconfig命令进行查看机器的ip地址或者直接输入比赛平台提供的ip地址。
查看节点地址之后将三个节点的ip地址以及其对应的名称写进hosts文件。这里我们设置为master、slave1、slave2。注意保存退出。
vim /etc/hosts(三台机器都执行)
172.18.38.122 master
172.18.38.123 slave1
172.18.38.124 slave2
1.3 关闭防火墙
- 关闭防火墙:systemctl stop firewalld
- 查看状态:systemctl status firewalld
注意:当环境重置之后,防火墙会自动开启。
1.4 时间同步
- 选择时区:tzselect
给出相应的提示之后,将时间设置写入环境变量。
- echo "TZ='Asia/Shanghai'; export TZ" >> /etc/profile && source /etc/profile
1.5下载ntp
- yum install -y ntp
master作为ntp服务器:
修改ntp配置文件。屏蔽掉默认的server,设置master作为局域网内时钟源,设置时间服务器的层级为10,为集群主机提供时间服务。
- vim /etc/ntp.conf
#注释掉server 0 ~ n
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10 #stratum设置为其它值也是可以的,其范围为0~15
修改后注意保存退出。
重启ntp服务(master上执行)
- /bin/systemctl restart ntpd.service
其他机器进行同步(在slave1,slave2中执行)
- ntpdate master
1.6 制作定时任务
确保crontab服务开启:
service crond status
/sbin/service crond start
要求:从节点(slave1、slave2)在早八晚五时间段每隔半个小时同步一次时间
- crontab -e
- 输入i
- 添加定时任务:*/30 8-17 * * * /usr/sbin/ntpdate master
- 查看定时任务列表:crontab –l
1.5 配置ssh免密
1.在master上执行如下命令生成公私密钥:(注意master上执行)
- ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2.然后将公钥文件内容添加到授权文件。
- cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys
可以将master授权文件复制到slave1、slave2信任授权设置。
- scp ~/.ssh/authorized_keys root@slave1:~/.ssh/
- scp ~/.ssh/authorized_keys root@slave2:~/.ssh/
注意:SSH只需要namenode和datanode之间通信,datanode之间并没有交互,所以SSH公钥只需要namenode和datanode之间交换。
2、安装JDK
以下操作为先在master上操作,然后远程复制到slave1和slave2。参赛选手仅供参考。
首先在根目录下建立工作路径/usr/java。
- mkdir -p /usr/java
进入创建的java工作路径。
- cd /usr/java
下载java安装包(master上执行)。
- wget http://172.16.47.240/bigdata/bigdata_tar/jdk-8u171-linux-x64.tar.gz
- tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/java/
- rm -rf /usr/java/jdk-8u171-linux-x64.tar.gz
- 修改环境变量:vim /etc/profile
添加内容如下:
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
- 生效环境变量:source /etc/profile
- 查看java版本:java -version
在master中将JDK复制到slave1和slave2中。(在master执行)
- scp -r /usr/java root@slave1:/usr/
- scp -r /usr/java root@slave2:/usr/
注意:此时需要去slave1和slave2上配置java的环境变量,并使环境变量生效。
3、安装zookeeper
3.1 下载软件
创建工作路径/usr/zookeeper,下载相应软件,解压至工作路径。
mkdir -p /usr/zookeeper && cd /usr/zookeeper
wget http://172.16.47.240/bigdata/bigdata_tar/zookeeper-3.4.10.tar.gz
tar -zxvf /usr/zookeeper/zookeeper-3.4.10.tar.gz -C /usr/zookeeper/
rm -rf /usr/zookeeper/zookeeper-3.4.10.tar.gz
3.2 配置zookeeper环境变量
- vi /etc/profile
#zookeeper
export ZOOKEEPER_HOME=/usr/zookeeper/zookeeper-3.4.10
PATH=$PATH:$ZOOKEEPER_HOME/bin
- 生效环境变量:source /etc/profile
3.3 配置文件zoo.cfg
1.进入zookeeper配置文件夹conf,将zoo_sample.cfg文件拷贝一份命名为zoo.cfg,Zookeeper 在启动时会找这个文件作为默认配置文件。
- cd /usr/zookeeper/zookeeper-3.4.10/conf/ && mv zoo_sample.cfg zoo.cfg && vim zoo.cfg
2.对zoo.cfg文件配置如下:
- vim zoo.cfg
修改如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/zookeeper/zookeeper-3.4.10/zkdata
clientPort=2181
dataLogDir=/usr/zookeeper/zookeeper-3.4.10/zkdatalog
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
3.在zookeeper的目录中,创建配置中所需的zkdata和zkdatalog两个文件夹。(在master执行)
- cd /usr/zookeeper/zookeeper-3.4.10 && mkdir zkdata zkdatalog
4.进入zkdata文件夹,创建文件myid,用于表示是几号服务器,用来标识当前主机。master主机中,设置服务器id为1。(集群中设置master为1号服务器,slave1为2号服务器,slave2为3号服务器)
- cd /usr/zookeeper/zookeeper-3.4.10/zkdata
- echo 1 >> myid
3.4启动ZooKeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本。注意在zookeeper目录下:(三台机器都执行)
- 开启服务:zkServer.sh start
- 查看状态:zkServer.sh status
通过上面状态查询结果可见,一个节点是Leader,其余的结点是Follower。
至此,zookeeper安装成功。
4、安装hadoop
以下步骤逻辑仅供选手参考:即hadoop安装同样在主节点master上进行配置操作,然后将文件复制到到子节点slave1和slave2。
4.1 解压安装包,配置环境变量
1. 创建工作路径/usr/hadoop,下载相应软件,解压至工作路径。
- mkdir -p /usr/hadoop && cd /usr/hadoop
- wget http://172.16.47.240/bigdata/bigdata_tar/hadoop-2.7.3.tar.gz
- tar -zxvf /usr/hadoop/hadoop-2.7.3.tar.gz -C /usr/hadoop/
- rm -rf /usr/hadoop/hadoop-2.7.3.tar.gz
2.添加hadoop环境变量(三台机器执行)
- vim /etc/profile
添加如下内容:
#hadoop
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使用以下命令使profile生效:
- source /etc/profile
4.2 配置hadoop各组件
hadoop的各个组件的都是使用XML进行配置,这些文件存放在hadoop的etc/hadoop目录下。
配置文件 | 配置对象 | 主要内容 |
hadoop-env.sh | hadoop运行环境 | 用来定义Hadoop运行环境相关的配置信息; |
core-site.xml | 集群全局参数 | 定义系统级别的参数,包括HDFS URL、Hadoop临时目录等; |
hdfs-site.xml | HDFS参数 | 定义名称节点、数据节点的存放位置、文本副本的个数、文件读取权限等; |
mapred-site.xml | MapReduce参数 | 包括JobHistory Server 和应用程序参数两部分,如reduce任务的默认个数、任务所能够使用内存的默认上下限等; |
yarn-site.xml | 集群资源管理系统参数 | 配置ResourceManager ,nodeManager的通信端口,web监控端口等; |
1. hadoop-env.sh运行环境
- cd $HADOOP_HOME/etc/hadoop
- vim hadoop-env.sh
输入以下内容,修改java环境变量:
export JAVA_HOME=/usr/java/jdk1.8.0_171
- 也可以直接输入命令:echo "export JAVA_HOME=/usr/java/jdk1.8.0_171" >> hadoop-env.sh
键入“Esc”,退出编辑模式,使用命令“:wq”进行保存退出。
2. core-site.xml全局参数
- vim core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/hadoop-2.7.3/hdfs/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>60</value>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property></configuration>
master:在主节点的ip或者映射名。
9000:主节点和从节点配置的端口都是9000。
3. hdfs-site.xml配置文件
dfs.replication:因为hadoop是具有可靠性的,它会备份多个文本,这里value就是指备份的数量(小于等于从节点的数量)。
在<configuration></configuration>中加入以下代码:
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/data</value>
</property>
4. YARN框架运行环境
找到JAVA_HOME参数位置,将前面的#去掉,将其值修改为本机安装的JDK的实际位置。
vim yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_171
也可以直接输入命令:
echo "export JAVA_HOME=/usr/java/jdk1.8.0_171" >> yarn-env.sh
5. YARN框架的核心配置
YARN 框架的核心配置文件,用于配置 YARN 进程及 YARN 的相关属性。
首先需要指定 ResourceManager 守护进程所在主机,默认为 0.0.0.0,即当前设备,所以这里指定为master,端口为18141;
其次需要设置 NodeManager 上运行的辅助服务,需配置成 mapreduce_shuffle 才可运行 MapReduce 程序。
在<configuration></configuration>中加入以下代码:
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<!-- 指定reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
6. 编辑配置计算框架
该文件是MapReduce的核心配置文件,用于指定MapReduce运行时框架。
- cp mapred-site.xml.template mapred-site.xml && vim mapred-site.xml
在<configuration></configuration>中加入以下代码:
<property>
<!--指定Mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
注意保存退出。
7. 编写slaves和master文件
编写slaves文件,添加子节点slave1和slave2;
编写master文件,添加主节点master。
- echo master > master && echo slave1 > slaves && echo slave2 >> slaves
8. 格式化hadoop
- 格式化namenode:hadoop namenode -format (仅在master中进行操作)
当出现“Storage directory /usr/hadoop/hadoop-2.7.3/hdfs/name has been successfully formatted.”的时候,表明格式化成功。
9. 开启hadoop集群
仅在master主机上开启操作命令。它会带起从节点的启动。(仅在master中进行操作)
- 主节点开启服务:start-all.sh
使用hadoop命令“hadoop fs”进行相关操作。
5、安装hive
实验中我们选用hive的远程模式,slave2安装mysql server用于存放元数据,slave1作为hive server作为thrift 服务器,master作为client客户端进行操作。
5.1slave2上安装MySQL server
1.配置过本地源了,安装MySQL Server
- 安装MySQL:yum -y install mysql-community-server
2.启动服务
- 重载所有修改过的配置文件:systemctl daemon-reload
- 开启服务:systemctl start mysqld
- 开机自启:systemctl enable mysqld
3.登陆MySQL
安装完毕后,MySQL会在/var/log/mysqld.log这个文件中会自动生成一个随机的密码,获取得这个随机密码,以用于登录MySQL数据库:
- 获取初密码: grep "temporary password" /var/log/mysqld.log
- 登陆MySQL:mysql -uroot -p(注意中英文)
4.MySQL密码安全策略设置
- 设置密码强度为低级:set global validate_password_policy=0;
- 设置密码长度:set global validate_password_length=4;
- 修改本地密码:alter user 'root'@'localhost' identified by '123456';
- 退出:\q
密码强度分级如下:
- 0为low级别,只检查长度;
- 1为medium级别(默认),符合长度为8,且必须含有数字,大小写,特殊字符;
- 2为strong级别,密码难度更大一些,需要包括字典文件。
- 密码长度最低长为4,当设置长度为1、2、3时,其长度依然为4。
5. 设置远程登录
- 以新密码登陆MySQL:mysql -uroot -p123456
- 创建用户:create user 'root'@'%' identified by '123456';
- 允许远程连接:grant all privileges on *.* to 'root'@'%' with grant option;
- 刷新权限:flush privileges;
6.创建数据库hongyaa;
5.2数据仓库下载安装
1. 下载解压
同样slave1上建立文件夹/usr/hive,然后master中将安装包远程复制到slave1。
- mkdir -p /usr/hive && cd /usr/hive
- wget http://172.16.47.240/bigdata/bigdata_tar/apache-hive-2.1.1-bin.tar.gz
- tar -zxvf /usr/hive/apache-hive-2.1.1-bin.tar.gz -C /usr/hive/
- rm -rf /usr/hive/apache-hive-2.1.1-bin.tar.gz
也可以使用如下命令:
- mkdir -p /usr/hive && cd /usr/hive/ && wget http://172.16.47.240/bigdata/bigdata_tar/apache-hive-2.1.1-bin.tar.gz && tar -zxvf /usr/hive/apache-hive-2.1.1-bin.tar.gz -C /usr/hive/ && rm -rf /usr/hive/apache-hive-2.1.1-bin.tar.gz
2. 设置系统变量
修改/etc/profile文件设置hive环境变量。(master和slave1都执行)
- vim /etc/profile
#hive
export HIVE_HOME=/usr/hive/apache-hive-2.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin
- 生效环境变量:source /etc/profile
3. 设置HIVE运行环境
- cd $HIVE_HOME/conf && vim hive-env.sh
对应设置如下:
# 配置Hadoop安装路径
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
# 配置Hive配置文件存放路径
export HIVE_CONF_DIR=/usr/hive/apache-hive-2.1.1-bin/conf
# 配置Hive运行资源库路径
export HIVE_AUX_JARS_PATH=/usr/hive/apache-hive-2.1.1-bin/lib
4. jline版本冲突问题
由于客户端需要和hadoop通信,所以需要更改Hadoop中jline的版本,即保留一个高版本的jline-jar包。
- cp $HIVE_HOME/lib/jline-2.12.jar $HADOOP_HOME/share/hadoop/yarn/lib/
5.3 hive元数据配置到MySQL(服务器端slave1)
1. 驱动拷贝
因为服务端需要和Mysql通信,所以服务端需要将Mysql的依赖包放在Hive的lib目录下。
mysql-connector-java是MySQL的JDBC驱动包,用JDBC连接MySQL数据库时必须使用该jar包。
- cd $HIVE_HOME/lib && wget http://172.16.47.240/bigdata/bigdata_tar/mysql-connector-java-5.1.47-bin.jar
2. Slave1作为服务器端配置hive
- cd $HIVE_HOME/conf
修改hive-site.xml文件
<configuration>
<!-- Hive产生的元数据存放位置-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<!-- 数据库连接driver,即MySQL驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- 数据库连接JDBC的URL地址-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<!-- MySQL数据库用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- MySQL数据库密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
5.4 Master作为客户端配置hive
和slave1中配置方式类似,直接进入conf,进行设置。
Hive服务和metastore在不同的进程内,可能是不同的机器,该模式需要将hive.metastore.local设置为false。
将hive.metastore.uris设置metastore服务器URL,端口设定为9083。
hive-site.xml配置如下:
<configuration>
<!-- Hive产生的元数据存放位置-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<!--- 使用本地服务连接Hive,默认为true-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!-- 连接服务器-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave1:9083</value>
</property>
</configuration>
5.7成功启动Hive
1.初始化数据库
slave1上:
- schematool -dbType mysql -initSchema
2.启动hive server服务
设置成远程模式之后必须保证先启动metastore服务或者进程,之后才能进行开启客户端。
- hive --service metastore(注意空格)
3.启动hive client
- hive
创建数据库hongyaa
- hive>create database hongyaa;
8.集群节点增加与删除
8.1 添加DataNode --------------slave3
1.基础操作
配置本地源;
关闭防火墙;
临时主机名;
生效时区;
2.修改所有机器的hosts文件
添加slave3的IP及映射。(所有节点)
vim /etc/hosts
xxxxxx master
xxxxxx slave1
xxxxxx slave2
xxxxxx slave3
3.同步master时间
下载ntp:yum install -y ntp && ntpdate master
关闭提示信息:echo "unset MAILCHECK">> /etc/profile && source /etc/profile
4.NN与DN之间免密
需要在master机器中将.ssh目录下的公钥认证列表authorized_keys发送给slave3
scp ~/.ssh/authorized_keys root@slave3:~/.ssh/
5.安装JDK和Hadoop
在新的服务器中安装好jdk环境以及hadoop,生效环境变量。
环境变量:vim /etc/profile
#Java
export JAVA_HOME=/usr/java/jdk1.8.0_171
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
#hadoop
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export CLASSPATH=$CLASSPATH:$HADOOP_HOME/lib
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
6.修改salves文件
修改hadoop配置目录下slaves文件,添加slave3。(所有节点)
vim $HADOOP_HOME/etc/hadoop/slaves
slave1
slave2
slave3
7.启动节点进程
启动datanode进程:$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode
启动nodemanage进程:$HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager
8.查看集群状态
主节点刷新:hdfs dfsadmin -refreshNodes
均衡block:sbin/start-balancer.sh
查看存活的节点:hdfs dfsadmin -report
也通过浏览器访问namenode和mapreduce,看集群中是否添加了一个节点。
8.2 删除DataNode--------------slave2
1.临时删除节点:(仅做参考)
hadoop-daemon.sh stop datanode
hadoop-daemon.sh stop tasktracker
2.永久删除:(通过此步骤执行)
master主机中hdfs-site.xml配置如下:
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/hadoop/hadoop-2.7.3/etc/hadoop/excludes</value>
<description>拒绝加入集群的节点列表</description>
</property>
3.然后在conf目录下创建一个excludes文件,将需要删除的节点机器名添加到文件中即可。
4.强制重新加载配置:
主节点刷新所有DataNode:hdfs dfsadmin -refreshNodes
查看存活的节点:hdfs dfsadmin -report
可以看到该datanode状态转为Decommission In Progress。(退役)
执行完毕之后显示Decommission Status : Decommissioned
5.删除节点上关闭进程:(slave2)
hadoop-daemon.sh stop datanode
yarn-daemon.sh stop nodemanager
6.(时间间隔较久,500s)再次查看节点状态:hdfs dfsadmin -report
7.最后更新集群配置
数据块重新分布:sbin/start-balancer.sh(数据均衡)
从NameNode的excludes文件及slaves文件、hosts文件中去掉已经移除的主机名