• 随着大数据的爆红,数据分析师这个职位也得到了越来越多的关注,千千万万懂些大数据技术的少年们都渴望成为高大上的“大数据科学家”,可是,你们真的准备好了吗? 1、最早的数据分析可能就报表   目前很多数据...

    随着大数据的爆红,数据分析师这个职位也得到了越来越多的关注,千千万万懂些大数据技术的少年们都渴望成为高大上的“大数据科学家”,可是,你们真的准备好了吗?
            
    1、最早的数据分析可能就报表
      
    目前很多数据分析后的结果,展示的形式很多,有各种图形以及报表,最早的应该是简单的几条数据,然后搞个web页面,展示一下数据。早期可能数据量也不大,随便搞个数据库,然后SQL搞一下,数据报表就出来了。但是数据量大起来怎么分析呢?数据分析完了怎么做传输呢?这么大的数据量怎么做到实时呢?分析的结果数据如果不是很大还行,如果分析的结果数据还是很大改怎么办呢?这些问题在这篇文章中都能找到答案,下面各个击破。
      
    2、要做数据分析,首先要有数据
      
    这个标题感觉有点废话,不过要做饭需要食材一样。有些数据时业务积累的,像交易订单的数据,每一笔交易都会有一笔订单,之后再对订单数据作分析。但是有些场景下,数据没法考业务积累,需要依赖于外部,这个时候外部如果有现成的数据最好了,直接join过来,但是有时候是需要自己获取的,例如搞个爬虫爬取网页的数据,有时候单台机器搞爬虫可能还爬不完,这个时候可能就开始考虑单机多线程爬取或者分布式多线程爬取数据,中间涉及到一个步骤,就是在线的业务数据,需要每天晚上导入到离线的系统中,之后才可以进行分析。
      
    3、有了数据,咋分析呢?
      
    先将数据量小的情况下,可能一个复杂的SQL就可以搞出来,之后搞个web服务器,页面请求的时候,执行这个SQL,然后展示数据,好了,一个最简单的数据分析,严格意义上讲是统计的分析。这种情况下,分析的数据源小,分析的脚本就是在线执行的SQL,分析的结果不用传输,结果的展示就在页面上,整个流程一条龙。
      
    4、数据量大了,无法在线分析了,咋办呢?
      
    这个时候,数据量已经大的无法用在线执行SQL的形式进行统计分析了。这个时候顺应时代的东西产生了(当然还有其他的,我就知道这个呵呵),数据离线数据工具hadoop出来了。这个时候,你的数据以文件的形式存在,可能各个属性是逗号分隔的,数据条数有十几个亿。这时候你可能需要构建一个hadoop集群,然后把自己的文件导入到集群上面去,上了集群之后,文件就是HDFS的格式了,然后如果要做统计分析,需要写mapreduce程序,所谓的mapreduce程序,就是实现map和reduce的接口,按照自己的业务逻辑写分析流程,之后把程序打成jar包上传到集群,之后开始执行。分析后的结果还是文件的形式产生。
      
    5、分析个数据还要写java代码是不是效率低了点
      
    这个确实是,mapreduce的程序,本身的可测性没有执行一个简单的单元测试来的爽,所以效率确实不高。这个时候,hive出现了,hive是一个数据仓库分析的语言,语法类似于数据库的SQL,但是有几个地方是不同的。有了hive之后,数据分析就好之前写SQL一样了,按照逻辑编写hive SQL,然后控制台执行。可能最大的感觉是,数据库的sql很快就能有结果,但是hive的,即使很小的一个数据分析,也需要几分钟时间。构建hive,需要在hadoop的集群上,原理很简单,就是把文件构建成表的形式(有一个数据库或者内存数据库维护表的schema信息),之后提交写好的hive sql的时候,hadoop集群里面的程序把hive脚本转换成对应的mapreduce程序执行。这个时候,做离线的数据分析简单写脚本就行了,不用再搞java代码,然后上传执行了。
      
    6、数据产生的结果,怎么搞到线上提供服务的数据库中呢?
      
    这个时候分析的结果有了,可能是一个很宽很长的excel表格,需要导入到线上的数据库中,可能你想到了,如果我的数据库是mysql,我直接执行load 命令就搞进去了,哪有那么麻烦。但是数据源可能有多了,mysql/oracle/hbase/hdfs 按照笛卡尔积的形式,这样搞要搞死程序员了。这个时候datax(已经开源)出现了,能够实现异构数据源的导入和导出,采用插件的形式设计,能够支持未来的数据源。如果需要导数据,配置一下datax的xml文件或者在web页面上点击下就可以实现了。
      
    7、离线分析有时间差,实时的话怎么搞呢?
      
    要构建实时的分析系统,其实在结果数据出来之前,架构和离线是截然不同的。数据时流动的,如果在大并发海量数据流动过程中,进行自己的业务分析呢?这里其实说简单也简单,说复杂也复杂。目前我接触过的,方案是这样的,业务数据在写入数据库的时候,这里的数据库mysql,在数据库的机器上安装一个程序,类似JMS的系统,用于监听binlog的变更,收到日志信息,将日志信息转换为具体的数据,然后以消息的形式发送出来。这个时候实现了解耦,这样的处理并不影响正常的业务流程。这个时候需要有个Storm集群,storm集群干啥事情呢?就一件事情,分析数据,这个集群来接收刚才提到的JMS系统发送出来的消息,然后按照指定的规则进行逻辑合并等计算,把计算的结果保存在数据库中,这样的话,流动的数据就可以过一遍筛子了。
      
    8、分析的结果数据特别大,在线请求这些结果数据数据扛不住了,咋搞?
      
    一般的结果数据,数据量没有那么大,也就几十万的样子,这样的数据级别,对于mysql这样的数据库没有任何压力,但是这个数据量如果增加到千万或者亿级别,同时有复杂的SQL查询,这个时候mysql肯定就扛不住了。这个时候,可能需要构建索引(例如通过lucene来对于要检索的字段添加索引),或者用分布式的内存服务器来完成查询。总之,两套思路,一个是用文件索引的形式,说白来就是空间换时间,另外一种是用内存,就是用更快的存储来抗请求。
      
    9、在线的数据库,除了mysql、oracle之外,还有其他选择不?
      
    其实目前大家的思维定势,往往第一个选择就是oracle或者mysql,其实完全可以根据场景来进行选择,mysql和oracle是传统的关系型数据库,目前nosql类的数据库也很多,例如HBase就是其中一个重要的代表。如果数据离散分布比较强,且根据特定的key来查询,这个时候HBase其实是一个不错的选择。
      
    10、空间的数据怎么分析
      
    上面的分析大都是统计维度的,其实最简单的描述就是求和或者平均值等,这个时候问题来了,大数据量的空间数据如何分析呢?对于我们电子商务而言,空间数据可能就是海量的收货地址数据了。需要做分析,第一步就是先要把经纬度添加到数据中(如果添加经纬度,这个可以搞http的请求来通过地图服务提供商来或者,或者是根据测绘公司的基础数据来进行文本切割分析),之后空间数据是二维的,但是我们常见的代数是一维的,这个时候一个重要的算法出现了,geohash算法,一种将经纬度数据转换为一个可比较,可排序的字符串的算法。然后,这样就可以再空间距离方面进行分析了,例如远近,例如方圆周边等数据的分析。
      
    11、上面这些仅仅是统计,如果想搞算法或者挖掘之类的,怎么搞呢?
      
    上述的分析,大多数是统计分析,这个时候如果想高一点高级的,例如添加一个算法,咋搞呢?其他复杂的算法我没咋接触过。将拿一个我练过手的算法来讲吧。逻辑回归,如果样本数据量不是很大,可以采用weka来做了个回归,获得一个表达式,然后在线上系统中应用这个表达式,这种类似的表达式获取对于实时性要求不是很高,所以公式每天跑一次就行了。如果数据量比较大,单机的weka无法满足需求了,可以将weka的jar包集成在系统中分析,当然也可以通过hadoop中的mahout来进行离线分析,获取这个表达式。
      
    12、我就是想离线分析数据,但是受不了hive或者hadoop的速度,咋搞?
      
    其实搞过一段时间hadoop的人肯定有一点不爽,就是离线分析的速度太慢了,可能需要等很久,这个时候spark出现了,他和hadoop类似,不过由于是内存中计算,所以速度快了很多,底层可以介入HDFS的文件系统,具体我没有使用过,但是公司内部一个团队目前已经用spark来进行分析了。
      
    13、这就是搞大数据了?
      
    有了这些工具就是搞大数据了?答案肯定不是,这个仅仅是工具罢了。真正搞大数据的可能在于思维的变化,用数据来思考,用数据来做决定。目前的无线和大数据啥关系?我觉得无线的终端是数据的来源和消费端,中间需要大数据的分析,两者密不可分啊。

    推荐阅读文章

    程序员分享女生学大数据怎么样?好就业吗?

    收藏丨大数据:Hadoop族群介绍

    高端大数据首发学习攻略

    展开全文
  • 大数据需要学习什么?很多人问过我这个问题。每一次回答完都觉得自己讲得太片面了,总是没有一个合适的契机去好好总结这些内容,直到开始写这篇东西。大数据是近五年兴起的行业,发展迅速,很多技术经过这些年的迭代...

    大数据需要学习什么?很多人问过我这个问题。每一次回答完都觉得自己讲得太片面了,总是没有一个合适的契机去好好总结这些内容,直到开始写这篇东西。大数据是近五年兴起的行业,发展迅速,很多技术经过这些年的迭代也变得比较成熟了,同时新的东西也不断涌现,想要保持自己竞争力的唯一办法就是不断学习。

      思维导图

      下面的是我整理的一张思维导图,内容分成几大块,包括了分布式计算与查询,分布式调度与管理,持久化存储,大数据常用的编程语言等等内容,每个大类下有很多的开源工具,这些就是作为大数据程序猿又爱又恨折腾得死去活来的东西了。

    \
      大数据需要的语言 Java

      java可以说是大数据最基础的编程语言,据我这些年的经验,我接触的很大一部分的大数据开发都是从Jave Web开发转岗过来的(当然也不是绝对我甚至见过产品转岗大数据开发的,逆了个天)。

      一是因为大数据的本质无非就是海量数据的计算,查询与存储,后台开发很容易接触到大数据量存取的应用场景 二就是java语言本事了,天然的优势,因为大数据的组件很多都是用java开发的像HDFS,Yarn,Hbase,MR,Zookeeper等等,想要深入学习,填上生产环境中踩到的各种坑,必须得先学会java然后去啃源码。

      说到啃源码顺便说一句,开始的时候肯定是会很难,需要对组件本身和开发语言都有比较深入的理解,熟能生巧慢慢来,等你过了这个阶段,习惯了看源码解决问题的时候你会发现源码真香。

      Scala

      scala和java很相似都是在jvm运行的语言,在开发过程中是可以无缝互相调用的。Scala在大数据领域的影响力大部分都是来自社区中的明星Spark和kafka,这两个东西大家应该都知道(后面我会有文章多维度介绍它们),它们的强势发展直接带动了Scala在这个领域的流行。

      Python和Shell

      shell应该不用过多的介绍非常的常用,属于程序猿必备的通用技能。python更多的是用在数据挖掘领域以及写一些复杂的且shell难以实现的日常脚本。

      分布式计算

      什么是分布式计算?分布式计算研究的是如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多服务器进行处理,最后把这些计算结果综合起来得到最终的结果。

      举个栗子,就像是组长把一个大项目拆分,让组员每个人开发一部分,最后将所有人代码merge,大项目完成。听起来好像很简单,但是真正参与过大项目开发的人一定知道中间涉及的内容可不少。

      比如这个大项目如何拆分?任务如何分配?每个人手头已有工作怎么办?每个人能力不一样怎么办?每个人开发进度不一样怎么办?开发过程中组员生病要请长假他手头的工作怎么办?指挥督促大家干活的组长请假了怎么办?最后代码合并过程出现问题怎么办?项目延期怎么办?项目最后黄了怎么办?

      仔细想想上面的夺命十连问,其实每一条都是对应了分布式计算可能会出现的问题,具体怎么对应大家思考吧我就不多说了,其实已经是非常明显了。也许有人觉得这些问题其实在多人开发的时候都不重要不需要特别去考虑怎么办,但是在分布式计算系统中不一样,每一个都是非常严重并且非常基础的问题,需要有很好的解决方案。

      最后提一下,分布式计算目前流行的工具有:

      离线工具Spark,MapReduce等 实时工具Spark Streaming,Storm,Flink等

      这几个东西的区别和各自的应用场景我们之后再聊。

      分布式存储

      传统的网络存储系统采用的是集中的存储服务器存放所有数据,单台存储服务器的io能力是有限的,这成为了系统性能的瓶颈,同时服务器的可靠性和安全性也不能满足需求,尤其是大规模的存储应用。

      分布式存储系统,是将数据分散存储在多台独立的设备上。采用的是可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

    \
      上图是hdfs的存储架构图,hdfs作为分布式文件系统,兼备了可靠性和扩展性,数据存储3份在不同机器上(两份存在同一机架,一份存在其他机架)保证数据不丢失。由NameNode统一管理元数据,可以任意扩展集群。

      主流的分布式数据库有很多hbase,mongoDB,GreenPlum,redis等等等等,没有孰好孰坏之分,只有合不合适,每个数据库的应用场景都不同,其实直接比较是没有意义的,后续我也会有文章一个个讲解它们的应用场景原理架构等。

      分布式调度与管理

      现在人们好像都很热衷于谈"去中心化",也许是区块链带起的这个潮流。但是"中心化"在大数据领域还是很重要的,至少目前来说是的。

      分布式的集群管理需要有个组件去分配调度资源给各个节点,这个东西叫yarn; 需要有个组件来解决在分布式环境下"锁"的问题,这个东西叫zookeeper; 需要有个组件来记录任务的依赖关系并定时调度任务,这个东西叫azkaban。

      当然这些“东西”并不是唯一的,其实都是有很多替代品的,我这里只举了几个比较常用的例子。

    在这里我还是要推荐下我自己建的大数据学习交流qq裙:522189307 , 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴。上述资料加群可以领取


      说两句

      回答完这个问题,准备说点其他的。最近想了很久,准备开始写一系列的文章,记录这些年来的所得所想,感觉内容比较多不知从哪里开始,就画了文章开头的思维导图确定了大的方向,大家都知道大数据的主流技术变化迭代很快,不断会有新的东西加入,所以这张图里内容也会根据情况不断添加。细节的东西我会边写边定,大家也可以给我一些建议,我会根据写的内容实时更新这张图以及下面的目录。

      关于分组

      上面的大数据组件分组其实是比较纠结的,特别是作为一个有强迫症的程序猿,有些组件好像放在其他组也可以,而且我又不想要分太多的组看起来会很乱,所以上面这张图的分组方式会稍主观一些。分组方式肯定不是绝对的。

      举个例子,像kafka这种消息队列一般不会和其它的数据库或者像HDFS这种文件系统放在一起,但是它们同样都具备有分布式持久化存储的功能,所以就把它们放在一块儿了;还有openTsDB这种时序数据库,说是数据库实际上只是基于HBase上的一个应用,我觉得这个东西更侧重于查询和以及用何种方式存储,而不在于存储本身,所以就主观地放在了“分布式计算与查询”这一类,还有OLAP的工具也同样放在了这一组。

      目的

      大家都知道大数据的技术日新月异,作为一个程序猿想要保持竞争力就必须得不断地学习。写这些文章的目的比较简单, 一是可以当做一个笔记,梳理知识点;二是希望能帮到一些人了解学习大数据 。每一篇的篇幅不会太长,阅读时间控制在5到10分钟。我的公众号大叔据,会同步更新。喜欢看公众号文章的同学可以关注下,文章的篇幅不会太长,不会占用你太多的阅读时间,每天花一点时间学习,长期积累总是会有收获的。

    展开全文
  • 程序员必看大数据教程最全1024G学习资料免费赠送详解,大数据工作者可以施展拳脚的领域非常广泛,从国防部、互联网创业公司到金融机构,到处需要大数据项目来做创新驱动。数据分析或数据处理的岗位报酬也非常丰厚,...

    程序员必看大数据教程最全1024G学习资料免费赠送详解,大数据工作者可以施展拳脚的领域非常广泛,从国防部、互联网创业公司到金融机构,到处需要大数据项目来做创新驱动。数据分析或数据处理的岗位报酬也非常丰厚,在硅谷,入门级的数据科学家的收入已经是6位数了(美元)。

    其实Java工程师转型大数据还是非常建议的,不仅仅是前景和薪资等。技术层面来说,大数据使用的Hadoop(在分布式服务器集群上存储海量数据并运行分布式分析应用的一种方法)需要JavaSE基础,即使你没有学过JavaEE上手 Hadoop也是可以的。同样你需要掌握Linux基本命令操作。

     

    互联网行业发展日新月异,要不要做自我迭代和不断学习的人才决定权在于自己。

    -----------------2019年程序员将有更多的机会-----------------------------

    20120189年程序员将有更多机会

    2019年是新技术爆发年,大数据、区块链、人工智能等行业飞速发展,渗透到我们生活的方方面面。

    2019年,新开设“数据科学与大数据技术”专业高校数量达250所。

    《华尔街日报》称:数据已经成为一种新的经济资产类别,就像黄金和货币一样!鉴于大数据巨大的商业价值,大数据专家在企业非常受重视。

     

    在大数据行业内生存的时间越久,其经验也会越得到肯定,这也是大多数资深IT人士猜测大数据或将带来50、60岁的“老”专家的原因。

    面对如此光明而诱人的前景,很多IT从业者早已向大数据转型。

    ------------究竟什么是大数据-----------------------

    麦肯锡全球研究所给出了一个具象的定义:

    一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合。

    具有海量的数据规模(vomule)、快速的数据流转(velocity)、多样的数据(variety)三大特征。

    ------------大数据应用方向-----------------------数据应用方向

    方向一:Hadoop(在分布式服务器集群上存储海量数据并运行分布式分析应用的一种方法)大数据开发方向;

    方向二:数据挖掘、数据分析&机器学习方向;

    方向三:大数据运维&云计算方向。

    三个方向中,大数据开发是基础。以Hadoop开发工程师为例,Hadoop入门月薪已经达到了 8K 以上,工作1年月薪可达到 1.2W 以上,具有2-3年工作经验的Hadoop人才年薪可以达到 30万-50万。

    大大------------大数据是为了最有前景的行业----------------------数据应数据是未来最有前景的行业

    数据分析师为什会被认为是最有发展前景的呢?

    这是一个朝阳行业,现在正处于上升阶段,任何公司的核心都离不开数据,数据分析师也是公司的重要决策人员。选择大数据专业,是你正确的决定。

     

    都有哪些对口的工作职位呢?下面小编为大家介绍一下:

    大数据开发方向;大数据工程师,大数据开发工程师,大数据维护工程师,大数据研发工程师,大数据架构师等;

    数据挖掘,数据分析和机器学习方向;大数据分析师,大数据高级工程师,大数据分析师专家,大数据挖掘师,大数据算法师等;

    大数据运维和云计算方向;大数据运维工程师等。

    ------------------------大数据人才需求和现状------------------------------------

    大数据人才需求和现状

    目前的两个主要趋势是,大数据领域从业人员的薪金将继续增长,大数据人才供不应求。麦肯锡全球研究院的研究预测在未来6年,同时具备通过分析大数据并为企业做出有效决策的数据的管理人员和分析师也有150万人的缺口。

     

    目前的大数据人才供给指数仅为0.05,属于高度稀缺。跳槽速度也最快,平均跳槽速度为19.8个月,而在BAT企业招聘的职位里,60%以上都在招大数据人才。

    -----------------------大数据工程年薪非常可观----------------

    人才紧缺带来最直观现象就是薪酬的提升。

    目前,一个大数据工程师的月薪轻松过万,一个有几年工作经验的数据分析师,薪酬在40万~60万元之间,而更顶尖的大数据技术人才则是年薪轻松超百万。

     

    猎聘APP里搜索关键词“大数据"很多企业对大数据人才开出的薪资十分诱人。

     

    有的时候成功就是这样,方向和平台选择对了,只要付出足够的汗水,选择大于努力。

    -------------------为什么从业人员这么少----------------

    为什么从--业人员这么少呢?

    大数据做为新科技新技术,本身发展时间也没多久。

    大数据技术门槛是非常大,从理论理解架构,实践认识技术,完成企业级项目,才能算真正出师。

     

    大学教师资源缺稀,有理论却无实践经验,而大部分实践经验丰富的人都被BAT或大公司垄断。从事教育事业的专业大数据架构师不多。

    -----------------2018年ITSTAR阿里云合作签约---------------

    2018年ITSTAR阿里云合作签约

    作为国内领先的 IT 技术学习社区,ITSTAR经过长时间的积累和沉淀,联合阿里云不断打磨整理出最高效的学习体系。

     

    如果你对大数据开发感兴趣,没有大数据基础也没有关系,如果有Java等编程基础将对学习大有裨益。现在联合号主免费"大数据开发"感兴趣的朋友开放我们的大数据工程师精英计划!

          现在加入,限时领取:

         ★ 完整体系课程一套:从入门到精通

          ★ 实时提问:解决工作遇到的问题

          ★ 不定期发布高薪精选职位

          ★ 每天1次公开课:BAT大咖等你来撩

          ★ 1024G 会员专属资料共享:内容涵盖“大数据开发必备工具”、“大数据系列精品课程”、“程序员高薪就业指导”、“JAVA项目实战”、“人工智能系列”等价值3W全套视频源码免费发放你!(同步更新不止IT)。

    截止到今天,大数据工程师精英计划已有北上广等 33 万程序猿加入,原价1280元的年会员资格现免费放送,助大家登上人生巅峰!

    ---------------------2014G免费学习资料如下------------

    大数据零基础入门必备课程

     

     

    大数据精品VIP视频

    大数据实战案例视频

    大数据就业指导

    Python项目实战资料

    Java项目实战资料

    大声说出你的“Bug”前后端尽管来问!

    ---------------------------1042G资料领取方式-------------------------------------------------

    对大数据以及人工智能概念都是模糊不清的,该按照什么线路去学习,学完往哪方面发展,想深入了解,想学习的同学欢迎加入大数据学习qq群:458345782,有大量干货(零基础以及进阶的经典实战)分享给大家,并且有清华大学毕业的资深大数据讲师给大家免费授课,给大家分享目前国内最完整的大数据高端实战实用学习流程体系 。从java和linux入手,其后逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相关知识一一分享!

    领取免费学习教程之后,如果想要更系统高效地学习大数据,还可报名参加VIP课程。

    展开全文
  • 因此对大数据知识也有必要进行一些学习理解 基础概念前言目前人工智能和大数据火热,使用的场景也越来越广,日常开发中前端同学也逐渐接触了更多与大数据相关的开发需求。因此对大数据知识也有必要进行一些学习理解...

    原文链接

    摘要: 前言 目前人工智能和大数据火热,使用的场景也越来越广,日常开发中前端同学也逐渐接触了更多与大数据相关的开发需求。因此对大数据知识也有必要进行一些学习理解 基础概念

    前言

    目前人工智能和大数据火热,使用的场景也越来越广,日常开发中前端同学也逐渐接触了更多与大数据相关的开发需求。因此对大数据知识也有必要进行一些学习理解。

    基础概念

    大数据的本质

    一、数据的存储:分布式文件系统(分布式存储)
    二、数据的计算:分部署计算

    基础知识

    学习大数据需要具备Java知识基础及Linux知识基础

    学习路线

    (1)Java基础和Linux基础
    (2)Hadoop的学习:体系结构、原理、编程
    第一阶段:HDFS、MapReduce、HBase(NoSQL数据库)
    第二阶段:数据分析引擎 -> Hive、Pig

    数据采集引擎 -> Sqoop、Flume
    第三阶段:HUE:Web管理工具

    ZooKeeper:实现Hadoop的HA
    Oozie:工作流引擎
    (3)Spark的学习

    第一阶段:Scala编程语言
    第二阶段:Spark Core -> 基于内存、数据的计算
    第三阶段:Spark SQL -> 类似于mysql 的sql语句
    第四阶段:Spark Streaming ->进行流式计算:比如:自来水厂

    (4)Apache Storm 类似:Spark Streaming ->进行流式计算

    NoSQL:Redis基于内存的数据库

    HDFS

    分布式文件系统 解决以下问题:

    1、硬盘不够大:多几块硬盘,理论上可以无限大
    2、数据不够安全:冗余度,hdfs默认冗余为3 ,用水平复制提高效率,传输按照数据库为单位:Hadoop1.x 64M,Hadoop2.x 128M
    管理员:NameNode 硬盘:DataNode

    image.png
    MapReduce

    基础编程模型:把一个大任务拆分成小任务,再进行汇总
    MR任务:Job = Map + Reduce 
    Map的输出是Reduce的输入、MR的输入和输出都是在HDFS
    MapReduce数据流程分析:

    Map的输出是Reduce的输入,Reduce的输入是Map的集合

    image

    HBase

    什么是BigTable?: 把所有的数据保存到一张表中,采用冗余 ---> 好处:提高效率

    1、因为有了bigtable的思想:NoSQL:HBase数据库
    2、HBase基于Hadoop的HDFS的
    3、描述HBase的表结构
    核心思想是:利用空间换效率

    image

    Hadoop环境搭建

    环境准备

    Linux环境、JDK、http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-3.0.0/hadoop-3.0.0-src.tar.gz

    安装

    1、安装jdk、并配置环境变量

    vim /etc/profile 末尾添加
    image.png
    2、解压hadoop-3.0.0.tar.gz、并配置环境变量

    tar -zxvf hadoop-3.0.0.tar.gz -C /usr/local/
    mv hadoop-3.0.0/ hadoop

    image

    image

    vim /etc/profile 末尾添加

    image.png

    配置

    Hadoop有三种安装模式:

    本地模式:

       1台主机  
       不具备HDFS,只能测试MapReduce程序

    伪分布模式:

       1台主机  
       具备Hadoop的所有功能,在单机上模拟一个分布式的环境
      (1)HDFS:主:NameNode,数据节点:DataNode
      (2)Yarn:容器,运行MapReduce程序
       主节点:ResourceManager
       从节点:NodeManager

    全分布模式:

       至少3台

    我们以伪分布模式为例配置:

    修改hdfs-site.xml:冗余度1、权限检查false

    <!--配置冗余度为1--><property>
        <name>dfs.replication</name>
        <value>1</value></property><!--配置权限检查为false--><property>
        <name>dfs.permissions</name>
        <value>false</value></property>
    

    修改core-site.xml

    <name>fs.defaultFS</name>
        <value>hdfs://192.168.56.102:9000</value></property><!--配置DataNode保存数据的位置--><property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value></property>
    修改mapred-site.xml
    

    <name>mapreduce.framework.name</name>
     <value>yar</value></property><property>
     <name>yarn.app.mapreduce.am.env</name>
     <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property><property>
     <name>mapreduce.map.env</name>
     <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property><property>
     <name>mapreduce.reduce.env</name>
     <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value></property><property>
     <name>mapreduce.application.classpath</name>
     <value>
             /usr/local/hadoop/etc/hadoop,
             /usr/local/hadoop/share/hadoop/common/*,
             /usr/local/hadoop/share/hadoop/common/lib/*,
             /usr/local/hadoop/share/hadoop/hdfs/*,
             /usr/local/hadoop/share/hadoop/hdfs/lib/*,
             /usr/local/hadoop/share/hadoop/mapreduce/*,
             /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
             /usr/local/hadoop/share/hadoop/yarn/*,
             /usr/local/hadoop/share/hadoop/yarn/lib/*,    
     </value>
     </property>
    

    修改yarn-site.xml

    <!--配置ResourceManager地址--><property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.56.102</value></property><!--配置NodeManager执行任务的方式--><property>
        <name>yarn.nodemanager.aux-service</name>
        <value>mapreduce_shuffle</value></property>
    

    格式化NameNode

    hdfs namenode -format
    

    看到

    common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted
    

    表示格式化成功

    启动

    start-all.sh
    (*)HDFS:存储数据
    (*)YARN:

    访问

    (*)命令行
    (*)Java Api
    (*)WEB Console
    HDFS: http://192.168.56.102:50070
    Yarn: http://192.168.56.102:8088

    image

    查看HDFS管理界面和yarn资源管理系统
    image


    image

    基本操作:

    HDFS相关命令

    -mkdir 在HDFD创建目录 hdfs dfs -mkdir /data
    -ls 查看目录 hdfs dfs -ls
    -ls -R 查看目录与子目录 hdfs dfs -ls -R
    -put 上传一个文件 hdfs dfs -put data.txt /data/input
    -copyFromLocal 上传一个文件 与-put一样
    -moveFromLocal 上传一个文件并删除本地文件 
    -copyToLocal 下载文件 hdfs dfs -copyTolocal /data/input/data.txt
    -put 下载文件 hdfs dfs -put/data/input/data.txt
    -rm 删除文件 hdfs dfs -rm
    -getmerge 将目录所有文件先合并再下载
    -cp 拷贝
    -mv 移动
    -count 统计目录下的文件个数
    -text、-cat 查看文件
    -balancer 平衡操作

    image

    MapReduce示例

    image

    结果:

    image

    如上 一个最简单的MapReduce示例就执行成功了

    思考

    Hadoop是基于Java语言的,前端日常开发是用的PHP,在使用、查找错误时还是蛮吃力的。工作之余还是需要多补充点其它语言的相关知识,编程语言是我们开发、学习的工具,而不应成为限制我们技术成长的瓶颈!

    原文发布时间为:2018-07-13
    本文来自云栖社区合作伙伴“中生代技术”,了解相关信息可以关注“中生代技术”。


    展开全文
  • 第一讲:大数据基础入门 第一节:为什么要学习大数据 1、目的:很好工作 2、对比:Java开发和大数据开发 第二节:什么是大数据? 举例: 1、商品推荐: 问题:(1)大量的订单如何存储? (2)大量的订单如何...

    第一讲:大数据基础入门

    第一节:为什么要学习大数据
    	1、目的:很好工作
    	2、对比:Java开发和大数据开发
    
    第二节:什么是大数据?
    	举例:
    	1、商品推荐: 问题:(1)大量的订单如何存储?    (2)大量的订单如何计算?
    	2、天气预报: 问题:(1)大量的天气数据如何存储?(2)大量的天气数据如何计算?
    	
    	什么是大数据,本质?
    	(1)数据的存储:分布式文件系统(分布式存储)    
    	(2)数据的计算:分布式计算
    
    第三节:Java和大数据是什么关系?
    	1、Hadoop:基于Java语言开发
    	2、Spark: 基于Scala语言,Scala基于Java语言
    
    第四节:学习大数据需要的基础和路线
    	1、学习大数据需要的基础:Java基础(JavaSE)---> 类、继承、I/O、反射、泛型*****
    	                         Linux基础(Linux的操作)  ---> 创建文件、目录、vi编辑器***
    							 
    	2、学习路线:
    		(1)Java基础和Linux基础
    		(2)Hadoop的学习:体系结构、原理、编程
    				(*)第一阶段:HDFS、MapReduce、HBase(NoSQL数据库)
    				(*)第二阶段:数据分析引擎 ---> Hive、Pig
    				               数据采集引擎 ---> Sqoop、Flume
    				(*)第三阶段:HUE:Web管理工具
    				               ZooKeeper:实现Hadoop的HA
    							   Oozie:    工作流引擎
    		(3)Spark的学习
    				(*)第一个阶段:Scala编程语言
    				(*)第二个阶段:Spark Core-----> 基于内存,数据的计算
    				(*)第三个阶段:Spark SQL -----> 类似Oracle中的SQL语句
    				(*)第四个阶段:Spark Streaming ---> 进行实时计算(流式计算):比如:自来水厂
    				
    		(4)Apache Storm:类似Spark Streaming ---> 进行实时计算(流式计算):比如:自来水厂
    				(*)NoSQL:Redis基于内存的数据库
    

    第二课:Hadoop的背景起源一: GFS: Google File System

    一、什么是大数据,本质?
    	(1)数据的存储:分布式文件系统(分布式存储)-----> HDFS: Hadoop Distributed File System
    	(2)数据的计算:分布式计算
    	
    二、如何解决大数据的存储?----> 分布式文件系统(HDFS,来源于GFS)
    	举例:网盘
    	(1) GFS: 没有硬盘的,数据只能存在内存中
    	(2) Hadoop的安装模式
    		(*)本地模式  :1台
    		(*)伪分布模式:1台
    		(*)全分布模式:3台
    

    在这里插入图片描述

    第三课:Hadoop的背景起源二:MapReduce

    一、什么是大数据,本质?
    	(1)数据的存储:分布式文件系统(分布式存储)-----> HDFS: Hadoop Distributed File System
    	(2)数据的计算:分布式计算
    	
    二、如何解决大数据的计算?分布式计算
    	(1)什么是PageRank(MapReduce的问题的来源)
    		(*) 搜索排名
    	
    	(2)MapReduce(Java语言实现)基础编程模型: 把一个大任务拆分成小任务,再进行汇总
    		(*) 更简单一点例子
    

    在这里插入图片描述

    第四课:Hadoop的背景起源三 : BigTable ----> 大表 ----> NoSQL数据库:HBase

    第一节:关系型数据库(Oracle、MySQL、SQL Server)的特点
    	1、什么是关系型数据库?基于关系模型(基于二维表)所提出的一种数据库
    	2、ER(Entity-Relationalship)模型:通过增加外键来减少数据的冗余
    	3、举例:学生-系
    
    第二节:什么是BigTable?: 把所有的数据保存到一张表中,采用冗余 ---> 好处:提高效率
    	1、因为有了bigtable的思想:NoSQL:HBase数据库
    	2、HBase基于Hadoop的HDFS的
    	3、描述HBase的表结构
    

    在这里插入图片描述
    在这里插入图片描述

    第五课:搭建Hadoop的环境

    准备实验的环境:
    1、安装Linux、JDK
    2、配置主机名、免密码登录
    3、约定:安装目录:/root/training
    
    安装:
    1、解压 : tar -zxvf hadoop-2.4.1.tar.gz -C /root/training/
    2、设置环境变量: vi ~/.bash_profile
    		HADOOP_HOME=/root/training/hadoop-2.4.1
    		export HADOOP_HOME
    
    		PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    		export PATH
    		
    	生效环境变量: source ~/.bash_profile
    
    
    第一节:Hadoop的目录结构
    
    第二节:Hadoop的本地模式
    	1、特点:不具备HDFS,只能测试MapReduce程序
    	2、修改hadoop-env.sh
    	
    	   修改第27行:export JAVA_HOME=/root/training/jdk1.7.0_75
    	   
    	3、演示Demo: $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar
    		命令:hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /root/data/input/data.txt  /root/data/output/wc
    		日志:17/08/04 23:28:38 INFO mapreduce.Job:  map 100% reduce 100%
    	
    		注意:MR有一个默认的排序规则
    
    第三节:Hadoop的伪分布模式
    	1、特点:具备Hadoop的所有功能,在单机上模拟一个分布式的环境
    	         (1)HDFS:主:NameNode,数据节点:DataNode
    			 (2)Yarn:容器,运行MapReduce程序
    			            主节点:ResourceManager
    						从节点:NodeManager
    						
    	2、步骤:
    	(1)hdfs-site.xml
    		<!--配置HDFS的冗余度-->
    		<property>
    		  <name>dfs.replication</name>
    		  <value>1</value>
    		</property>
    
    		<!--配置是否检查权限-->
    		<property>
    		  <name>dfs.permissions</name>
    		  <value>false</value>
    		</property>	
    
    	(2)core-site.xml
    		<!--配置HDFS的NameNode-->
    		<property>
    		  <name>fs.defaultFS</name>
    		  <value>hdfs://192.168.88.11:9000</value>
    		</property>
    
    		<!--配置DataNode保存数据的位置-->
    		<property>
    		  <name>hadoop.tmp.dir</name>
    		  <value>/root/training/hadoop-2.4.1/tmp</value>
    		</property>		
    		
    		
    	(3) mapred-site.xml
    		<!--配置MR运行的框架-->
    		<property>
    		  <name>mapreduce.framework.name</name>
    		  <value>yarn</value>
    		</property>		
    		
    	(4) yarn-site.xml
    		<!--配置ResourceManager的地址-->
    		<property>
    		  <name>yarn.resourcemanager.hostname</name>
    		  <value>192.168.88.11</value>
    		</property>
    
    		<!--配置NodeManager执行任务的方式-->
    		<property>
    		  <name>yarn.nodemanager.aux-services</name>
    		  <value>mapreduce_shuffle</value>
    		</property>		
    		
    	(5) 格式化NameNode
    	    hdfs namenode -format
    		日志:Storage directory /root/training/hadoop-2.4.1/tmp/dfs/name has been successfully formatted.
    		
    		
    	(6) 启动:start-all.sh
    	           (*) HDFS: 存储数据
    			   (*) Yarn:执行计算
    			   
    	(7) 访问:(*)命令行
    	          (*)Java API
    			  (*)Web Console:
    					HDFS:http://192.168.88.11:50070
    					Yarn:http://192.168.88.11:8088
    

    在这里插入图片描述

    第六讲:HDFS的基本操作

    第一节:HDFS的相关命令
    	-mkdir            在HDFS创建目录    hdfs dfs -mkdir /data
    	-ls               查看当前目录      hdfs dfs -ls /
    	-ls -R            查看目录与子目录
    	-put              上传一个文件      hdfs dfs -put data.txt /data/input
    	-moveFromLocal    上传一个文件,会删除本地文件:ctrl + X
    	-copyFromLocal    上传一个文件,与put一样
    	-copyToLocal      下载文件  hdfs dfs -copyToLocal /data/input/data.txt 
    	-get              下载文件  hdfs dfs -get /data/input/data.txt 
    	-rm               删除文件  hdfs dfs -rm /data/input/data.txt 
    	-getmerge         将目录所有的文件先合并,再下载
    	-cp               拷贝: hdfs dfs -cp /data/input/data.txt  /data/input/data01.txt 
    	-mv               移动: hdfs dfs -mv /data/input/data.txt  /data/input/data02.txt 
    	-count            统计目录下的文件个数
    	-text、-cat       查看文件的内容  hdfs dfs -cat /data/input/data.txt 
    	-balancer         平衡操作
    
    第二节:HDFS的Java API
    	(*)在HDFS上创建一个目录:
    		依赖的jar包:
    		/root/training/hadoop-2.4.1/share/hadoop/common/lib
    		/root/training/hadoop-2.4.1/share/hadoop/common/
    		
    		/root/training/hadoop-2.4.1/share/hadoop/hdfs/lib
    		/root/training/hadoop-2.4.1/share/hadoop/hdfs/
    
    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    public class TestMain {
    
    	public static void main(String[] args) throws Exception {
    		// 使用HDFS的API创建目录
    		//设置NameNode地址
    		Configuration conf = new Configuration();
    		conf.set("fs.defaultFS", "hdfs://192.168.88.11:9000");
    		
    		//得到HDFS的文件系统
    		FileSystem fs = FileSystem.get(conf);
            fs.mkdirs(new Path("/folder1"));
    	}
    
    }
    
    

    第七讲:MapReduce入门

    第一节:回顾:MapReduce的编程模型
    
    第二节:WordCount的流程分析
    	1、伪分布环境运行WordCount
    	   hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /data/input/data.txt /data/output/wc
    		日志:
    			17/08/05 01:12:24 INFO mapreduce.Job:  map 0% reduce 0%
    			17/08/05 01:12:30 INFO mapreduce.Job:  map 100% reduce 0%
    			17/08/05 01:12:35 INFO mapreduce.Job:  map 100% reduce 100%
    	
    	2、分析的数据流动的过程(重要): 运行原理和机制
    

    在这里插入图片描述

    第八课:开发WordCount程序

    依赖jar:
    /root/training/hadoop-2.4.1/share/hadoop/common/lib
    /root/training/hadoop-2.4.1/share/hadoop/common/
    
    /root/training/hadoop-2.4.1/share/hadoop/mapreduce/lib
    /root/training/hadoop-2.4.1/share/hadoop/mapreduce/
    
    package demo;
    
    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    public class WordCountMain {
    
    	public static void main(String[] args) throws Exception {
    		//创建一个job = map + reduce
    		Configuration conf = new Configuration();
    		
    		//创建一个Job
    		Job job = Job.getInstance(conf);
    		//指定任务的入口
    		job.setJarByClass(WordCountMain.class);
    		
    		//指定job的mapper
    		job.setMapperClass(WordCountMapper.class);
    		job.setMapOutputKeyClass(Text.class);
    		job.setMapOutputValueClass(LongWritable.class);
    		
    		//指定job的reducer
    		job.setReducerClass(WordCountReducer.class);
    		job.setOutputKeyClass(Text.class);
    		job.setOutputValueClass(LongWritable.class);
    		
    		//指定任务的输入和输出
    		FileInputFormat.setInputPaths(job, new Path(args[0]));
    		FileOutputFormat.setOutputPath(job, new Path(args[1]));		
    		
    		//提交任务
    		job.waitForCompletion(true);
    	}
    
    }
    
    
    package demo;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    
    	@Override
    	protected void map(LongWritable key, Text value, Context context)
    			throws IOException, InterruptedException {
    		/*
    		 * key: 输入的key
    		 * value: 数据   I love Beijing
    		 * context: Map上下文
    		 */
    		String data= value.toString();
    		//分词
    		String[] words = data.split(" ");
    		
    		//输出每个单词
    		for(String w:words){
    			context.write(new Text(w), new LongWritable(1));
    		}
    	}
    
    }
    
    package demo;
    
    import java.io.IOException;
    
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
    
    	@Override
    	protected void reduce(Text k3, Iterable<LongWritable> v3,Context context) throws IOException, InterruptedException {
    		//v3: 是一个集合,每个元素就是v2
    		long total = 0;
    		for(LongWritable l:v3){
    			total = total + l.get();
    		}
    		
    		//输出
    		context.write(k3, new LongWritable(total));
    	}
    
    }
    
    

    第九课:Spark基础

    第一节:什么是Spark?Spark的特点和结构
    	1、什么是Spark?
    	   Spark是一个针对大规模数据处理的快速通用引擎。
    	   类似MapReduce,都进行数据的处理
    	   
    	2、Spark的特点:
    		(1)基于Scala语言、Spark基于内存的计算
    		(2)快:基于内存
    		(3)易用:支持Scala、Java、Python
    		(4)通用:Spark Core、Spark SQL、Spark Streaming
    		           MLlib、Graphx
    		(5)兼容性:完全兼容Hadoop
    
    	3、Spark体系结构:主从结构
    		(1)主节点:Master
    		(2)从节点:Worker
    
    第二节:搭建Spark的伪分布模式环境
    	1、解压:tar -zxvf spark-2.1.0-bin-hadoop2.4.tgz -C ~/training/
    	2、配置参数文件: conf/spark-env.sh
    	    export JAVA_HOME=/root/training/jdk1.7.0_75
    		export SPARK_MASTER_HOST=bigdata11
            export SPARK_MASTER_PORT=7077
    		
    		conf/slaves ----> 从节点的主机信息
    		bigdata11
    		
    	3、启动Spark伪分布环境
    	    sbin/start-all.sh
    		
    	   Spark Web Console: http://192.168.88.11:8080
    

    在这里插入图片描述

    展开全文
  • Hadoop2.X大数据基础入门课程,主要包括HDFS、MapReduce、ZooKeeper、Kafka等框架理论知识、集群搭建、操作实战等。
  • 现在大数据这三个字如此火,不得不说这三个字成为了很好的商业噱头,对于投资人和创业者而言,大数据是个热门的融资标签,各种原由直接成就了现在的大数据盛况,各家企业争先开展大数据业务,大数据人才空前稀缺,...
  • 所谓大数据(Big Data),就是需要处理的数据量非常巨大,已经达到了 TB、PB 甚至 EB、ZB 级别,需要成千上万块硬盘才能存储。传统的技术手段在大数据面前不堪一击,只能探索一套新的解决方案。 这套《大数据技术与...
  • 大数据入门基础概念) 与大数据相关的基础概念大数据入门基础概念 数据类型-结构化数据与非结构化数据 结构化数据 半结构化数据 非结构化数据 大数据及其特点 特征 结构 数据仓库 数据仓库与数据库的区别 CAP ...
  • 大数据入门基础课程

    2018-01-08 16:47:20
    我们想要学习大数据首先我们需要对大数据有什么要的了解,从小白到高级工程师,我们都要需要具备哪些条件和因素,通过赵强老师的大数据入门基础课程让你对大数据有一个全方位的了解,在大数据这条路上不在迷茫。
  • 12 大数据平台基础架构和常用处理工具更多干货分布式实战(干货)spring cloud 实战(干货)mybatis 实战(干货)spring boot 实战(干货)React 入门实战(干货)构建中小型互联网企业架构(干货)python 学习持续...
  • 因此对大数据知识也有必要进行一些学习理解,带大家来学习了解一下大数据基础知识。 很多初学者,对大数据的概念都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展...
  • 尚硅谷新版大数据基础入门到精通全套视频教程作为大数据倡导者
  • DKhadoop大数据平台基础框架的简单介绍 大数据作为当下最为热门的事件之一,其实已经不算是很新鲜的事情了。如果是三五年前在讨论大数据,那可能会给人一种很新鲜的感觉。大数据作为当下最为重要的一项战略资源,...
  • 大数据,big data,大数据是指不能用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。这句话至少传递两种信息:大数据是海量的数据,另外大数据处理无捷径,对分析处理技术提出了更高的要求。 其实...
  • 以 Hortonworks Data Platform (HDP) 平台为例 ,hadoop大数据平台的安全机制包括以下两个方面: 身份认证 即核实一个使用者的真实身份,一个使用者来使用大数据引擎平台,这个使用者需要表明自己是谁,即提供自己的...
  • 已经火了很久了,一直想了解它学习它结果没时间,了解了一些资料,结合我自己的情况,整理了一个学习路线。...1.Linux基础和分布式集群技术 学完此阶段可掌握的核心能力: 熟练使用Linux,熟练安装Linux...
  • 由于大数据的兴起与应用,数据科学家和数据分析师,以及具大数据技术工作能力的工程师和开发人员得到了青睐,并获得良好的回报。那么,行业人士如何获得这样的一份工作?那就是获取大数据认证。 数据和大数据分析...
  •   下载地址:百度网盘
  • 大数据人才供不应求,有一些人则看到了大数据带来的机遇,想通过专业的培训来学习大数据,那么大数据从0开始需要学习些什么内容呢 一、0基础学习大数据需要Java基础 Java:开发需求最多的编程语言之一,可以...
1 2 3 4 5 ... 20
收藏数 37,322
精华内容 14,928