1. 写在前面
最近学习推荐系统, 想做一个类似于企业上的那种推荐系统(采用的阿里天池赛的一个电商数据集, 然后基于大数据的Lambda架构, 实现离线和在线相结合的实时推荐系统), 这样可以熟悉一下真实环境中的推荐系统流程, 但是这里面需要大数据的开发环境, 所以这里的这个系列是记录自己搭建大数据开发环境的整个过程, 这里面会涉及到Hadoop集群,Spark, zookeeper, HBase, Hive, Kafka等的相关安装和配置,当然后面也会整理目前学习到的关于前面这些东西的相关理论知识和最终的那个推荐系统, 经过这一段时间的摸索学习, 希望能对大数据开发和工业上的推荐系统流程有个宏观的初识,这一块涉及到技术上的细节偏多, 所以想记录一下, 方便以后查看和回练, 开始 😉
这个系列是分布式开发环境的搭建, 这是第一篇, 介绍一下具体搭建前的准备和集群的相关配置情况。准备工作包括虚拟机的介绍和安装, 各个组件版本介绍, 集群的相关配置包括一些虚拟机和集群方面设置的内容,比如修改网络配置, 安装jdk, Scala, 更改主机名和IP映射,ssh免密登录等。
2. 环境搭建前的准备
2.1 虚拟机的安装
由于自身硬件条件的限制, 所以采用的是虚拟机, 本系列用了三台虚拟机,管理虚拟机的软件VirtualBox, 虚拟机操作系统版本CentOS 7, 本地主机是Window10 64位。
首先是下载CentOS 7操作系统和VirtualBox(VMwareWorkstation也行), 把VirtualBox安装好, 这个安装不过不介绍, 基本上傻瓜式安装(别在系统盘就行),安装完了之后启动, 需要设置语言版本(如果是英文的话), 设置VirtualBox存储文件夹, 这个是设置默认虚拟电脑位置,需要我们指定个,找的时候方便,在管理 -> 全局设定 ->常规里面。 设置完毕之后, 我们就可以进行虚拟机的创建了。
此次搭建环境需要用到三台虚拟机, 我们先创建一台即可(剩下两个可复制), 在建立之前, 先看一下我们此次的大数据环境:
简要配置说明:
- JDK: Hadoop和Spark依赖的配置
- Scala: Spark依赖的配置,版本不要低于Spark版本
- Hadoop: 分布式系统基础架构
- Spark: 分布式计算框架
- zookeeper: 分布式应用程序协调服务, HBase集群需要
- HBase: 结构化数据的分布式存储系统
- Hive: 基于Hadoop的数据仓库工具, 默认的元数据库mysql
- Kafka: 分布式消息队列
所需要的安装包来这里, 密码:55qm。这里也简单聊一下版本的选择和版本的不匹配问题, 如果涉及的大数据框架比较多,并且选择不慎的话, 有可能出现版本不兼容的问题, 上面这些框架版本是兼容的, 如果不想用这些的话, 也可以自己选择,但一定要注意版本匹配,这里也提供一个社区版本,就是大名鼎鼎的CDH开源社区,Cloudera Distributed Hadoop:
- 通过统一的CDH版本来避免兼容性问题
- Cloudera 在社区版的基础上做了一些修改, 可以解决掉一些兼容性问题
- http://archive.cloudera.com/cdh5/cdh/5/
这是界面:
我们选择各个框架的时候, 就看后面的这个cdh, 后面这个版本号一样的话,基本上不会出现兼容性问题, 比如hadoop-2.6.0-cdh-5.7.0 和 Flume-cdh5.7.0 是兼容的。
接下来就是创建虚拟机, 名字master, 内存4G, 硬盘15G创建成功(这里的硬盘大小设置, 注意一下,如果电脑硬件允许的话, 尽量给的大一些,因为这个环境不只是搭建一下就完事,后面要真正的用于实际业务, 15G的硬盘讲真不够用。 如果只是想单纯的只看一下环境搭建可以,但是如果后面要想正常使用,需要至少40G以上, 我后面搞推荐的时候,装上anaconda后硬盘空间不足了, 又现进行扩充的,很麻烦,所以这个地方能搞大一点就大一点)
在master上设置虚拟机光盘,准备安装系统, 点击设置->存储-> 光驱那里, 选择已经下载好的系统安装镜像即可, 就能看到:
点击启动,安装CentOS 7, 语言选择中文, 软件选择这地方默认是最小安装(命令行模式的), 这里我们要点击选择GNOME桌面(GNOME应用程序+互联网应用程序), 然后自动分区。 然后设置root密码,创建用户icss并设置成管理员。等待安装即可。
2.2 虚拟机的相关设置
首先联网, 应用程序->系统工具->设置->网络,把有线连接打开。
然后在VirtualBox里面安装一下增强功能, 也就是把把屏幕分辨率, 鼠标光标停顿延迟和原系统共享一些内容的功能启动起来, 真实环境下没有这一步哈, 这是虚拟机里面的设置, VirtualBox, 点击上面的设备->安装增强功能, 会自动运行Guest Additions CD, 但是CentOS可能会报错:Kernel headers not found for target kernel
, 这时候需要先安装kernel headers, 注意,如果没有联网的话会没法安装,依次在终端运行下面三行代码:
#update kernel
yum update kernel -y
# yum install kernel-headers kernel-devel gcc make -y
yum install kernel-headers kernel-devel gcc make -y
# Reboot the server to make sure it load to the new kernel
init 6
然后设置一下共享粘贴板, 这个可以在Windows中复制内容粘贴到虚拟机, 或者虚拟机内容复制到Windows中, VirtualBox, 设备, 共享粘贴板, 双向,完成。
设置语言, 左上角应用程序->系统工具->设置->区域和语言里面, 输入源这里加上这个,否则没法输入中文:
这样虚拟机部分的配置完成。
3. 集群的相关设置
3.1 关闭防火墙
关闭防火墙是为了后面各台机器之间能够方便的访问, 这个是需要每个机器都做的,只不过我这里采用了取巧的方式, 想先把一些共有的环境在一台机器上配置后,然后直接复制出两台主机来, 因为很多配置都是重复的操作, 这里就没有一台一台的弄, 太麻烦了这样, 但真实情况下,需要做这些重复操作的。
依次输入下面的命令:
- 查看防火墙状态:
systemctl status firewalld.service
, 如果看到activate(running)
说明开启状态 - 关闭运行防火墙:
systemctl stop firewalld.service
, 关闭后可以再次查看, 显示inactive(dead)
, 说明关了 - 但上面的方法, 一旦重启操作系统, 防火墙会自动开, 所以还需要禁止防火墙服务器,
systemctl disable firewalld.service
当然关于防火墙,还有一些常用命令:
# 启动
systemctl start firewalld
# 开机启动
systemctl enable firewalld
更详细的看这里,这样,防火墙就关闭了, 下一步
3.2 设置时钟同步
集群上的机器时间要同步, 我们可以简单的跟互联网授时服务器同步。首先把时区调到东八区,然后校准一下时间。
# 修改系统使用的时区
timedatectl set-timezone Asia/Shanghai
# 时间不准确时,校准时间
ntpdate us.pool.ntp.org
# 查看一下
timedatectl
当然目前是一台电脑, 后面复制的时候,其实时间已经同步好了,都和我Windows的时间一样, 真实情况下就需要自己设置了。
3.2 更改主机名及主机与ip的相关映射
更改主机名为了方便集群管理, 这个也是集群上所有机器都要做的操作, 还有就是主机名和IP关系映射, 在后面由于要各个机器之间通信, 必须把主机名和对应ip联系起来。
我这里是这样的,先从一台上做, 后期会复制出两台来, 关系映射这个不用动, 只需要到时候修改另外两台的主机名就行了, 所以这里关系映射先做好。
3.2.1 更改主机名
这里把主机名改成master, 命令如下:
vim /etc/hostname
# 打开之后, 把主机名改成master, 然后重启
# 查看一下
hostnamectl
3.2.2 更改主机名和ip的关系映射
输入命令
vim /etc/hosts
# 添加
192.168.56.101 master
192.168.56.102 slave01
192.168.56.103 slave02
3.3 设置VirtualBox网卡,配置网络
上面由于改了hosts镜像文件,我们这里需要配置一下网络,可以进行远程连接, 这样才能把后面的一些安装包传上去, 当然也可以在虚拟机用wget自己下(能连外网), 我这里由于各个安装包都下载到了Windows上,所以想直接都导过去。
关闭虚拟机, 设置->网络里面,这里配置两块网卡, 网卡1, 选择NAT模式, 网卡2选择启用网络连接, 连接方式是Host-Only模式,这样一个在外网通信,一个在内网通信。
把master主机的内网ip固定成192.168.56.101
,这样后面各个机器之间才能在内部互相访问,修改interfaces网络配置文件, 输入命令
# 查看下目前的两块网卡信息
route -n
# 查看当前ip
ip addr
通过上面的设置之后, 我这边目前两块网卡,一块连接了外网(enp0 s3), 一块连接内网(enp0 s8):
这时候发现内网的这块网卡没有ip地址,这里需要配置静态ip成约定的192.168.56.1
, 但是在网上查的一些资料说去/etc/sysconfig/network-scripts
下找到相应网卡进行配置,但是不知道啥情况我的一开始打开没有enp0 s8这块网卡, 有的说可以把enp0 s3这个复制一份,改成enp0 s8, 然后进去修改ip
当然,我没这样试, 而是摸索了另外一种方式, 这是图形化界面的好处哈哈,就是打开应用程序->系统工具->设置->网络设置里面,找到这两块网卡, 在这里找到了enp0 s8这块,然后在这里配置了静态ip地址。
这时候,再回到上面那个目录下,就发现自动出来了一个:
这样,两块网卡就全乎了,以后再配置的时候(修改ip)就可以直接在这里配置了。但是为了永久化操作,还需要改点东西,就是把有线连接1这个改成ifcfg-enp0s8
, 然后进去修改配置, NAME项改成enp0s8。 当然动态的那块卡也需要设置点东西, 进去把ONBOOT选项设为yes, 这样一重启就能自动连接外网了,不需要手动了,且内网ip也能自己固定住了。命令如下:
mv ifcfg-有线连接_1 ifcfg-enp0s8
gedit ifcfg-enp0s3 # 进去之后,把ONBOOT选项改成yes
gedit ifcfg-enp0s8 # 进去之后,把NAME改成enp0s8
# 重启一下网络服务
service network restart
这样,就直接可以本地的xshell进行连接虚拟机了, 然后就可以把之前准备好的安装包传过去了,总算舒服了哈哈。
上面简单的说就是配置了两块网卡,一块是动态获取ip, 连接外网用,连接方式是NAT, 一块是静态自己配置ip,在局域网内连接集群中, 连接方式Host-Only。
3.4 设置ssh免密登录
设置ssh免密登录是为了操作方便, 因为Hadoop有很多服务器组成,当启动Hadoop系统, NameNode和DataNode连接并管理这些节点, 此时系统会要求用户输入密码,尤其是开Hadoop集群的时候, 连接一个机器需要输入一下子密码,很烦的。
为了让其顺利运行不需手动输入密码,就需要设置这个东西, 注意无密码登录并不是不需要密码,而是以事先交换的SSH Key(密钥)进行身份验证。这个我在一开始的时候设置有问题的,我是用了一个master和两个slave的,一开始我是想从一个master上设置好这个免密登录,然后克隆出两个机器来,本来想这样就不用设置了(之前在Ubuntu上记得可以来), 但是在这里不起作用。
所以这一块我在第二篇文章,即将开启多节点Hadoop集群的时候再写一下是怎么弄,因为这里还是一台虚拟机, 且目前也用不到ssh免密登录。
到这里为止,关于虚拟机和集群的准备基本上完事了, 下面就是真正有关于Hadoop环境搭建的准备了, 那就是需要安装Java和Scala,并配置好环境变量。
3.5 安装Java和Scala基础环境及修改环境变量
3.5.1 安装Java
安装java, 之前在Ubuntu中也安过, 和Centos里面还不太一样, 也记录一下子,这个是系统之间的区别了, 如果系统时Ubuntu, 可以使用下面的命令安装Java-JDK:
# 查找java版本
apt-cache search java | grep jdk
sudo apt-get install openjdk-8-jdk # 中间的数字就是版本
# 查看安装位置
update-alternatives --display java
# 然后配置环境变量即可
这次使用了CentOS 7, 并且已经下好了JDK,不用现下, 但是我发现我的系统里面自带了一个java1.8的版本,
当然我没有打算用这个, 还是用我之前准备好的这些东西:
并且只要配置好环境变量,就不会发生冲突的情况。下面开始整:
将压缩的jdk解压,并命名为jdk1.8, 在/opt/bigdata/
建立java目录, 把这个移动过去。
# 解压JDK
tar zxvf jdk-8u144-linux-x64.tar.gz
# 建立java目录
sudo mkdir /opt/bigdata/java/
# 出来个jdk1.8.0_144, 移动到/opt/bigdata/jdk/
mv jdk1.8.0_144 /opt/bigdata/java/jdk1.8
安装Java完毕,下面安装Scala, 和上面基本上同样的方式。
3.5.2 安装Scala
这里直接也是三行命令:
tar zxvf scala-2.12.2.tgz
sudo mkdir /opt/bigdata/scala/
sudo mv scala-2.12.2 /opt/bigdata/scala/scala2.12.2
这时候文件目录如下:
下面配置环境变量。
3.5.3 配置环境变量
在linux系统下,如果下载并安装了应用程序,在启动时很有可能在键入它的名称时出现"command not found"的提示内容。如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了,这种情况下就涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分。Linux配置环境变量有下面两种方式:
1)修改/etc/profile文件
推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,缺点是可能会给系统带来安全性问题。 这里是针对所有的用户的,所有的shell;
[root@test ~]# vim /etc/profile
....
export PATH=$PATH:/usr/local/mysql/bin
使用source命令使修改立刻生效:
[root@test ~]# source /etc/profile
2)修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一个特定的用户,如果需要给某个用户权限
使用这些环境变量,只需要修改其个人用户主目录下的.bashrc文件就可以了。
[root@test ~]# vim /root/.bashrc
export PATH=$PATH:/usr/local/mysql/bin
[root@test ~]# source /root/.bashrc
这里使用第一种方式, 在/etc/profile配置文件中配置变量,这里把整体的变量都先配了出来,后面复制的时候就不需要配了,具体如下:
gedit /etc/profile
# 在后面加入
# Java Config
export JAVA_HOME=/opt/bigdata/java/jdk1.8
export JRE_HOME=/opt/bigdata/java/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
# Scala Config
export SCALA_HOME=/opt/bigdata/scala/scala2.12.2
# Spark Config
export SPARK_HOME=/opt/bigdata/spark/spark2.2
# Zookeeper Config
export ZK_HOME=/opt/bigdata/zookeeper/zookeeper3.4
# HBase Config
export HBASE_HOME=/opt/bigdata/hbase/hbase1.2
# Hadoop Config
export HADOOP_HOME=/opt/bigdata/hadoop/hadoop2.8
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
# Hive Config
export HIVE_HOME=/opt/bigdata/hive/hive2.1
export HIVE_CONF_DIR=${HIVE_HOME}/conf
# kafka config
export KAFKA_HOME=/opt/kafka/kafka1.0.0
export PATH=.:${JAVA_HOME}/bin:${SCALA_HOME}/bin:${SPARK_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${ZK_HOME}/bin:${HBASE_HOME}/bin:${HIVE_HOME}/bin:${KAFKA_HOME}/bin:$PATH
# 保存后让其生效
source /etc/profile
这样,就把Java和Scala安装完毕, 看一下版本作为结束:
好了,环境搭建前的准备和集群的相关配置完毕, 接下来就是Hadoop集群搭建了, Rush! 😉