前言
本系列文章会把精力放在项目流程构建、工具的使用、业务逻辑分析上,以项目形式贯穿大数据全流程,让大家对企业中的大数据项目整体流程有清晰的认知,后续的环境配置均使用单个主机形式,弱化环境可配置,使大家快速上手。
上一篇我搭建完成了Linux系统以及配置,本篇文章进行我的项目回顾和Hadoop环境准备
一、日志分析项目概述
1.概述
什么是网站日志?网站,或者说web服务器在运行过程中如果有用户访问了我们的服务器,它会把信息以文本形式自动记录下来,这个文件通常以.log结尾,一般称为服务器日志。
通过对网站日志的信息的统计分析,可以帮我们了解整个网站的运行情况,为公司后续的优化升级、公司营销策略等等提供依据。通常来说这个日志记录都会非常的大,特别是一些超大型的网站,有一个用户进行访问它就会记录下来,想象一下这个数据集会有多大?
1.1 日志组成
整个日志的组成会有一个标准的格式,一般来说日志里会包含用户的IP地址,比如什么时候访问的(请求日期),访问了哪个页面地址,状态码,获取到的字节数以及客户端的一些信息等等都会被记录下来。这些数据可能写入在一个文件中,也可能被分割成不同的日志,如访问日志、错误日志等等。
我们把日志通过大数据平台将它进行处理分析可视化,显示到网页上,以一个动态的图表来进行展现。如下图所示:
1.2 数据分析流程
再来看一下企业中大数据领域进行数据分析的整体流程,这是一个比较通用的流程,首先大数据领域会先进入到数据搜集阶段,这就是最初的阶段,进行采集数据,数据从哪来呢?有很多种地方,比如从数据库里去加载,从日志里去加载,或者说通过一些网络爬虫从其他的网站去采集,这些都是数据收集的方式,我们这门课主要是采集服务端的日志。
拿到数据以后肯定有些数据不符合要求。一般来说需要进行额外的处理。把一些杂乱的信息抛弃掉,最终处理完毕后我们会得到一个清洁的数据集,我们这里数据处理的方式会采用一个企业中比较常见的使用SQL的方式,也就是通过数据仓库的方式来进行处理。
得到清洁的数据集以后可以通过一些已有的模型和算法对它进行一些分析,最终分析出来的结果需要呈现出来,呈现分两种方式:第一种,可视化报告,因为企业对数据分析的最终目的是帮助企业更好的发展、更好的了解企业自身的运转情况,最终的目的是帮助决策者实施决策;第二种,应用到数据产品上,比如说你做了一个App,可以把分析出来的结果应用到你的软件上,这样最终又回归到了互联网上。本系列文章将会贯穿整体的流程。
二、项目架构
在这个项目的技术架构里我们会采用Flume去采集Nginx这样的日志,Nginx就是一个典型的Web服务器,采集过来以后我们会存储到Hadoop平台,本篇文章就会去搭建Hadoop的基本环境,数据集最终会存储到HDFS上,处理和分析我们会采用Hive的方式,Hive对这个结果处理分析完以后我们会将这个结果利用Sqoop导出到MySQL,最终利用一个JavaWeb的程序进行展现
我们将利用以上工具将整体流程走完。
1.使用技术
以下是我们将要使用到的技术,这里的重点是Hadoop、Hive、Sqoop以及Flume。数据可视化以及后端服务估计大家都会,不作为我们的重点。
下面我们来看一下Hadoop的基本概念:
2.Hadoop简介
想要先了解Hadoop是什么的各位请参考这篇文章:
深入浅出大数据:到底什么是Hadoop? - 知乎
Hadoop是大数据领域里面非常经典的一个框架,我们一般学习大数据最先学习的可能就是Hadoop,Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。
什么叫分布式呢?当数据量很多的时候,单个机器是没有办法处理、也没有办法存储的。那么我们就需要用到多台机器去做这件事情,比方说现在有1T的文件,我们将其分散在十台电脑去存,计算的时候每台电脑分别去计算,最终把结果汇总一起,这种就叫分布式的计算平台。目前大数据领域都是采用这种思想。
同时Hadoop为用户提供了底层细节透明的分布式基础架构,什么叫“透明”?我们不需要去关心底层有多少台电脑,以及他们是怎么运转的等复杂情况,我们只需要在平台上直接编写程序就可以处理大批的数据,这会让初学者上手的时候比较简单。这也是为什么我们一般说学习大数据先学习Hadoop。Hadoop会帮我们写的应用程序部署在廉价的计算机集群当中,我们不需要用一些性能很好的机器,只需要大量的廉价的计算机帮我们做这件事情就可以了。Hadoop的核心有两部分,一个是分布式文件系统HDFS(Hadoop Distributed File System),HDFS一般来负责文件存储。另一个是MapReduce,MapReduce用来解决计算问题以及后续的处理和分析。接下来我们来了解一下Hadoop内部的核心组件的基本原理,大家简单了解一下就可以:
2.1 HDFS特性-设计原理
因为最终处理的数据量非常大,我们要将其分散在不同的机器当中去存,在这个过程中会由HDFS来完成,在HDFS中也有两个比较重要的组件:一个叫Namenode,另一个叫Datanode。Datanode我们叫数据节点,主要的功能是存储数据,Datanode可以分散在多台机器上。Namenode叫名称节点,它是用来做统一管理的。比如说我们现在有很多数据,要将其分散在十台电脑上,每台电脑存一部分,最终合并到一起。在计算的时候需要知道某些数据在哪里,记录的事情由Namenode来完成,Namenode会来记录我们的数据在哪个机器上、哪个目录下、有几个备份。因为在整个过程中,机器的损坏比较常见,你必须要考虑备份的事情。Namenode已经帮我们完成了,我们可以去设置备份的数量。所以Namenode主要工作就是记录这些元数据(Metadata)。而实际中大数据的架构下会有很多的Datanode这样的节点用来存储数据。我们的客户端(或者说你所写的程序)发送一些指令,比如说去读文件,我们需要先找Namenode,Namenode知道你所需要的文件在哪里,它会告诉你在哪台机器上去读。除此之外在图片中我们可以看见有Rack1,Rack2,服务器如果比较多的话会有许多Rack,这是为了保证数据备份的安全性,如果把数据备份放在一台电脑里没有任何意义。
2.2 MapReduce 数据处理流程
接下来我们来看一下数据处理部分:
Hadoop采用了经典的MapReduce计算引擎作为数据处理部分的核心组件。在MapReduce中,会对数据进行切片,同时以键值对的形式来进行处理,以上图片是以单词计数的例子为大家说明,比如说有大量的文本信息,里面有很多的单词,我们想知道每个单词出现了几次,MapReduce首先会自动对这些数据进行切割(Splitting),切割完毕之后会形成最初的键值对,键就是K1,值就是V1,接下来对每一行进行处理(Mapping),这个过程可以在每台机器上完成,之后会形成一个新的键值对,K1就是单词,V2就是这个单词出现了几次,接下来MapReduce会完成一个叫Shuffing的过程,这个过程会把相同的K(单词)合并到一起,V则是集合的形式交给下一步,接下来就是最终的Reducing阶段,MapReduce会将集合进行合并(1,1,1)变成3。最终得到一个完整的结果。在整个过程中数据的流转都是以键值对的形式。不过在后期的项目中我们不会直接用到它,因为这样处理和分析相当的麻烦,我们上传数据会用Hive,通过编写SQL的形式来代替这种方式,使用Hive会使得上传更加简洁,效率也更高。
2.3 Hadoop生态
下面我们来了解一下Hadoop整体的生态:
在这个生态下我们可以看见数据采集这种事,我们可以使用Flume,当然也可以使用Sqoop(从数据库中采集),加下来便是储存数据,由Hadoop提供的HDFS来完成,yarn则是用来做资源调度的任务。之后便是各种各样的工具集,比如说spark(计算引擎,用来做实时计算)、MapReduce(做离线计算)。大数据领域的工具很多,我们希望通过一个完整的项目把大数据领域的内容穿起来,对企业中的大数据项目有一个清晰的认识。
三、Hadoop伪分布式环境
接下来我们开始正式部署环境!
注意:本系列文章会把精力放在项目流程构建、工具的使用、业务逻辑分析上,让大家对企业中的大数据项目整体流程有清晰的认知,后续的环境配置均使用单个主机形式,弱化环境可配置,使大家快速上手。
我们采用伪分布式形式搭建Hadoop,在一台机器上模拟多台机器,它和全分布式模式差异不大,实际编写程序的时候没有太多差异,刚才已经说过Hadoop是底层细节透明的分布式基础架构,我们不需要在底层上面花费过多时间。只需要把精力放在工具使用,业务分析即可。
实验环境
Hadoop 3.0版本CentOS7jdk1.8
以上资料下载链接附在文末
1. 配置JDK
打开CentOS7虚拟机,新建tools目录用于存放文件,并且cd到此目录下
使用Xftp7上传jdk安装包以及Hadoop安装包。
使用命令ls可以查看安装包是否传输完毕,tools目录主要用来存放安装包,最终工具我们存放到server目录下
创建opt下的server目录,查看安装包是否上传完毕
解压jdk,使用以下命令,通过-C使得文件解压到server目录下
tar -zvxf jdk-8u131-linux-x64.tar.gz -C /opt/server
注意,通过-C使得文件解压到server目录下,不然的话会解压到当前目录。这里如果你所在目录不是tools,需要在 -zvxf下加上目前你所在的目录,不然虚拟机无法找到jdk安装包在哪里。
在这之后我们需要把Java配置到环境变量当中去,vim到 etc/profile下并且进行编辑,这是一个系统环境变量的配置文件。你也可以先在server目录下使用ls命令查看jdk是否解压完毕。
vim /etc/profile# 文件末尾增加export JAVA_HOME=/opt/server/jdk1.8.0_131export PATH=${JAVA_HOME}/bin:$PATH
vim到此目录下是只读文件,点击键盘上的i符号,进入insert模式,在文件末尾增加两行内容
点击esc推出insert模式,输入指令:wq(输入一个冒号加上wq),回车,完成保存并退出。输入source命令加载profile文件使其生效
source /etc/profile
在这之后你可以写一个 java -version指令,点击回车,显示出版本号说明我们的Java环境已经配置完毕。
2.配置免密登录
在Hadoop内部组件之间是基于SSH进行通讯,配置免密登录之后不再需要每次都输入密码。后面有很多地方我们都会涉及到写IP,IP很长而且很容易变化,我们统一把IP和主机名映射,这样以后涉及到写IP的地方我们只需要写主机名就可以了。
编辑etc/hosts文件,在文件末尾写上你自己的IP和主机名
vim /etc/hosts# 文件末尾增加192.168.80.100 server
在VIM到hosts文件之前,如果你忘记了IP的话可以输入指令 ifconfig,回车可以看见自己主机的IP。这样以来我们就可以用server来代替IP地址了。
组件之间的通信会涉及到密码,我们配置一个免密登录,这样以后启动Hadoop时候,组件之间的通信就不需要再写入密码了。
输入以下指令,生成公钥和私钥。
ssh-keygen -t rsa
点击回车的过程中我们可以看见它在root用户下的.ssh目录生成了公钥和私钥,cd到.ssh目录下,并将公匙写入到授权文件。
cd ~/.sshcat id_rsa.pub >> authorized_keyschmod 600 authorized_keys
免密登录搞定之后,我们就可以进行解压Hadoop了,和解压jdk一样。
3.配置Hadoop(HDFS)环境
现在我们需要更改一些配置文件,来搭建我们的伪分布式环境之后启动HDFS。
3.1 修改配置文件
切换到tools目录,输入以下指令解压Hadoop安装包至server目录:
tar -zvxf hadoop-3.1.0.tar.gz -C /opt/server/
之后我们需要修改配置文件,以下代码是经过简化以后的,目前我们保证Hadoop能够跑起来就可以,后续如果需要一些配置的话会对它进行细化。
进入到/opt/server/hadoop-3.1.0/etc/hadoop 目录下,这里会有大量的配置文件,首先修改hadoop-env.sh文件,设置jdk的安装路径。(我们以下要配置很多文件,都在这个目录下且是已有的!)
cd /opt/server/hadoop-3.1.0/etc/hadoopvim hadoop-env.shexport JAVA_HOME=/opt/server/jdk1.8.0_131
这里不放图了,简单说一下就行,你会看见在hadoop-env.sh文件里面有很多注释掉的内容,里面是有一行注释掉的就是jdk安装路径,不用找它,我们自己随便找个地方写上路径就可以了。还是i指令进入编辑,加上jdk路径之后esc退出编辑模式,:wq保存并且退出。
之后修改core-site.xml文件,这个文件里记录的就是HDFS的核心配置,分别指定hdfs 协议文件系统的通信地址及hadoop 存储临时文件的目录。
注意,此目录不需要手动创建,后面需要我们手动创建目录,如果找错了位置,输入指令vim 某个目录,虚拟机会自动创建你输入 vim之后的新文件!
你会看见有<configuration>标签,在里面下写下如下代码
<configuration><property><!--指定 namenode 的 hdfs 协议文件系统的通信地址--><name>fs.defaultFS</name><value>hdfs://server:8020</value></property><property><!--指定 hadoop 数据文件存储目录--><name>hadoop.tmp.dir</name><value>/home/hadoop/data</value></property></configuration>
其中第一个property标签里的server就是你自己主机名,如果你刚刚没有配置hosts文件,这里你要写当前主机的IP,第二个就是指定Hadoop的数据文件存储在哪,这个目录不用创建,它会自动创建出来。
接下来继续修改hdfs-site.xml文件,用来指定数据副本,vim此文件,输入以下代码
你还是会看见原本有<configuration>标签,把以下代码写进去,由于我们搭建的是单机版本,所以写1就行了:
<configuration><property><!--由于我们这里搭建是单机版本,所以指定 dfs 的副本系数为 1--><name>dfs.replication</name><value>1</value></property></configuration>
在这之后我们修改workers文件,配置所有从属节点
实际环境中,会有多台机器互相配合,在这里就是把其他从属节点IP写在这里,我们就把当前机器的IP,或者主机名写进来就可以了
vim workers# 配置所有从属节点的主机名或 IP 地址,由于是单机版本,所以指定本机即可:server
以上,我们HDFS的配置全部完成。
3.2 初始化并启动HDFS
接下来我们需要关闭防火墙,这里涉及到一个端口的问题,不关闭防火墙可能导致无法访问 Hadoop 的 Web UI 界面,直接输入以下指令:
# 查看防火墙状态sudo firewall-cmd --state# 关闭防火墙:sudo systemctl stop firewalld# 禁止开机启动sudo systemctl disable firewalld
第一次启动 Hadoop 时需要进行初始化:
cd到 /opt/server/hadoop-3.1.0/bin 目录下(这里放置了Hadoop的一些执行命令,进入后你可以ls看看有哪些命令),执行以下命令:
cd /opt/server/hadoop-3.1.0/bin./hdfs namenode -format
之后等待格式化的时间可能会长一点。如果你能看见以下红框内容,successful,说明已经格式化完毕,已经生成了我们刚才指定的需求文件。
现在其实我们已经可以启动Hadoop了,但是Hadoop3以后不允许用root身份一键启动集群,root权限太高,不是很安全。我们需要找到启动文件,/sbin文件下面,bin文件是一些普通的命令,sbin文件是启动关闭的命令。
cd 到sbin文件下面,编辑start-dfs.sh和stop-dfs.sh文件,在其文件头部输入以下内容
cd /opt/server/hadoop-3.1.0/sbin/# 编辑start-dfs.sh、stop-dfs.sh,在顶部加入以下内容HDFS_DATANODE_USER=rootHDFS_DATANODE_SECURE_USER=hdfsHDFS_NAMENODE_USER=rootHDFS_SECONDARYNAMENODE_USER=root
这样我们就可以用root用户来启动Hadoop了!
进入 /opt/server/hadoop-3.1.0/sbin/ 目录下,启动 HDFS:
cd /opt/server/hadoop-3.1.0/sbin/./start-dfs.sh
之后我们需要输入jps,回车,查看现在有哪些Java进程,如果看见有DataNode、Namenode以及SecondaryNameNody(这是一个辅助节点,想要了解请自行搜索相关资料),说明启动HDFS完毕了
我们也可以访问Web UI界面,端口为9870。
在这里面它会告诉你现在的文件系统有多大,也就是主机的磁盘大小,有多少个节点是存活的状态,有多少是死亡的状态。在这里就先不多说了。能看见以下界面就说明启动成功。
4. Hadoop(YARN)环境搭建
后面我们还需要去做一些计算、处理,这里就需要用到yarn了。Hadoop会通过yarn来去做资源的调配,比方说你的计算需要用到多少的CPU、内存等,这些都要靠yarn来完成。下面我们来对它做一些基本配置。
4.1修改配置文件
还是回到之前的配置目录,进入/opt/server/hadoop-3.1.0/etc/hadoop 目录下,修改以下配置:
修改此目录下的 mapred-site.xml 文件
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property></configuration>
以上是告诉它我们Hadoop的文件目录在哪里,重点是第一个property标签,告诉它我们的MapReduce的框架使用yarn来进行管理。
修改 yarn-site.xml 文件,配置 NodeManager 上运行的附属服务,写入以下代码:
<configuration><property><!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在Yarn 上运行 MapRedvimuce 程序。--><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property></configuration>
这里的意思是我们最终使用MapReduce来进行处理。在这之后和HDFS同理,Hadoop不被允许root用户启动,我们需要配置启动用户,和配置HDFS启动用户一样:
分别vim进入到 sbin/目录下的start-yarn.sh、stop-yarn.sh目录下,仍然在其头部添加以下内容:
# start-yarn.sh stop-yarn.sh在两个文件顶部添加以下内容YARN_RESOURCEMANAGER_USER=rootHADOOP_SECURE_DN_USER=yarnYARN_NODEMANAGER_USER=root
现在我们就可以在sbin目录下启动yarn:
sbin目录下输入指令./start-yarn.sh 启动yarn
./start-yarn.sh
这样我们就可以执行计算任务了!
在启动完毕之后,和检查HDFS是否启动成功一样,输入jsp,回车
如果你能看见ResourceManager以及NodeManger,说明已经启动成功
yarn也提供了统一端口:8088,我们也可以查看Web UI界面,浏览器上输入你的虚拟机IP加上端口号8088,你可以看见如下界面:
如果你看见以上界面,那么到此,本篇文章结束!我们已经完成了Hadoop的整体环境配置,
下一篇我将记录我的数据仓库架构以及Hive的环境配置。
总结
现在Hadoop的整体环境已经配置完毕,还是那句话:环境的配置不是重点。网络上还有很多其他的配置方案,我们的核心是能够把项目启动起来,把精力放在后续的业务能力处理上。
Hadoop3.3.1安装包:
链接:/s/1yPGcf92tVrF_CNFtchznWw
提取码:9999
--来自百度网盘超级会员V3的分享
jdk1.8Linux版本安装包:
链接:/s/1WjeNDD1yoAXSj4yIUj2PGg
提取码:9999
--来自百度网盘超级会员V3的分享