大数据项目综合能力练习
前言
本篇博客主要内容是:
虚拟机安装
centos7安装
hadoop环境搭建
jdk安装
zookeeper安装
Hbase安装
hive安装(内含MySQL安装)
本次练习所需的安装包都是开源软件,建议在去开源社区官网下载,但务必注意软件版本之间的联系,也可以到我的百度网盘下载,链接如下永久有效。
链接:https://pan.baidu.com/s/18UL2eUKTjbGSvPK9HVS4CQ
提取码:688k
注:VMware15可以到微信公众号:软件安装管家下载
虚拟机的安装
傻瓜式安装即可,如果需要破解密钥网上可查找。安装完成后打开页面:
Hadoop集群环境搭建
centos7安装
我使用的linux发行版是CentOS-7-x86_64-Minimal-1804.iso
(没有桌面,纯黑乎乎的命令行模式)
安装步骤按截图方式给出:
虚拟机名称可自己自定义 存放的位置也可以自己修改
根据自己的硬件 可适当增加或减少
根据自己的硬件 可适当增加或减少
点击创建新的虚拟磁盘
根据自己放置虚拟机的磁盘大小定义 将虚拟磁盘存储为单个文件 方便出故障后的删除操作
将下载好的ISO映像文件的存放位置加载到虚拟机:
启用共享文件夹,共享文件夹路径为你存放的hadoop生态圈组件的位置:
点击开启虚拟机:
点击屏幕,进入虚拟机,按下回车
注:快捷键ctrl+ALT 可实现在主机和虚拟机之间的切换
初学者选择中文即可,但是中文可能会出现一些问题,基础好的尽量使用英文:
点击开始安装:
点击root密码进行设置:
设置密码:
安装完成:点击重启即可
重启之后进入的命令行页面:
输入root用户及其密码进入系统:
注:输入密码在屏幕上不会显示出来,输入完成后按回车即可
centos7基础环境配置
要点:
克隆两台虚拟机作为从节点
修改主机名
配置hosts文件
关闭防火墙
配置时间同步
配置ssh免密登录
克隆两台虚拟机作为从节点
点击虚拟机——>管理——>克隆
点击下一步:
点击克隆虚拟机当前状态,下一步:
创建完整克隆,下一步:
虚拟机名称为slave1和slave2 ,改变存放位置:
完成克隆slave1,slave2步骤一致。
修改主机名
我们本次搭建集群有三个节点(一个主节点master,两个从节点slave1 和 slave2)
打开master、slave1、slave2
以主节点master为例,修改主机名为master(从节点修改为对应的主机名slave1和slave2 即可):
命令为:hostnamectl set-hostname <hostname>
永久修改主机名,编辑/ect/sysconfig/network文件,内容如下:
NETWORKING=yes
HOSTNAME=master
保存文件,重启虚拟机:reboot
查看是否生效: hostname
配置hosts文件
原因:使每个节点能使用对应的节点主机名连接对应的地址
hosts文件主要用于确定每个节点的IP地址,方便后续各节点能快速查到并访问。在master和slave1 、slave2都需要配置该文件。
使用ifconfig
命令查看当前虚拟机的IP地址:
查看完节点的地址之后将三个节点的IP地址以及其对应的名称写进hosts文件,保存退出:
补充:centos最小化系统安装设置IP(ifconfig没有找到)
- 输入
ifconfig
,发现系统提示没有找到
- 输入
ip addr
查看本机是否分配IP
在此我们需要记住本机网卡的名称,用于下一步使用,即ens33
- 进入网卡设置目录,执行
cd /etc/sysconfug/network-scripts
,查看下面的网卡文件:
-
找到对应的网卡文件执行命令
vi ifcfg-ens33
,进入后配置文件:
注:配置slave1和slave2时,只需要改IPADDR的值就行,将最后的145一次加一。 -
执行命令
service network restart
重启网卡服务:
-
执行完成后,再次执行
ip addr
查看是否分配到IP地址:
-
执行
yum provides ifconfig
查看是哪个包提供ifconfig命令,可以看到是net-tools包提供的:
-
执行命令
yum install net-tools
,安装完成就可以执行ifconfig命令了
关闭防火墙
centos7中防火墙命令使用firewalld取代了iptables。当防火墙状态为dead时表示防火墙已关闭。
关闭防火墙:systemctl stop firewalld
查看状态:systemctl status firewalld
防止开机自启动:systemctl disable firewalld.service
时间同步
时区一致。要保证设置主机时间的准确,每个机器时区必须一致。因此我们需要同步网络时间,首先选择一样的时区。时区先确保一样,否则同步以后时间也是有时区差。
- 使用
date
命令查看机器的时间 - 选择时区:
tzselect
因为hadoop集群对时间的要求很高,所以集群内主机要经常同步。我们使用ntp进行时间同步,master作为ntp服务器,其他的作为ntp客户端
- 所有节点下载ntp
NTP是网络时间协议,它是用来同步网络中各个计算机时间的协议。
yum install -y ntp
- 将master作为ntp服务器,修改ntp配置文件
命令行输入命令:
vi /etc/ntp.conf
配置文件:
解释:
#以本地时间作为时间服务
server 127.127.1.0 #local clock
fudge 127.127.1.0 stratum 10 #这行是时间服务器的层次,设为0则为顶级,如果要向别的NTP服务器更新时间则不要把它设为0 stratum取值范围是0~15
- 重启ntp服务:
/bin/systemctl restart ntpd service
- slave1和slave2同步master时间
等待五分钟左右,到slave1和slave2 同步时间:ntpdate master
配置ssh免密登录
ssh主要是通过RSA算法来产生公钥和私钥。在数据传输过程中对数据进行加密来保障数据的安全性和可靠性。公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。总而言之,这是一种非对称算法,想要破解还是非常有难度的。Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证,hadoop采用的是ssh的方法通过密钥验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提高访问效率。
步骤如下:
- 每个节点分别产生公私密钥:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
各个参数的含义:
-t参数就是指定要生成的密钥类型 这里指定的是dsa
-P就是你提供的旧密码‘’ 表示没有
-f是密钥的生成后的保存文件位置
- 密钥产生目录在用户主目录下的.ssh目录中,进入该目录:
cd .ssh
- id_dsa.pub为公钥,id_dsa为私钥,紧接着将公钥文件复制成authorized_keys文件(这一步只在master虚拟机上执行):
- 在主机上连接自己叫做ssh内回环:
ssh master
:
- master配置完成,现在是让master能够通过ssh免密登录两个子节点slave1和slave2
为了实现这个功能,两个slave节点的公钥文件中必须包含主节点的公钥信息,这样master就可以顺利访问子节点了。
slave节点通过scp命令远程登录master节点,并复制master的公钥文件到当前目录下,重命名为master_das.pub(这一过程需要密码验证)
scp master:~/.ssh/id_dsa.pub ./master_das.pub
将 master 结点的公钥文件追加至 authorized_keys 文件:cat master_das.pub >> authorized_keys
- 至此,ssh免密工作完成
测试:
安装jdk
在进行下面安装hadoop生态组件之前,请将安装包同一放到/opt/soft
路径下
- 首先建立工作路径
/usr/java
,并将jdk安装包解压到该路径,将解压后文件夹的名字改为jdk,然后在etc/profile里面写入jdk的配置
# -p可以递归创建文件夹
mkdir -p /usr/java
# tar -zxvf 解压命令 -C 解压到何处
tar -zxvf /opt/soft/jdk-8u171-linux-x64.tar.gz -C /usr/java
# 修改文件名。(本意是移动,但是当前后位置处于同一位置时变成修改文件名)
cd /usr/java
mv jdk1.8.0_171/ jdk
# 编辑profile文件
vi /etc/profile
修改配置如下:
- 修改完etc/profile以后生效配置文件(很重要),然后查看jdk版本观察是否安装成功
source /etc/profile
java -version
- 将目录拷贝到另外两台机器。(保证子节点存在/usr/java目录)
scp -r /usr/java/jdk slave1:/usr/java
scp -r /usr/java/jdk slave2:/usr/java
scp -r /etc/profile slave1:/etc
scp -r /etc/profile slave2:/etc
source /etc/profile(slave1,slave2都要执行)
JDK安装完成🎈
安装zookeeper
- 修改主机到IP地址的映射(三个节点都需要配置)
vi /etc/hosts
# 添加如下内容,中间Tab键分割
192.168.112.145 master master.root
192.168.112.146 slave1 slave1.root
192.168.112.147 slave2 slave2.root
2. 通jdk安装方式将zookeeper压缩包解压到/usr/zookeeper
mkdir -p /usr/zookeeper
tar -zxvf /opt/soft/zookeeper-3.4.10.tar.gz -C /usr/zookeeper
- 修改配置文件 ,将zookeeper下conf目录下的zoo_sample.cfg复制一份为zoo.cfg然后进行修改
cd /usr/zookeeper/zookeeper-3.4.10/conf
cp zoo_sample.cfg zoo.cfg
添加以下的配置信息:
- 在zookeeper-3.4.10下创建两个文件夹用来存放数据和日志。并且在数据文件夹中创建一个文件myid向其中写入1
cd /usr/zookeeper/zookeeper-3.4.10
mkdir zkdata
mkdir zkdatalog
cd zkdata
vi myid
# 写入1
- 在
etc/profile中
加入环境变量然后进行source
export ZOOKEEPER_HOME=/usr/zookeeper/zookeeper-3.4.10
PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile
- 将数据拷贝到另外两台机器。分别修改myid中的文件内容为2和3.
scp -r /usr/zookeeper root@slave1:/usr/
scp -r /usr/zookeeper root@slave2:/usr/
scp -r /etc/profile slave1:/etc
scp -r /etc/profile slave2:/etc
source /etc/profile(slave1,slave2都要执行)
myid里面内容为一个数字,用来标识当前主机,conf/zoo.cfg 文件中配置的server.X 中 X 为什么数字,则 myid 文件中就输入这个数字
- 进入zookeeper的文件夹下,启动组件查看状态信息。
cd /usr/zookeeper/zookeeper-3.4.10
bin/zkServer.sh start
bin/zkServer.sh status
结果显示一个为领导者(leader)其余的为跟随者(follower)。
安装hadoop
- 创建文件夹,解压,配置环境变量
mkdir -p /usr/hadoop
tar -zxvf /opt/soft/hadoop-2.7.3.tar.gz -C /usr/hadoop
mv hadoop-2.7.3 hadoop
vi /etc/profile
export HADOOP_HOME=/usr/hadoop/hadoop
export CLASSPATH=$CLASSPATH:$HADOOP_HOME/lib
export PATH=$PATH:$HADOOP_HOME/bin
- 修改 hadoop-env.sh
cd /usr/hadoop/hadoop-2.7.3/etc/hadoop
vi hadoop-env.sh
export JAVA_HOME=/usr/java/jdk
3. 修改 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/hdfs/tmp</value>
<description>A base for other temporary directories .</description>
</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>
4. 修改 yarn-site.xml
<configuration>
<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>
<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>
</configuration>
5. 修改 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/hadoop/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/hadoop/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
# 此处设置热备份进程的节点。可以填写master,slave1,slave2等,但是从最后的显示信息来看,官方配置的是master。如果不想配置在namenode上可以填写另外两个节点名称。如果想多备份,填写0.0.0.0:9001
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
6. 修改slaves,向slaves中添加slave1和slave2.
- 新建一个master,向其中添加master。
vi master
8. 修改 mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
9. 分发Hadoop
scp -r /usr/hadoop root@slave1:/usr/
scp -r /usr/hadoop root@slave2:/usr/
scp -r /etc/profile slave1:/etc
scp -r /etc/profile slave2:/etc
source /etc/profile(slave1,slave2都要执行)
- 格式化Hadoop
hadoop namenode -format
使用jps查看各节点的信息。
在本都浏览器输入192.168.112.140:50070打开网页端视图。如果无法访问检查防火墙时候关闭。
安装Hbase
- 创建文件夹,解压文件,修改文件名(/usr/hbase/hbase)
- 修改hbase-env.sh
cd usr/hbase/hbase/conf/
vim hbase-env.sh
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/java/jdk
export HBASE_CLASSPATH=/usr/hadoop/hadoop-2.7.3/etc/hadoop
解释:一个分布式运行的 Hbase依赖一个 zookeeper 集群。所有的节点和客户端都必须能够访问 zookeeper。默认的情况下
Hbase 会管理一个 zookeep 集群,即 Hbase 默认自带一个 zookeep 集群。这个集群会随着 Hbase
的启动而启动。而在实际的商业项目中通常自己管理一个 zookeeper 集群更便于优化配置提高集群工作效率,但需要配置
Hbase。需要修改conf/hbase-env.sh 里面的HBASE_MANAGES_ZK来切换。这个值默认是 true 的,作用是让
Hbase 启动的时候同时也启动 zookeeper.在本实验中,我们采用独立运行 zookeeper 集群的方式,故将其属性值改为
false。
- 修改hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://master:6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/zookeeper/zookeeper-3.4.10</value>
</property>
</configuration>
解释:要想运行完全分布式模式,加一个属性 hbase.cluster.distributed设置为 true 然后把
hbase.rootdir 设置为 HDFS 的 NameNode 的位置hbase.rootdir:这个目录是 region server
的共享目录,用来持久化 Hbase。URL 需要是’完全正确’的,还要包含文件系统的
schemehbase.cluster.distributed :Hbase 的运行模式。false 是单机模式,true是分布式模式。若为
false,Hbase 和 Zookeeper 会运行在同一个 JVM 里面。在hbase-site.xml 配置 zookeeper:当
Hbase 管理 zookeeper 的时候,你可以通过修改 zoo.cfg 来配置 zookeeper,对于 zookeepr
的配置,你至少要在hbase-site.xml 中列出 zookeepr 的 ensemble
servers,具体的字段是hbase.zookeeper.quorum.在这里列出 Zookeeper
集群的地址列表,用逗号分割。hbase.zookeeper.property.clientPort:ZooKeeper 的 zoo.conf
中的配置,客户端连接的端口。hbase.zookeeper.property.dataDir:ZooKeeper 的 zoo.conf
中的配置。对于独立的 Zookeeper,要指明 Zookeeper 的 host 和端口。需要在 hbase-site.xml中设置。
- 修改regionservers
- 集群互联
cp /usr/hadoop/hadoop/etc/hadoop/hdfs-site.xml ./
cp /usr/hadoop/hadoop/etc/hadoop/core-site.xml ./
- 配置环境变量
export HBASE_HOME=/usr/hbase/hbase
export PATH=$PATH:$HBASE_HOME/bin
7. 数据分发
scp -r /usr/hbase root@slave1:/usr/
scp -r /usr/hbase root@slave2:/usr/
scp -r /etc/profile root@slave1:/etc
scp -r /etc/profile root@slave2:/etc
source /etc/profile(slave1,slave2都要执行)
- 启动
在hadoop和zookeeper都启动的情况下执行
bin/start-hbase.sh
9. web页面
https:192.168.112.140:16010/master-status
- 交互界面
构建数据仓库
Master作为client的客户端,slave1作为hive server服务器端,slave2安装mysql server.
slave2上安装mysql server
- 安装源
实验中已经给出。
解释:epel源是基于Fedora项目,为“红帽系”的操作系统提供额外的软件包。要想使用这个源首先要安装epel-release软件包。该软件包会自动配置yum软件仓库。
yum -y install epel-release
- 下载源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
- 安装源
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
- 查看是否有包mysql-community.repo 和mysql-community-source.repo
cd /etc/yum.repos.d
安装MySQL
yum -y install mysql-community-server
重载所有配置过得文件:
systemctl daemon-reload
Mysql开启服务和自启动命令并获取随机密码:
systemctl start mysqld
systemctl enable mysqld
grep “password” /var/log/mysqld.log
登陆 MySQL:mysql -uroot -p
MySQL 密码安全策略:
设置密码强度为低级:set global validate_password_policy=0;
设置密码长度:set global validate_password_length=4;
修改本地密码:alter user 'root'@'localhost' identified by '123456';
退出:\q
设置远程登录:
create user 'root'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;
slave1上安装Hive
先在master上安装了之后再将解压后的文件上传到slave1中。然后配置环境变量(master和slave1都要修改。)然后重新加载。
export HIVE_HOME=/usr/hive/hive
export PATH=$PATH:$HIVE_HOME/bin
因为服务端需要和 Mysql 通信,所以服务端需要 Mysql 的 lib 安装包到 Hive_Home/conf 目录下。mysql.jar 放在 slave2 中的/lib 目录下,需要将其远程复制到 slave1的 hive 的 lib 中。
首先 slave2 中进行如下操作:
scp /lib/mysql-connector-java-5.1.5-bin.jar root@slave1:/usr/hive/hive
在slave1中修改hive-env.sh如下。(该文件需要cp出来):
然后修改hive-site.xml(该文件自己创建):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- Hive 产生的元数据存放位置-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<!-- 数据库连接 JDBC 的 URL 地址-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave2:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!-- 数据库连接 driver,即 MySQL 驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</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>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>
设置master客户端
从 hive 的lib包中拷贝到Hadoop中lib 位置为/usr/hadoop/hadoop/share/hadoop/yarn/lib:
cp /usr/hive/hive/lib/jline-2.12.jar /usr/hadoop/hadoop/share/hadoop/yarn/lib/
跟slave1同样的方法修改hive-env.sh
修改hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<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>
在slave1上启动hive:
bin/hive –service metastore(后面带&表示在后台运行)
在master上启动hive:bin/hive