缘起
大学的时候, 记得班里好多同学学习 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>
- </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 技术框架的细节.
来源: https://www.cnblogs.com/duma/p/10428700.html