缘起
大学的时候,记得班里好多同学学习Android、iOS开发,那时候客户端开发非常火,并且工作后工资也很高。但是我并没有心动,我觉得这么多人去学并不一定是件好事,很可能跟网站开发一样,一段时间市场饱和后就不会有那么大的需求量,现在看来这个判断是正确的。我想学习一门技术现在处于起步期,但是未来比较长的一段时间里发展前景比较好。那个时候是大四,正在跟同学做一个小创业项目,我在里面负责网站方面的建设,没事的时候经常上网,偶然发现大数据相关的文章。我觉得这可能是个新方向,移动互联网时代,我们上网的频率更高,时间更长,会有更多的数据产生,从而需要大数据技术做存储和计算。自从那以后就开始找大数据相关的资料,然后知道有 Hadoop 这么个东西,刚开始在网上找了几节入门级的免费视频,看完之后还是云里雾里,对大数据技术没有任何感知。并且那个时候(14年)大数据方面的工作机会比较小,小公司基本没有相关的技术,我还担心学了之后不好找工作。为了避免翻车,就买了付费的视频开始学习。每天睁开眼就开始学,一直学到半夜12点。坚持了俩月,最后找了大数据岗位的实习工作,算是正式上车了。到目前为止从事大数据相关的工作已经快4年了,技术方面接触了 Flume、Kafka、Hadoop、Spark、Hbase、Hive、Kylin 等框架,业务方面接触过定位数据、视频数据、搜索数据。觉得在大数据方面有一些积累,因此想做一个大数据技术方面的教程,供初学者参考。
学习路线
现在关于大数据入门教程很多,如果时间比较充裕可以找一套视频慢慢跟着学,毕竟听别人讲比自己看书学的要快。现在比较知名的一些培训网站应该都有免费的入门视频,可以找找看。如果没有大块的时候,可以看书或者看博客。学习大数据一般是先学 Hadoop,Hadoop在大数据领域的地位就不用在强调了。有些人可能会说是不是 Hadoop 已经过时了,其实并没有。一方面,Hive、Kylin等框架计算层面对 Hadoop 有依赖,并且 Spark 等新兴的框架也是基于Hadoop 的思想;另一方面,目前不少企业数据存储用的是 HDFS,数据处理仍然用 MapReduce,对于一些实时性要求不高的任务,MapReduce跑起来还是很稳的。
学习Hadoop 核心在于学习分布式存储和计算。学习大数据技术一个比较高的门槛就是要理解分布式。以前我们写的程序都是单机的,最多也就是个多线程。但大数据框架都是分布式的,需要学习数据如何分布式存储、如何保证可靠、机器之间如何通信、数据如何分散到不同的机器计算等,这是思维方式的转变。初学者可以在网上先找一些评论比较高的入门资料,也可以跟着本教程学习,先整体理解分布式的概念。有了点基础之后再学习《Hadoop权威指南》,学完之后基本上对Hadoop框架有了深入理解,能够熟练的写 MapReduce 做数据处理。
掌握 Hadoop 之后,再往下走有两个方向。一个方向是做实时计算,需要学习 Spark 和 Flink 等框架,这两个框架都是批流统一分布式计算框架。Spark 目前比较主流,社区也比较完善,但是开发语言用 Scala,并且分布式计算的思想在 Hadoop 之上又抽象了许多概念,因此入门有些门槛,一旦入门口后再开发就很顺手了。Spark的书可以看看《Spark技术内幕》。Flink 之前生态不如 Spark,但最近阿里将 Blink 贡献给 Flink 社区,相信以后 Flink 的发展会更好,社区会更强大。Flink 做更适合做硬实时的计算。另一个方向就是数据仓库建设,用到 Hive、Kylin 等框架。基本上每个公司都有数仓建设团队,Hive 适合离线大数据计算,使用SQL语言开发。SQL语言门槛比较低,所有有些公司会培养业务人员或者产品经理写SQL,而程序员更专注数仓的建设。Kylin主要是满足交互式查询,适合做多维分析。多维分析的框架除了Kylin还有很多,大家可以自行上网查阅对比。这个方向更加侧重数据建模,相关的的书推荐《Hive权威指南》、《维度建模工具箱》、《阿里巴巴大数据之路》。
工具以及技术掌握熟练之后,再往下走就是数据分析。数据最终是要提供决策,所以,数据分析的能力很重要。如果只是写个SQL、跑个数,长期下去并不利于我们的成长。我们要经常对数据作分析,培养数据的敏感度,能够通过数据对产品提出指导意见。这个过程可能会用到数据挖掘相关的技术。做大数据相关的工作跟其他的程序员还是有比较大的区别。 一方面我们能够掌握所有的数据,另一方面我们可以通过数据分析指导决策。
本章剩下的部分就从搭建 Hadoop 集群开始,学习 Hadoop 技术。搭建 Hadoop 集群一般用 Cloudera Manager 或者 HortonWorks,搭建起来很容易。我在之前的公司是用 Cloudera Manager 搭建 Hadoop 集群,并且公司经常需要到客户的服务器单独部署大数据计算服务,因此对 Cloudera 那套东西非常熟。熟到什么程度呢,通过搭建本地 Http 服务,基本上10分钟左右就能搭建一个集群。但我们现在是在学习 Hadoop 技术,所以还是自己亲子搭建集群更利于我们学习。
准备
至少得是一台 8G 内存的电脑,我们做开发 CPU 基本上差不到哪儿去。安装VMware或者VirtualBox,搭建三台虚拟机。我的电脑 16G 内存,三台虚拟机配置如下:
操作系统:Centos 7.3 64位 内存:1GB 硬盘: 40G CPU:1核 主机名与IP对应关系 192.168.29.132 hadoop0 192.168.29.133 hadoop1 192.168.29.134 hadoop2
下载 JDK 和 稳定版的 Hadoop,我用JDK8 + Hadoop 2.9.2,对应的文件名为 jdk-8u151-linux-x64.tar.gz hadoop-2.9.2.tar.gz。
配置hosts
首先,需要给每个虚拟机设置 hostname
hostnamectl set-hostname hadoop0
在 /etc/hosts文件中加入三台主机的IP和hostname的对应关系
192.168.29.132 hadoop0 192.168.29.133 hadoop1 192.168.29.134 hadoop2
关闭防火墙
打开防火墙不方便机器之前的通信,并且公司的 Hadoop 集群一般是再内网搭建,所以可以关闭防火墙。需要在这三台主机执行以下命令
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止开启启动
设置SSH免密码登录
我们可能需要在一台机器上启动集群其他主机的服务,就需要SSH登录到其他主机,这时候设置SSH免密码登录会比较方面。在三台机器上执行以下命令
ssh-keygen -t rsa
执行完毕后,会在 ~/.ssh 目录里发现 id_rsa.pub 文件。在主机 hadoop0 中执行以下命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
执行后,将其他两台主机的 ~/.ssh/id_rsa.pub 文件中的内容复制到 hadoop0 的 ~/.ssh/authorized_keys 文件中,然后执行以下命令
scp ~/.ssh/authorized_keys hadoop1:~/.ssh
scp ~/.ssh/authorized_keys hadoop2:~/.ssh
这样便可以实现在任意一台机器都可以通过SSH免密码登录到其他两台机器。
安装JDK
在三台主机中都要安装JDK,安装JDK直接解压 tar.gz 文件即可。将解压后的目录配置到环境变量中,环境变量可以在 /etc/profile 文件中配置,内容如下
# /etc/profile JAVA_HOME=/work/software/jdk1.8.0_151 export PATH=$JAVA_HOME/bin:$PATH
修改文件后,直接 source /etc/profile 使配置生效,再通过 java -version 命令验证配置是否正确。
安装并配置 Hadoop
安装 Hadoop 在 hadoop0 一台机器操作即可,安装 Hadoop 也是解压 tar.gz 文件,同时在 /etc/profile 中配置 HADOOP_HOME,文件内容如下
# /etc/profile JAVA_HOME=/work/software/jdk1.8.0_151 HADOOP_HOME=/work/software/hadoop-2.9.2 export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
Hadoop的配置主要包括 hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 、slaves 文件。这些文件在 Hadoop 解压目录中 etc/hadoop 目录里。在进行配置之前,先简单看一下 hadoop 框架中几个组件
HDFS NameNode:数据存储主节点,管理文件系统和命名空间,一般1个,可以两个做高可用
HDFS DataNode:数据存储从节点,主要是用来存储数据,一般跟集群机器节点个数一样
ResourceManager:资源管理的节点,接受任务并分配资源,一般1个,也可以2个做高可用
NodeManager:运行任务的容器,一般跟DataNode节点在一起
JobHistoryServer:管理历史任务
了解基本概念后, 接下来看看具体的配置。
hadoop-env.sh
主要设置 JAVA_HOME,打开 hadoop-env.sh 文件,找到 JAVA_HOME 的赋值语句,修改如下
export JAVA_HOME=/work/software/jdk1.8.0_151
core-site.xml
<configuration> <property> <!--配置hdfs namenode节点--> <name>fs.defaultFS</name> <value>hdfs://hadoop0:9000</value> </property> </configuration>
hdfs-site.xml
<configuration> <property> <!--NameNode namespace等信息存储路径--> <name>dfs.namenode.name.dir</name> <value>/data/dfs/name</value> </property> <property> <!--DataNode 存储数据的路径,需要在本地建立/data/dfs目录 --> <name>dfs.datanode.data.dir</name> <value>/data/dfs/data</value> </property> <property> <!--配置secondarynamnode节点--> <name>dfs.namenode.secondary.http-address</name> <value>hadoop1:50090</value> </property> </configuration>
yarn-site.xml
<configuration> <property> <!--配置resourcemanager节点--> <name>yarn.resourcemanager.hostname</name> <value>hadoop0</value> </property> <property> <!--指定shuffle--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property><!--打开日志聚合--> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> </configuration>
mapred-site.xml
<configuration> <property> <!--配置资源管理框架--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <!--配置 jobhistory 节点--> <name>mapreduce.jobhistory.address</name> <value>hadoop2:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop2:19888</value> </property> </configuration>
slaves
hadoop0
hadoop1
hadoop2
配置完毕后,将 hadoop-2.9.2 目录,复制到另外两台机器中, 并配置这两台机器的 HADOOP_HOME,并建立 DataNode 存储数据的目录 /data/dfs
scp -r /work/software/hadoop-2.9.2 hadoop1:/work/software
scp -r /work/software/hadoop-2.9.2 hadoop2:/work/software
启动集群
在主机 hadoop0 中,进入 /work/software/hadoop-2.9.2 目录中,执行以下命令
./sbin/start-dfs.sh
./sbin/start-yarn.sh
可以看到命令执行过程中打印的日志,会根据 slaves 文件到其他的机器启动相应的进程。可以在每台机器执行 jps 命令,看看启动了哪些进程。
在 hadoop2 机器中,启动 jobhistoryserver 进程,同样进入到 /work/software/hadoop-2.9.2,执行以下命令
./sbin/mr-jobhistory-daemon.sh --config etc/hadoop start historyserver
验证集群
可以通过 jps 命令,看看集群中的每台机器是不是启动了相应的服务。同时,可以通过web界面查看集群的状态以及配置,可以在物理机访问以下页面,需要在物理机配置hosts,否则需要用 IP 地址访问
NameNode web页面: hadoop0:50070 ResourceManager web页面: hadoop0:8088 HistoryServer web页面: hadoop2:19888
总结
这篇文章主要介绍了大数据一些基本概念, 学习路线,最后动手搭建了 Hadoop 集群,希望能够对初学的同学有帮助。后续讲解 Hadoop 技术框架的细节。