1. 技术干货:SQL on Hadoop在快手大数据平台的实践与优化
快手大数据架构工程师钟靓近日在 A2M 人工智能与机器学习创新峰会分享了题为《SQL on Hadoop 在快手大数据平台的实践与优化》的演讲,主要从 SQL on Hadoop 介绍、快手 SQL on Hadoop 平台概述、SQL on Hadoop 在快手的使用经验和改进分析、快手 SQL on Hadoop 的未来计划四方面介绍了 SQL on Hadoop 架构。
SQL on Hadoop,顾名思义它是基于 Hadoop 生态的一个 SQL 引擎架构,我们其实常常听到 Hive、SparkSQL、Presto、Impala 架构。接下来,我会简单的描述一下常用的架构情况。
HIVE,一个数据仓库系统。它将数据结构映射到存储的数据中,通过 SQL 对大规模的分布式存储数据进行读、写、管理。
根据定义的数据模式,以及输出 Storage,它会对输入的 SQL 经过编译、优化,生成对应引擎的任务,然后调度执行生成的任务。
HIVE 当前支持的引擎类型有:MR、SPARK、TEZ。
基于 HIVE 本身的架构,还有一些额外的服务提供方式,比如 HiveServer2 与 MetaStoreServer 都是 Thrift 架构。
此外,HiveServer2 提供远程客户端提交 SQL 任务的功能,MetaStoreServer 则提供远程客户端操作元数据的功能。
Spark,一个快速、易用,以 DAG 作为执行模式的大规模数据处理的统一分析引擎,主要模块分为 SQL 引擎、流式处理 、机器学习、图处理。
SPARKSQL 基于 SPARK 的计算引擎,做到了统一数据访问,集成 Hive,支持标准 JDBC 连接。SPARKSQL 常用于数据交互分析的场景。
SPARKSQL 的主要执行逻辑,首先是将 SQL 解析为语法树,然后语义分析生成逻辑执行计划,接着与元数据交互,进行逻辑执行计划的优化,最后,将逻辑执行翻译为物理执行计划,即 RDD lineage,并执行任务。
PRESTO,一个交互式分析查询的开源分布式 SQL 查询引擎。
因为基于内存计算,PRESTO 的计算性能大于有大量 IO 操作的 MR 和 SPARK 引擎。它有易于弹性扩展,支持可插拔连接的特点。
业内的使用案例很多,包括 FaceBook、AirBnb、美团等都有大规模的使用。
我们看到这么多的 SQL on Hadoop 架构,它侧面地说明了这种架构比较实用且成熟。利用 SQL on Hadoop 架构,我们可以实现支持海量数据处理的需求。
查询平台每日 SQL 总量在 70 万左右,DQL 的总量在 18 万左右。AdHoc 集群主要用于交互分析及机器查询,DQL 平均耗时为 300s;AdHoc 在内部有 Loacl 任务及加速引擎应用,所以查询要求耗时较低。
ETL 集群主要用于 ETL 处理以及报表的生成。DQL 平均耗时为 1000s,DQL P50 耗时为 100s,DQL P90 耗时为 4000s,除上述两大集群外,其它小的集群主要用于提供给单独的业务来使用。
服务层是对上层进行应用的。在上层有四个模块,这其中包括同步服务、ETL 平台、AdHoc 平台以及用户程序。在调度上层,同样也有四方面的数据,例如服务端日志,对它进行处理后,它会直接接入到 HDFS 里,我们后续会再对它进行清洗处理;服务打点的数据以及数据库信息,则会通过同步服务入到对应的数据源里,且我们会将元数据信息存在后端元数据系统中。
网页爬取的数据会存入 hbase,后续也会进行清洗与处理。
HUE、NoteBook 主要提供的是交互式查询的系统。报表系统、BI 系统主要是 ETL 处理以及常见的报表生成,额外的元数据系统是对外进行服务的。快手现在的引擎支持 MR、Presto 及 Spark。
管理系统主要用于管理我们当前的集群。HiveServer2 集群路由系统,主要用于引擎的选择。监控系统以及运维系统,主要是对于 HiveServer2 引擎进行运维。
我们在使用 HiveServer2 过程中,遇到过很多问题。接下来,我会详细的为大家阐述快手是如何进行优化及实践的。
当前有多个 HiveServer2 集群,分别是 AdHoc 与 ETL 两大集群,以及其他小集群。不同集群有对应的连接 ZK,客户端可通过 ZK 连接 HiveServer2 集群。
为了保证核心任务的稳定性,将 ETL 集群进行了分级,分为核心集群和一般集群。在客户端连接 HS2 的时候,我们会对任务优先级判定,高优先级的任务会被路由到核心集群,低优先级的任务会被路由到一般集群。
BeaconServer 服务为后端 Hook Server 服务,配合 HS2 中的 Hook,在 HS2 服务之外实现了所需的功能。当前支持的模块包括路由、审计、SQL 重写、任务控制、错误分析、优化建议等。
•无状态,BeaconServer 服务支持水平扩展。基于请求量的大小,可弹性调整服务的规模。
•配置动态加载,BeaconServer 服务支持动态配置加载。各个模块支持开关,服务可动态加载配置实现上下线。比如路由模块,可根据后端加速引擎集群资源情况,进行路由比率调整甚至熔断。
•无缝升级,BeaconServer 服务的后端模块可单独进行下线升级操作,不会影响 Hook 端 HS2 服务。
•Hive 支持 SPARK 与 TEZ 引擎,但不适用于生产环境。
•SQL on Hadoop 的 SQL 引擎各有优缺点,用户学习和使用的门槛较高。
•不同 SQL 引擎之间的语法和功能支持上存在差异,需要大量的测试和兼容工作,完全兼容的成本较高。
•不同 SQL 引擎各自提供服务会给数仓的血缘管理、权限控制、运维管理、资源利用都带来不便。
•在 Hive 中,自定义实现引擎。
•自动路由功能,不需要设置引擎,自动选择适合的加速引擎。
•根绝规则匹配 SQL,只将兼容的 SQL 推给加速引擎。
•复用 HiveServer2 集群架构。
基于 HiveServer2,有两种实现方式。JDBC 方式是通过 JDBC 接口,将 SQL 发送至后端加速引擎启动的集群上。PROXY 方式是将 SQL 下推给本地的加速引擎启动的 Client。
JDBC 方式启动的后端集群,均是基于 YARN,可以实现资源的分时复用。比如 AdHoc 集群的资源在夜间会自动回收,作为报表系统的资源进行复用。
路由方案基于 HS2 的 Hook 架构,在 HS2 端实现对应 Hook,用于引擎切换;后端 BeaconServer 服务中实现路由 服务,用于 SQL 的路由规则的匹配处理。不同集群可配置不同的路由规则。
为了保证后算路由服务的稳定性,团队还设计了 Rewrite Hook,用于重写 AdHoc 集群中的 SQL,自动添加 LIMIT 上限,防止大数据量的 SCAN。
•易于集成,当前主流的 SQL 引擎都可以方便的实现 JDBC 与 PROXY 方式。再通过配置,能简单的集成新的查询引擎,比如 impala、drill 等。
•自动选择引擎,减少了用户的引擎使用成本,同时也让迁移变得更简单。并且在加速引擎过载 的情况下,可以动态调整比例,防止因过载 对加速性能的影响。
•自动降级,保证了运行的可靠性。SQL 路由支持 failback 模块,可以根据配置选择是否再路由引擎执行失败后,回滚到 MR 运行。
•模块复用,对于新增的引擎,都可以复用 HiveServer2 定制的血缘采集、权限认证、并发锁控制等方案,大大降低了使用成本。
•资源复用,对于 adhoc 查询占用资源可以分时动态调整,有效保证集群资源的利用率。
当查询完成后,本地会轮询结果文件,一直获取到 LIMIT 大小,然后返回。这种情况下,当有大量的小文件存在,而大文件在后端的时候,会导致 Bad Case,不停与 HDFS 交互,获取文件信息以及文件数据,大大拉长运行时间。
在 Fetch 之前,对结果文件的大小进行预排序,可以有数百倍的性能提升。
示例:当前有 200 个文件。199 个小文件一条记录 a,1 个大文件混合记录 a 与 test 共 200 条,大文件名 index 在小文件之后。
Hive 中有一个 SimpleFetchOptimizer 优化器,会直接生成 FetchTask,减小资源申请时间与调度时间。但这个优化会出现瓶颈。如果数据量小,但是文件数多,需要返回的条数多,存在能大量筛掉结果数据的 Filter 条件。这时候串行读取输入文件,导致查询延迟大,反而没起到加速效果。
在 SimpleFetchOptimizer 优化器中,新增文件数的判断条件,最后将任务提交到集群环境,通过提高并发来实现加速。
示例:读取当前 500 个文件的分区。优化后的文件数阈值为 100。
一个表有大量的子分区,它的 DESC 过程会与元数据交互,获取所有的分区。但最后返回的结果,只有跟表相关的信息。
与元数据交互的时候,延迟了整个 DESC 的查询,当元数据压力大的时候甚至无法返回结果。
针对于 TABLE 的 DESC 过程,直接去掉了跟元数据交互获取分区的过程,加速时间跟子分区数量成正比。
示例:desc 十万分区的大表。
•复用 split 计算的数据,跳过 rece 估算重复统计输入过程。输入数据量大的任务,调度速率提升 50%。
•parquetSerde init 加速,跳过同一表的重复列剪枝优化,防止 map task op init 时间超时。
•新增 LazyOutputFormat,有 record 输出再创建文件,避免空文件的产生,导致下游读取大量空文件消耗时间。
•statsTask 支持多线程聚合统计信息,防止中间文件过多导致聚合过慢,增大运行时间。
•AdHoc 需要打开并行编译,防止 SQL 串行编译导致整体延迟时间增大的问题。
HS2 启动时会对物化视图功能进行初始化,轮询整个元数据库,导致 HS2 的启动时间非常长,从下线状态到重新上线间隔过大,可用性很差。
将物化视图功能修改为延迟懒加载,单独线程加载,不影响 HS2 的服务启动。物化视图支持加载中获取已缓存信息,保证功能的可用性。
HS2 启动时间从 5min+提升至<5s。
HS2 本身上下线成本较高,需要保证服务上的任务全部执行完成才能进行操作。配置的修改可作为较高频率的操作,且需要做到热加载。
在 HS2 的 ThriftServer 层我们增加了接口,与运维系统打通后,配置下推更新的时候自动调用,可实现配置的热加载生效。
HiveServer2 的 scratchdir 主要用于运行过程中的临时文件存储。当 HS2 中的会话创建时,便会创建 scratchdir。在 HDFS 压力大的时候,大量的会话会阻塞在创建 scratchdir 过程,导致连接数堆积至上限,最终 HS2 服务无法再连入新连接,影响服务可用性。
对此,我们先分离了一般查询与 create temporay table 查询的 scratch 目录,并支持 create temporay table 查询的 scratch 的懒创建。当 create temporay table 大量创建临时文件,便会影响 HDFS NameNode 延迟时间的时候,一般查询的 scratchdir HDFS NameNode 可以正常响应。
此外,HS2 还支持配置多 scratch,不同的 scratch 能设置加载比率,从而实现 HDFS 的均衡负载。
Hive 调度其中存在两个问题。
一、子 Task 非执行状态为完成情况的时候,若有多轮父 Task 包含子 Task,导致子 Task 被重复加入调度队列。这种 Case,需要将非执行状态修改成初始化状态。
二、当判断子 Task 是否可执行的过程中,会因为状态检测异常,无法正常加入需要调度的子 Task,从而致使查询丢失 Stage。而这种 Case,我们的做法是在执行完成后,加入一轮 Stage 的执行结果状态检查,一旦发现有下游 Stage 没有完成,直接抛出错误,实现查询结果状态的完备性检查。
•HS2 实现了接口终止查询 SQL。利用这个功能,可以及时终止异常 SQL。
•metastore JDOQuery 查询优化,关键字异常跳过,防止元数据长时间卡顿或者部分异常查询影响元数据。
•增加开关控制,强制覆盖外表目录,解决 insert overwrite 外表,文件 rename 报错的问题。
•hive parquet 下推增加关闭配置,避免 parquet 异常地下推 OR 条件,导致结果不正确。
•executeForArray 函数 join 超大字符串导致 OOM,增加限制优化。
•增加根据 table 的 schema 读取分区数据的功能,避免未级联修改分区 schema 导致读取数据异常。
•部分用户并没有开发经验,无法处理处理引擎返回的报错。
•有些错误的报错信息不明确,用户无法正确了解错误原因。
•失败的任务排查成本高,需要对 Hadoop 整套系统非常熟悉。
•用户的错误 SQL、以及需要优化的 SQL,大量具有共通性。人力维护成本高,但系统分析成本低。
SQL 专家系统基于 HS2 的 Hook 架构,在 BeaconServer 后端实现了三个主要的模块,分别是 SQL 规则控制模块、SQL 错误分析模块,与 SQL 优化建议模块。SQL 专家系统的知识库,包含关键字、原因说明、处理方案等几项主要信息,存于后端数据库中,并一直积累。
通过 SQL 专家系统,后端可以进行查询 SQL 的异常控制,避免异常 SQL 的资源浪费或者影响集群稳定。用户在遇到问题时,能直接获取问题的处理方案,减少了使用成本。
示例:空分区查询控制。
SQL 专家系统能解决一部分 HS2 的任务执行的错误诊断需求,但是比如作业 健康 度、任务执行异常等问题原因的判断,需要专门的系统来解决,为此我们设计了作业诊断系统。
作业诊断系统在 YARN 的层面,针对不同的执行引擎,对搜集的 Counter 和配置进行分析。在执行层面,提出相关的优化建议。
作业诊断系统的数据也能通过 API 提供给 SQL 专家系统,补充用于分析的问题原因。
作业诊断系统提供了查询页面来查询运行的任务。以下是命中 map 输入过多规则的任务查询过程:
2. 大数据应用的实训目的万能版怎么写
分块书写。大数据实训教学大纲一、实训目标 基于Hadoop为核心,通过实猜橘训,达成以下目的,认识大数据,认识大数据技术在新时代对企业的重要性。大数据应用,是指大数据价值创造的关键在于大数据的应用,随着大数毕兆带据技术飞速发展,大手芦数据应用已经融入各行各业。
3. 什么是大数据分析Hadoop
要了解什么是Hadoop,我们必须首先了解与大数据和传统处理系统有关的问题。前进,我们将讨论什么是Hadoop,以及Hadoop如何解决与大数据相关的问题。我们还将研究CERN案例研究,以突出使用Hadoop的好处。
在之前的博客“ 大数据教程”中,我们已经详细讨论了大数据以及大数据的挑战。在此博客中,我们将讨论:
1、传统方法的问题
2、Hadoop的演变
3、Hadoop的
4、Hadoop即用解决方案
5、何时使用Hadoop?
6、什么时候不使用Hadoop?
一、CERN案例研究
大数据正在成为组织的机会。现在,组织已经意识到他们可以通过大数据分析获得很多好处,如下图所示。他们正在检查大型数据集,以发现所有隐藏的模式,未知的相关性,市场趋势,客户偏好和其他有用的业务信息。
这些分析结果正在帮助组织进行更有效的营销,新的收入机会,更好的客户服务。他们正在提高运营效率,与竞争对手组织相比的竞争优势以及其他业务利益。
什么是Hadoop –大数据分析的好处
因此,让我们继续前进,了解在兑现大数据机会方面与传统方法相关的问题。
二、传统方法的问题
在传统方法中,主要问题是处理数据的异构性,即结构化,半结构化和非结构化。RDBMS主要关注于银行交易,运营数据等结构化数据,而Hadoop则专注于文本,视频,音频,Facebook帖子,日志等半结构化,非结构化数据。RDBMS技术是一种经过验证的,高度一致,成熟的系统许多公司的支持。另一方面,由于大数据(主要由不同格式的非结构化数据组成)对Hadoop提出了需求。
现在让我们了解与大数据相关的主要问题是什么。因此,继续前进,我们可以了解Hadoop是如何成为解决方案的。
什么是Hadoop –大数据问题
第一个问题是存储大量数据。
无法在传统系统中存储大量数据。原因很明显,存储将仅限于一个系统,并且数据正在以惊人的速度增长。
第二个问题是存储异构数据。
现在,我们知道存储是一个问题,但是让我告诉您,这只是问题的一部分。由于我们讨论了数据不仅庞大,而且还以各种格式存在,例如:非结构化,半结构化和结构化。因此,您需要确保您拥有一个系统来存储从各种来源生成的所有这些种类的数据。
第三个问题是访问和处理速度。
硬盘容量正在增加,但磁盘传输速度或访问速度并未以相似的速度增加。让我以一个示例为您进行解释:如果您只有一个100 Mbps I / O通道,并且正在处理1TB数据,则大约需要2.91个小时。现在,如果您有四台具有一个I / O通道的计算机,则对于相同数量的数据,大约需要43分钟。因此,与存储大数据相比,访问和处理速度是更大的问题。
在了解什么是Hadoop之前,让我们首先了解一下Hadoop在一段时间内的发展。
Hadoop的演变
2003年,道格·切特(Doug Cutting)启动了Nutch项目,以处理数十亿次搜索并为数百万个网页建立索引。2003年10月下旬– Google发布带有GFS(Google文件系统)的论文。2004年12月,Google发布了MapRece论文。在2005年,Nutch使用GFS和MapRece进行操作。2006年,雅虎与Doug Cutting及其团队合作,基于GFS和MapRece创建了Hadoop。如果我告诉您,您会感到惊讶,雅虎于2007年开始在1000个节点的群集上使用Hadoop。
2008年1月下旬,雅虎向Apache Software Foundation发布了Hadoop作为一个开源项目。2008年7月,Apache通过Hadoop成功测试了4000个节点的集群。2009年,Hadoop在不到17小时的时间内成功整理了PB级数据,以处理数十亿次搜索并为数百万个网页建立索引。在2011年12月,Apache Hadoop发布了1.0版。2013年8月下旬,发布了2.0.6版。
当我们讨论这些问题时,我们发现分布式系统可以作为解决方案,而Hadoop提供了相同的解决方案。现在,让我们了解什么是Hadoop。
三、什么是Hadoop?
Hadoop是一个框架,它允许您首先在分布式环境中存储大数据,以便可以并行处理它。 Hadoop中基本上有两个组件:
1、大数据Hadoop认证培训
2、讲师指导的课程现实生活中的案例研究评估终身访问探索课程
什么是Hadoop – Hadoop即解决方案
第一个问题是存储大数据。
HDFS提供了一种分布式大数据存储方式。您的数据存储在整个DataNode的块中,您可以指定块的大小。基本上,如果您拥有512MB的数据,并且已经配置了HDFS,那么它将创建128MB的数据块。 因此,HDFS将数据分为512/128 = 4的4个块,并将其存储在不同的DataNode上,还将在不同的DataNode上复制数据块。现在,由于我们正在使用商品硬件,因此存储已不是难题。
它还解决了缩放问题。它着重于水平缩放而不是垂直缩放。您始终可以根据需要随时在HDFS群集中添加一些额外的数据节点,而不是扩展DataNodes的资源。让我为您总结一下,基本上是用于存储1 TB的数据,您不需要1 TB的系统。您可以在多个128GB或更少的系统上执行此操作。
下一个问题是存储各种数据。
借助HDFS,您可以存储各种数据,无论是结构化,半结构化还是非结构化。由于在HDFS中,没有预转储模式验证。并且它也遵循一次写入和多次读取模型。因此,您只需写入一次数据,就可以多次读取数据以寻找见解。
Hird的挑战是访问和处理数据更快。
是的,这是大数据的主要挑战之一。为了解决该问题,我们将处理移至数据,而不是将数据移至处理。这是什么意思?而不是将数据移动到主节点然后进行处理。在MapRece中,处理逻辑被发送到各个从属节点,然后在不同的从属节点之间并行处理数据。然后,将处理后的结果发送到主节点,在该主节点上合并结果,并将响应发送回客户端。
在YARN架构中,我们有ResourceManager和NodeManager。ResourceManager可能会或可能不会与NameNode配置在同一台机器上。 但是,应该将NodeManager配置在存在DataNode的同一台计算机上。
YARN通过分配资源和安排任务来执行您的所有处理活动。
什么是Hadoop – YARN
它具有两个主要组件,即ResourceManager和NodeManager。
ResourceManager再次是主节点。它接收处理请求,然后将请求的各个部分相应地传递到相应的NodeManager,什么是大数据分析Hadoop在此进行实际处理。NodeManager安装在每个DataNode上。它负责在每个单个DataNode上执行任务。
我希望现在您对什么是Hadoop及其主要组件有所了解。让我们继续前进,了解何时使用和何时不使用Hadoop。
何时使用Hadoop?
Hadoop用于:
1、搜索 – Yahoo,亚马逊,Zvents
2、日志处理 – Facebook,雅虎
3、数据仓库 – Facebook,AOL
4、视频和图像分析 –纽约时报,Eyealike
到目前为止,我们已经看到了Hadoop如何使大数据处理成为可能。但是在某些情况下,不建议使用Hadoop。
4. 大数据 hadoop 三种运行模式的区别、及详细配置讲解
基于Hadoop进行开发时,有时候会被Hadoop的运行模式弄得晕头转向,傻傻分不清各种运行模式的区别,给日常开发带来很多困惑,不同集群配置文件也各不相不同。弄明白Hadoop的运行模式和对配置文件的作用要做到心中明了,在工作中才能得手顺心。
hadoop的配置文件均以XML文件进行配置,它有四个最常见的配置文件,分别为:
core-site.xml文件主要用于配置通用属性。
hdfs-site.xml文件用于配置Hdfs的属性。
mapred-site.xml文件用于配置Maprece的属性。
yarn-site.xml文件用于配置Yarn的属性。
一般来说,这四种配置文件都存储在hadoop默认的安装目录etc/hadoop子目录中。 不过我们也可以在搭建集群时根据实际需求,把etc/hadoop目录和其下的文件复制到另外一个位置。这样可以把配置文件和安装文件分离开来,方便管理。
注意:如果把etc/hadoop目录和其下的文件复制到另外一个位置。
我们需要在环境变量中将hadoop_conf_dir设置成指向新目录。
1、本地运行模式
无需任何守护进程 ,所有的程序都运行在同一个JVM上执行。在本地模式下调试MR程序非常高效方便,一般该模式主要是在学习或者开发阶段调试使用 。
2、伪分布式模式
Hadoop守护进程运行在本地机器上 ,模拟一个小规模的集群,换句话说,可以配置一台机器的Hadoop集群,伪分布式是完全分布式的一个特例。
3、完全分布式模式
Hadoop守护进程运行在一个集群上 。这种运行模式也就是我们常见的各种云,主要用于大规模的生产环境中。
注意:分布式要启动守护进程 ,是指在使用分布式hadoop时,要先启动一些准备程序进程,然后才能使用。 比如start-dfs.sh start-yarn.sh,而本地模式不需要启动这些守护进程。
注意:在本地模式下,将使用本地文件系统和本地MapRece运行器。在分布式模式下,将启动HDFS和YARN守护进程。
5. Hadoop常见问题解答
Hadoop常见问题解答
(1)Hadoop适不适用于电子政务?为什么?
电子政务是利用互联网技术实现政府组织结构和工作流程的重组优化,建成一个精简、高效、廉洁、公平的政府运作信息服务平台。因此电子政务肯定会产生相关的大量数据以及相应的计算需求,而这两种需求涉及的数据和计算达到一定规模时传统的系统架构将不能满足,就需要借助海量数据处理平台,例如Hadoop技术,因此可以利用Hadoop技术来构建电子政务云平台。
总结一下,任何系统没有绝对的适合和不适合,只有当需求出现时才可以决定,在一个非常小的电子政务系统上如果没有打数据处理以及计算分析需求时就不需要hadoop这样的技术,而实际上,商用的电子政务平台往往涉及到大规模的数据和大量的计算分析处理需求,因此就需要Hadoop这样的技术来解决。(2)hadoop对于实时在线处理有优势吗?
直接使用hadoop进行实时处理时没有优势的,因为Hadoop主要解决的是海量批处理作业计算问题,但是可以使用基于Hadoop的分布式NOSQL系统HBase系统以及相关实时处理系统:
1. 基于Hadoop的HBase可以做到实时处理以及相关需求的实时计算,主要解决海量<key,value>相关查询计算等需求。
2. 可以考虑Spark计算,Spark是基于共现内存RDD的系统,比Hadoop更快,时候迭代式计算,例如数据挖掘,机器学习算法等。
3. 还有Storm,Storm是一个免费开源、分布式、高容错的实时计算系统,Storm经常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。
4. 考虑S4, S4是Yahoo!在2010年10月开源的一套通用、分布式、可扩展、部分容错、具备可插拔功能的平台。这套平台主要是为了方便开发者开发处理流式数据(continuous unbounded streams of data)的应用。
你可以依据实际的需求来选择合适的系统。
(3)Hadoop存储海量数据没有问题,但是如何能够做到海量数据的实时检索?
1,可以结合开源的搜索引擎Apache Lucene,Solr 或ElasticSearch
2,海量数据的实时检索可以考虑HBase,建议可以使用hadoop将数据构建成以查询key为键的数据集,然后将<key, value>集合写入Hbase表中,Hbase会自动以key为键进行索引,在数十亿甚至以上的级别下,查询key的value响应时间也估计再10毫秒内。
如果检索条件是多个组合的情况下,可以适当的设计多个hbase表格,这样的检索也是很快的,同时Hbase也是支持二级索引。在符合条件下查询,Hbase也是支持MapRece的,如果对响应时间要求不高的情况下,可以考虑将hive和Hbase系统结合来使用。
如果数据量不是很大的情况下也可以考虑支持类似SQL的NOSLQ系统。
(4)能不能给点hadoop的学习方法以及学习规划,hadoop系统有点庞大,感觉无从学起?
首先搞清楚什么是hadoop以及hadoop可以用来做什么?
然后,可以从最经典的词频统计程序开始,初步了解MapRece的基本思路和处理数据的方式。
接着,就可以正式学习hadoop的基本原理,包括HDFS和MapRece,先从整体,宏观核心原理看,先别看源码级别。
进一步,就可以深入HDFS和MapRece和模块细节,这个时候可以结合源码深入理解,以及实现机制。
最后就是需要实战了,可以结合自己的项目或者相关需求来完成一些hadoop相关应用。
(5) 大的文件拆分成很多小的文件后,怎样用Hadoop进行高效的处理这些小文件?以及怎样让各个节点尽可能的负载均衡?
1. 怎样用Hadoop进行高效的处理这些小文件?
你这个问题提的很好,hadoop在处理大规模数据时是很高效的,但是处理大量的小文件时就会因为系统资源开销过大而导致效率较低,针对这样的问题,可以将小文件打包为大文件,例如使用SequcenFile文件格式,例如以文件签名为key,文件内容本身为value写成SequcenFile文件的一条记录,这样多个小文件就可以通过SequcenFile文件格式变为一个大文件,之前的每个小文件都会映射为SequcenFile文件的一条记录。
2. 怎样让各个节点尽可能的负载均衡?
在hadoop集群中负载均衡是非常关键的,这种情况的导致往往是因为用户的数据分布的并不均衡,而计算资源槽位数确实均衡分布在每个节点,这样在作业运行时非本地任务会有大量的数据传输,从而导致集群负载不均衡,因此解决不均衡的要点就是将用户的数据分布均衡,可以使用hadoop内置的balancer脚本命令。
对于因为资源调度导致的不均衡则需要考虑具体的调度算法和作业分配机制。
(6)c/c++ 程序员如何入门Hadoop到深入了解,并在linux服务器上布置运用,有没有方向性的指导?
针对C/C++用户,Hadoop提供了hadoop streaming接口和pipes接口,hadoop streaming接口以标准输入和标准输出作为用户程序和hadoop框架交互的中间件,pipes这是专门针对C/C++语言的接口,以socket作为同学中介。
从使用上建议从streaming入手,pipes相比streaming问题比较多,而且pipes调试不容易。
(7)现在企业中使用Hadoop版本主要是1.x还是2.x?
目前网络,腾讯,阿里为主的互联网公司都是以hadoop 1.X为基准版本的,当然每个公司都会进行自定义的二次开发以满足不同的集群需求。
2.X在网络内部还没有正式使用,还是以1.X为主,不过网络针对1.X的问题开发了HCE系统(Hadoop C++ Expand系统)
补充,Hadoop2.x在其他公司应用的很多,比如京东
(8)以后想从事大数据方面工作,算法要掌握到什么程度,算法占主要部分吗?
首先,如果要从事大数据相关领域的话,hadoop是作为工具来使用的,首先需要掌握使用方法。可以不用深入到hadoop源码级别细节。
然后就是对算法的理解,往往需要设计到数据挖掘算法的分布式实现,而算法本身你还是需要理解的,例如常用的k-means聚类等。
(9)现在spark,storm越来越火,谷歌也发布了Cloud Dataflow,是不是Hadoop以后主要应该学习hdfs和yarn,而且以后Hadoop程序员的主要做的就是把这些东西打包,只提供接口让普通的程序员也能使用,就像Cloudera和Google一样?
这位同学,你多虑了,hadoop和spark, strom是解决不同的问题,不存在哪个好那个坏,要学习Hadoop还是以主流的hadoop-1.X为版本,2.X最主要的就是多了yarn框架,很好理解的。
如果你是hadoop本身研发建议都看,如果你是hadoop应用相关研发,看主流的1.X就行,我的书《Hadoop核心技术》是以主流的1.X为版本讲解的,有兴趣可以看看。
(10)小白问一句,大数据处理都是服务器上安装相关软件吗,对程序有什么影响呢,集群、大数据是属于运维的工作内容还是攻城狮的呢?
传统的程序只能运行在单机上,而大数据处理这往往使用分布式编程框架编写,例如hadoop maprece,只能运行在hadoop集群平台上。
运维的责任:保证集群,机器的稳定性和可靠性
hadoop系统本身研发:提高Hadoop集群的性能,增加新功能。
大数据应用:把hadoop作为工具,去实现海量数据处理或者相关需求。
(11)学习hadoop该怎么入手呢?应该做一些什么样的项目呢?
可以参考我上面的几个回答,可以从最简单词频统计程序入手,然后学习理解HDFS和MapRece的基本原理和核心机制,如果仅仅把Hadoop作为一个工具来使用的话这样就可以了,最重要的就是实战了,可以尝试使用Hadoop处理一些数据,例如做日志分析,数据统计,排序,倒排索引等典型应用。
(12)100个以上hadoop节点,一般怎么开发,运维?任务很多的情况下任务资源怎么分配,任务执行顺序是定时脚本还是别的什么方式控制?
1. 首先大数据的应用开发和hadoop集群的规模是没有关系,你指的是集群的搭建和运维吗,对于商用的hadoop系统来说涉及到很多东西,建议参考《hadoop核心技术》实战篇 “第10章Hadoop集群搭建 ” 章节。
2. 任务的分配是有hadoop的调度器的调度策略决定的,默认为FIFO调度,商业集群一般使用多队列多用户调度器,可以参考参考《hadoop核心技术》高级篇 “第9章Hadoop作业调度系统” 章节。
3. 任务的执行顺序是有用户控制的,你自然可以定时启动,也可以手动启动。
(13)基于Hadoop做开发,是否必须会使用java,使用其他开发语言是否无法更好的融入整个Hadoop的开发体系?
基于Hadoop做开发可以使用任何语言,因为hadoop提高了streaming编程框架和pipes编程接口,streaming框架下用户可以使用任何可以操作标准输入输出的计算机语言来开发hadoop应用。
(14)在rece阶段老是卡在最后阶段很长时间,在网上查的说是有可能是数据倾斜,我想问这个有啥解决方法吗?
1,你这个就是数据倾斜啊 好多数据都集中在一个rece里 其他rece里分配的数据比较少 默认情况下决定哪些数据分配到哪个rece是由rece个数和partiiton分区决定的 默认是对key进行hash运算 一般情况下用mapreuce倾斜很少 除非你用的HIVE
2,rece分为3个子阶段:shuffle、sort和rece,如果rece整个过程耗时较长,建议先看一下监控界面是卡在哪个阶段,如果是卡在shuffle阶段往往是网络阻塞问题,还有就是某rece数据量太大,也就是你所说的数据倾斜问题,这种问题往往因为某个key的value太多,解决方法是:第一,默认的partiiton可能不适合你的需求,你可以自定义partiiton;第二就是在map端截断,尽量让达到每个rece端的数据分布均匀。
(15)非大数据的项目能否用hadoop?
非大数据项目是否可以用Hadoop的关键问题在于是否有海量数据的存储,计算,以及分析挖掘等需求,如果现有系统已经很好满足当前需求那么就没有必要使用Hadoop,没有必要使用并不意味这不能使用Hadoop,很多传统系统能做的Hadoop也是可以做的,例如使用HDFS来代替LINUX NFS,使用MapRece来代替单服务器的统计分析相关任务,使用Hbase代替Mysql等关系数据库等,在数据量不大的情况下通常Hadoop集群肯定比传统系统消耗更多的资源。
(16)hadoop maprece 和第三方资源管理调度系统如何集成?
Hadoop的调度器设计的一个原则就是可插拔式调度器框架,因此是很容易和第三方调度器集成的,例如公平调度器FairScheler和容量调度器CapacityScheler,并配置mapred-site.xml的maprece.jobtracker.taskscheler以及调度器本身的配置参数,例如公平调度器控制参数则需要编辑fair- scheler.xml进行配置,具体可以参考我的新书《Hadoop核心技术》实战篇第十章节10.11的集群搭建实例中的10.10.9 配置第三方调度器,同时可以进一步深入学习第9章 Hadoop作业调度系统,在这一章中会详细介绍各种第三方调度器以及使用配置方法。
6. 大数据初学者需要看看哪些Hadoop问题及解决方案
相信大家在学习大数据hadoop的时候肯定会遇到各种各样的问题,这篇文章就是介绍一些常的问题及如何解决的办法。
1、namenode无法启动,不报错
可能原因是:之前用root启动过,导致current文件夹的权限和所属更改了,需要更改回来
解决:current文件夹位于hadoop安装目录同级目录的tmp/dfs/namesecondary
2、WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
原因:查看本地文件:
[root@db96 hadoop]# file /usr/local/hadoop/lib/native/libhadoop.so.1.0.0
/usr/local/hadoop/lib/native/libhadoop.so.1.0.0: ELF 32-bit LSB shared object,
Intel 80386, version 1 (SYSV), dynamically linked, not stripped
是32位的hadoop,安装在了64位的linux系统上。lib包编译环境不一样,所以不能使用。
解决:重新编译hadoop.就是重新编译hadoop软件。
3、Hadoop 报错be replicated to 0 nodes, instead of 1
原因(1)namespaceid不相同(2)没有足够的硬盘
解决(1)停止datanode(2)删除datadir下所有数据。(3)重启datanode
4、The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
原因:由日志可以看出无法删除/home/hadoop/tmp/mapred/system.(其实这只是一种假象,往往我们会去纠结于这个目录,其实不然)
解决:
(1):终极办法强制退出安全模式(safemode)
hadoop dfsadmin -safemode leave
这种方式虽然快,但会有遗留问题,我在用habse的时候就遇到过,很麻烦,然后你就用“hadoop fsck /”工具慢慢恢复吧。
(2):删除namenode下/home/hadoop/tmp下的所有文件,重新format,当然这种方式非常暴力,因为你的数据完全木有了
(3):参考源码可发现这个错误是在检查file的时候抛出来的,基本也就是file的block丢失、错误等原因造成的。
这种情况在副本数为1的情况下会很棘手,其他的时候hadoop基本能自行解决,错误数很多的情况下就会一直处于safemode下,当然你关于集群修改配置文件后的分发,本人写了一个配置文件分发工具可以强制离开安全模式,先保证正常读写,然后再启用“hadoop fsck /”工具慢慢修复。
5、Access denied for user 'root'@'hadoop1master' (using password: YES)
原因:没有除本地用户的其他用户远程连接
解决:修改mysql表,将localhost修改为%
6、运行本地的wordcount报错
该错误是缺少hadoop.dll(hadoop2.6.0编译的版本)文件,需要将hadoop.dll拷贝到hadoop2.6.0/bin目录下。
再次运行没有报错。
7、运行api的时候报了权限问题,使用的是hadoop,而我们想使用root
原因:配置环境变量中设置了HADOOP_USER_NAME=hadoop或者在run configuration中设置的-DHADOOP_USER_NAME=hadoop
解决:将配置环境变量中设置成HADOOP_USER_NAME=root或者在run configuration中设置的-DHADOOP_USER_NAME=root
8、org.apache.hadoop.dfs.SafeModeException:Name node is in safe mode安全模式
解决方法:bin/hadoop dfsadmin -safemode leave也就是关闭Hadoop的安全模式,这样问题就解决了。
9、用java -jar执行hadoop的job报错
原因:用hadoop的maprece变成,在执行的时候需要依赖hadoop的大部分依赖,所以上述错误是缺少hadoop的依赖包
解决:(1)建议使用hadoop -jar 执行job(2)如果使用java -jar,需要使用java -cp 把hadoop依赖的所有jar拼接到路径里面去(3)如果使用java -jar,另一种是在打包的时候把hadoop依赖的jar一起打包进去
10、运行mr程序报UnsatisfiedLinkError:nativeio.NativeIO$Windows.access0(Ljava/lang/String
一般这个问题是由本地hadoop环境变量照成的。需要设置hadoop_home变量的值。注意hadoop安装目录下,bin目录中缺少hadoop.dll和winutils.exe等动态库。还要增加bin目录到path路径。另外编辑器需要添加hadoop环境 还要注意jdk等是否正确安装。
11、在使用hdfs的fromlocal上传文件到hdfs时,爆出本地文件找不到异常,但是查看本地文件确实存在
原因:windows设置了隐藏已知文件的扩展名功能,导致上传的文件没有写扩展名
解决:在上传文件的地方添加上扩展名即可。
12、在执行hadoop-deamon.sh start xxx时报错
原因:启动的时候,节点名写错了
解决:修改名字,名字有, namenode datanode等
13、hadoop 8088 看不到maprece 任务的执行状态,无数据显示
解决方法:
(1)首先检查自己的集群中配置$HADOOP_HOME/conf/mapred-site.xml是否存在。
其中的maprece.framework.name是否配置。
(2)如果还不行的话,请在$HADOOP_HOME/conf/mapred-site.xml中原来的配置文件基础之上再添加下面
property>
property>
14、security.AccessControlException: Access denied for user sunqw. Superuser privilege is required
解决方法:
方式一:
在系统环境变量中增加HADOOP_USER_NAME,其值为root;
或者 通过java程序动态添加,如下:
?1System.setProperty("HADOOP_USER_NAME", "root");
方式二:
使用Eclipse在非hadoop运行下进行写入hdfs文件系统中时,由于sunqw对"/"目录没有写入权限,所以导致异常的发生。解决方法即开放hadoop中的HDFS目录的权限,命令如下:hadoop fs -chmod 777 / 。
方式三:
修改hadoop的配置文件:conf/hdfs-core.xml,添加或者修改 dfs.permissions 的值为 false。
方式四:
将Eclipse所在机器的名称修改为root,即与服务器上运行hadoop的名称一致。