随着我们网络的发达,科技的发达,我们网络上产生的数据越来越多,越来越大,那么大到什么地步,有10000G那么大吗?告诉你比那个大多了!那有1000T那么大吗?比那个也大多了,已经是单一的服务器解决不了的,那么我们不是可以多用几台服务器就解决了?一台一台服务器分别写入和读取数据是很麻烦的。
接着分布式文件系统就应运而生了,它可以管辖很多服务器用来存储数据,通过这个文件系统存储数据时,我们就感觉在操作一台服务器一样。分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异给屏蔽了,但是数据分布在不同的服务器中,分布在不同节点上的数据可能是属于同一个文件,为了组织众多的文件,把文件放到不同的文件夹中,文件夹可以一级一级的包含。这种组织形式称为命名空间(namespace)。命名空间管理着集群中的所有文件。命名空间的职责和正真存储真实数据的职责是不一样的。负责命名空间职责的节点称为主节点(master node),负责存储真实数据的职责的单称为从节点(slave node)。主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,我们把这样的结构称为主从式结构(master-slave)。用户操作时也应该先和主节点打交道,查询数据在哪些从节点上存储,然后才从从节点存储,然后再从从节点读取。在主节点中,为了加快用户的访问速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。在从节点存储数据时,有的原始数据可能很大,有的可能很小,如果大小不一样的文件不容易管理,那么抽象出一个独立的存储文件单位,称为:块(block)。然后数据存放在集群中,可能网络原因或者服务器硬件原因造成访问失败,所以又才用了副本机制(replication),把数据同时备份到多台服务器中,这样数据就更安全了。
在hadoop中,分布式存储系统统称为HDFS(hadoop distributed file system)。其中,主节点为名字节点(namenode),从节点称为数据节点(datanode)。
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据读取到内存中进行处理,比如数据大小是100GB,我们要统计文件中一共有多少个单词。要想到文件加载到内存中几乎是不可能的,要想把数据加载到内存中几乎也是不可能的。随着技术发展,即使服务器有100GB内存,这样的服务器也很昂贵,即使数据能够加载到内容,那么加载100GB也是需要很长时间的。那么这就是我们遇到的问题,那么我们怎么处理呢?
是否可以把程序代码放到存放数据的服务器上呢?因为程序代码相对于原始数据来说很小,几乎是可以忽略不计的,所以省下了原始数据的传输的时间。现在数据是存放在分布式的文件系统中,100GB的数据可能存放在很多服务器上,那么就可以把代码分发到这些服务器上,在这些服务器上同时进行,也就是并行计算,这样就大大缩短了程序执行的时间。分布式计算需要的是最终的结果,程序代码在很多服务器上执行后会产生很多的结果,因此需要一段代码对这些中间结果进行汇总。Hadoop中的分布式计算一般分为两个阶段完成的,第一阶段负责读取各数据节点中的原始数据,进行初步处理,对各个节点的数据求单词书。然后把处理结果传输到第二阶段,对中间结果进行汇总,产生最终的结果。
在分布式计算中,程序代码应该允许放在哪些数据节点上,哪些节点运行第一阶段的代码,哪些节点运行第二阶段的代码;第一阶段代码执行完毕后,传输到第二阶段代码所在节点;如果中间执行失败了,怎么办?等等问题,都需要管理。运行这些管理职责代码的节点称为主节点(master node),运行第一二阶段程序代码的节点称为从节点(slave node)。用户的代码应该提交给主节点,由主节点负责把代码分配到不同的节点执行。
在hadoop中,分布式计算部分称为Mapreduce。其中,主节点称为作业节点(jobtracker)
,从节点称为从节点(tasktracker)。在任务节点中,运行第一段的代码称为map任务,运行第二段代码称为reduce任务。
Hadoop到底能做什么?怎么用hadoop?
hadoop是什么?
(1)Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce(数据处理),Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元。用函数式变成Mapreduce代替SQL,SQL是查询语句,而Mapreduce则是使用脚本和代码,而对于适用于关系型数据库,习惯SQL的Hadoop有开源工具hive代替。
(2)Hadoop就是一个分布式计算的解决方案.
hadoop能做什么?
hadoop擅长日志分析,facebook就用Hive来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中 的 自定义筛选也使用的Hive;利用Pig还可以做高级的数据处理,包括Twitter、LinkedIn 上用于发现您可能认识的人,可以实现类似Amazon.com的协同过滤的推荐效果。淘宝的商品推荐也是!在Yahoo!的40%的Hadoop作业是用pig运行的,包括垃圾邮件的识别和过滤,还有用户特征建模。(2012年8月25新更新,天猫的推荐系统是hive,少量尝试mahout!)
下面举例说明:
设想一下这样的应用场景. 我有一个100M 的数据库备份的sql 文件.我现在想在不导入到数据库的情况下直接用grep操作通过正则过滤出我想要的内容。例如:某个表中 含有相同关键字的记录那么有几种方式,一种是直接用linux的命令 grep 还有一种就是通过编程来读取文件,然后对每行数据进行正则匹配得到结果好了 现在是100M 的数据库备份.上述两种方法都可以轻松应对.
那么如果是1G , 1T 甚至 1PB 的数据呢 ,上面2种方法还能行得通吗? 答案是不能.毕竟单台服务器的性能总有其上限.那么对于这种 超大数据文件怎么得到我们想要的结果呢?
有种方法 就是分布式计算, 分布式计算的核心就在于 利用分布式算法 把运行在单台机器上的程序扩展到多台机器上并行运行.从而使数据处理能力成倍增加.但是这种分布式计算一般对编程人员要求很高,而且对服务器也有要求.导致了成本变得非常高.
Haddop 就是为了解决这个问题诞生的.Haddop 可以很轻易的把 很多linux的廉价pc 组成 分布式结点,然后编程人员也不需要知道分布式算法之类,只需要根据mapreduce的规则定义好接口方法,剩下的就交给Haddop. 它会自动把相关的计算分布到各个结点上去,然后得出结果.
例如上述的例子 : Hadoop 要做的事 首先把 1PB的数据文件导入到 HDFS中, 然后编程人员定义好 map和reduce, 也就是把文件的行定义为key,每行的内容定义为value , 然后进行正则匹配,匹配成功则把结果 通过reduce聚合起来返回.Hadoop 就会把这个程序分布到N 个结点去并行的操作.
那么原本可能需要计算好几天,在有了足够多的结点之后就可以把时间缩小到几小时之内.
这也就是所谓的 大数据 云计算了.如果还是不懂的话再举个简单的例子
比如 1亿个 1 相加 得出计算结果, 我们很轻易知道结果是 1亿.但是计算机不知道.那么单台计算机处理的方式做一个一亿次的循环每次结果+1
那么分布式的处理方式则变成 我用 1万台 计算机,每个计算机只需要计算 1万个 1 相加 然后再有一台计算机把 1万台计算机得到的结果再相加
从而得到最后的结果.
理论上讲, 计算速度就提高了 1万倍. 当然上面可能是一个不恰当的例子.但所谓分布式,大数据,云计算 大抵也就是这么回事了.
hadoop能为我司做什么?
零数据基础,零数据平台,一切起点都是0。
日志处理
用户细分特征建模
个性化广告推荐
智能仪器推荐
一切以增加企业的商业价值为核心目的、最终目的
怎么用hadoop
hadoop的应用的在我司还属于研发型项目,拟用日志的分析来走通一次流程,因为此阶段目前来说还不需要数据挖掘的专业人员,在数据分析阶段即可,而系统有数据库工程师,Mapreduce有java开发工程师,而分析由我本人介入,而可视化暂时可由前端JS实现,本来我的调研方案,针对大数据的解决方案是hadoop+R的,但是对于R我们是完全不懂,在公司还没有大量投入人员的情况下,只有日志分析目前看来是最容易出成果的,也是可以通过较少人员能出一定成果的,所以选取了这个方向作为试点。
hadoop适合处理分布式集群系统,本身是支持高速并发海量数据的写入和读取的。解决大量用户并发访问的方案有很多,给你个千万pv的参考方案:
1)架构中直接引入软件名称的模块,是个人推荐使用的,如Haproxy、Hadoop等;
2)关于全局负载均衡,看成本投入情况,可以使用商业的产品,如F5-GTM,开源方案便是自搭智能DNS;
3)本地负载均衡方案,可以考虑F5-LTM或成熟的开源解决方案LVS;
4)代理层为什么推荐大家使用Haproxy?Haproxy是一个非常优秀的反向代理软件,十分高效、稳定。国内top 10的互联网公司都有在使用;
5)缓存层可以使用Squid或Varnish,个人更倾向Varnish。配置灵活、运行稳定,提供非常便利的管理接口。为啥在缓存层前面加一层代理?优点非常多,列举如下:
根据应用配置URI路由规则,集中热点来提高后端缓存的命中率;
轻松划分网站频道、版块,更好对应用进步组织、规划;
对URI进行一般性安全过滤,抵御注入攻击;
弹性调配硬件资源,应对突发事件产生大流量;
可回收宝贵的公网IP资源;
6)应用层开源技术方案非常多且成熟,在此不详细描述;
7)数据库层主流开源解决方案Mysql是首选,主从复制(一主对多从)是目前比较靠谱的模式;
8)关于Nosql,应用场景不多说,可参考“给部门做的Mongodb技术交流PPT”文章,redis、memcached等作为热点数据存储、数据库缓存都非常理想;
9)内网DNS扮演的角色非常重要,一定要消灭code中出现的内网IP地址,很大程度减少因IP变更、服务器故障而修改源码的情况,同时也便于维护;
10)内网LB适用在内部WEB接口、多台数据库Slave、多台Nosql Slave、公共服务等应用的负载均衡,可以使用LVS、Haproxy来实现,可用性要求不高的应用可行直接使用Localhost DNS轮询;
11)hadoop适合海量数据的存储与处理,如做网站日志分析、用户数据挖掘等;
12)管理集群,平台的核心,运维的阵地;