• 大数据技术


    缘起

    大学的时候,记得班里好多同学学习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 技术框架的细节。

  • 相关阅读:
    RTT学习之sensor设备
    RTT学习之PWM、ADC设备
    RTT学习之SPI设备
    rtt学习之线程间同步与通信
    RTT之时钟管理
    ASP.NET 中整合JavaScript的技巧
    CSS弹出背景半透明窗口
    JavaScript实现继承的混合方式
    jquery-仿flash的一个导航栏特效
    html5与css3学习实践--基础的内容划分标签
  • 原文地址:https://www.cnblogs.com/duma/p/10428700.html
Copyright © 2020-2023  润新知