大数据学习路线

一、大数据处理流程上图是一个简化的大数据处理流程图,大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。下面我们逐一对各个环节所需要的技术栈进行讲解: 1.1 数据收集大数据处理的第一步是数据的收集。现在的中大型项目通常采用微服务架构进行分布式部署,所以数据的采集需要在多台服务器上进行,且采集过程不能影响正常业务的开展。基于这种需求,就衍生了多种日志收集工具,如 Flume 、Logstash、Kibana 等,它们都能通过简单的配置完成复杂的数据收集和数据聚合。 1.2 数据存储收集到数据后,下一个问题就是:数据该如何进行存储?通常大家最为熟知是 MySQL、Oracle 等传统的关系型数据库,它们的优点是能够快速存储结构化的数据,并支持随机访问。但大数据的数据结构通常是半结构化(如日志数据)、甚至是非结构化的(如视频、音频数据),为了解决海量半结构化和非结构化数据的存储,衍生了 Hadoop HDFS 、KFS、GFS 等分布式文件系统,它们都能够支持结构化、半结构和非结构化数据的存储,并可以通过增加机器进行横向扩展。 分布式文件系统完美地解决了海量数据存储的问题,但是一个优秀的数据存储系统需要同时考虑数据存储和访问两方面的问题,比如你希望能够对数据进行随机访问,这是传统的关系型数据库所擅长的,但却不是分布式文件系统所擅长的,那么有没有一种存储方案能够同时兼具分布式文件系统和关系型数据库的优点,基于这种需求,就产生了 HBase、MongoDB。 1.3 数据分析大数据处理最重要的环节就是数据分析,数据分析通常分为两种:批处理和流处理。 批处理:对一段时间内海量的离线数据进行统一的处理,对应的处理框架有 Hadoop MapReduce、Spark、Flink 等;流处理:对运动中的数据进行处理,即在接收数据的同时就对其进行处理,对应的处理框架有 Storm、Spark Streaming、Flink Streaming等。批处理和流处理各有其适用的场景,时间不敏感或者硬件资源有限,可以采用批处理;时间敏感和及时性要求高就可以采用流处理。随着服务器硬件的价格越来越低和大家对及时性的要求越来越高,流处理越来越普遍,如股票价格预测和电商运营数据分析等。 上面的框架都是需要通过编程来进行数据分析,那么如果你不是一个后台工程师,是不是就不能进行数据的分析了?当然不是,大数据是一个非常完善的生态圈,有需求就有解决方案。为了能够让熟悉 SQL 的人员也能够进行数据的分析,查询分析框架应运而生,常用的有 Hive 、Spark SQL 、Flink SQL、 Pig、Phoenix 等。这些框架都能够使用标准的 SQL 或者 类SQL 语法灵活地进行数据的查询分析。这些 SQL 经过解析优化后转换为对应的作业程序来运行,如 Hive 本质上就是将 SQL 转换为 MapReduce 作业,Spark SQL 将 SQL 转换为一系列的 RDDs 和转换关系(transformations),Phoenix 将 SQL 查询转换为一个或多个HBase Scan。 1.4 数据应用数据分析完成后,接下来就是数据应用的范畴,这取决于你实际的业务需求。比如你可以将数据进行可视化展现,或者将数据用于优化你的推荐算法,这种运用现在很普遍,比如短视频个性化推荐、电商商品推荐、头条新闻推荐等。当然你也可以将数据用于训练你的机器学习模型,这些都属于其他领域的范畴,都有着对应的框架和技术栈进行处理,这里就不一一赘述。 1.5 其他框架上面是一个标准的大数据处理流程所用到的技术框架。但是实际的大数据处理流程比上面复杂很多,针对大数据处理中的各种复杂问题分别衍生了各类框架: 单机的处理能力都是存在瓶颈的,所以大数据框架都是采用集群模式进行部署,为了更方便的进行集群的部署、监控和管理,衍生了 Ambari、Cloudera Manager 等集群管理工具;想要保证集群高可用,需要用到 ZooKeeper ,ZooKeeper 是最常用的分布式协调服务,它能够解决大多数集群问题,包括首领选举、失败恢复、元数据存储及其一致性保证。同时针对集群资源管理的需求,又衍生了 Hadoop YARN ;复杂大数据处理的另外一个显著的问题是,如何调度多个复杂的并且彼此之间存在依赖关系的作业?基于这种需求,产生了 Azkaban 和 Oozie 等工作流调度框架;大数据流处理中使用的比较多的另外一个框架是 Kafka,它可以用于消峰,避免在秒杀等场景下并发数据对流处理程序造成冲击;另一个常用的框架是 Sqoop ,主要是解决了数据迁移的问题,它能够通过简单的命令将关系型数据库中的数据导入到 HDFS 、Hive 或 HBase 中,或者从 HDFS 、Hive 导出到关系型数据库上。二、学习路线介绍完大数据框架,接着就可以介绍其对应的学习路线了,主要分为以下几个方面: ...

July 4, 2019 · 2 min · jiezi

为何零基础也可学习大数据技术

随着大数据在国内的发展,大数据相关人才出现了供不应求的状况,大数据分析师更是被媒体称为“未来发展前景良好的职业之一”。大数据分析师的薪酬比同等级职位高20%。而如何成为大数据时代的弄潮儿,掌握当下紧缺的软件技能是关键,那么,零基础该怎样学习大数据呢? 大数据作为当下呼声特别高的IT技术,想学大数据的朋友已经从一个变成两个,从两个变成三个,但是计数单位,也是从个到百到千到万,接下来还可能更高。大数据的学习容易吗?门槛低,想学的都可以展开大数据的学习,那么该怎么入门呢? 1 何谓大数据 其实简单的来说,大数据就是通过分析和挖掘全量的非抽样的数据辅助决策。 大数据可以实现的应用可以概括为两个方向,一个是精准化定制,第二个是预测。比如像通过搜索引擎搜索同样的内容,每个人的结果却是大不相同的。再比如精准营销、百度的推广、淘宝的喜欢推荐,或者你到了一个地方,自动给你推荐周边的消费设施等等。 在这里还是要推荐下我自己建的大数据学习交流群:251956502,群里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据软件开发相关的),包括我自己整理的一份最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴加入。 2 零基础学大数据好不好学 随着大数据行业的快速发展,也随之出现了一些问题,比如大数据人才的缺失就是目前急需解决的一个问题,那么很多学大数据的人又出现了一些问题,就是大家普遍担心的就是零基础能不能学习大数据,会不会不好学? 零基础的人要不要去大数培训机构学习大数据开发吗?答案是可以的去。大数据学习并不是高深莫测的,虽然对于零基础学员来说不是那么简单,但是只要你认真学习,加上有专业老师的指导和针对性的训练,相信你也是可以完全掌握大数据的。 3 零基础学大数据四步走 零基础的同学学习大数据开发不能急于求成,要分阶段分步骤来一步步完成,大概可以分为四步: 第一个阶段:了解大数据的基本概念 首先,学习一门课程的时候,要对这门课程有一个简单的了解,比如说,要先学习这门课程的一些专业的术语,学习一些入门概念知道这么课程是做什么的,主要的学习知识有哪些。那么学习大数据就必须知道什么是大数据,一般大数据的运用领域是那些,避免自己在对大数据一无所知的情况下就开始盲目学习。 第二个阶段:学习计算机的编程语言 对于零基础的小伙伴们来说,开始入门可能并不是那么容易,需要学习大量的理论知识,阅读枯燥的教材。因为要掌握一门计算机编程语言,还是很难的。大家都知道计算机编程语言有很多,比如:R,C++,Python,Java等等。 第三阶段:大数据有关的学习课程 经过了前两阶段的基础学习后,我们对编程语言也基本掌握了,接下来就可以进行大数据部分的课程学习了。在这里小编要特别提醒大家:行业真正大数据,82%主讲都是hadoop、spark生态体系、storm实时开发,初学者请务必认清你要学的是不是真正大数据! 第四个阶段:项目实战阶段 实战训练可以帮助我们更好的理解所学的内容,同时对相关知识加强记忆。在以后的实际运用中,可以更快的上手,对于相关知识的使用方法也有了经验。 世上无难事只怕有心人,无论你是有基础也好还是没基础也好,只要你认真学习大数据就一定会学好。 最后:后续提高 大数据结合人工智可以达到真正的数据科学家。 机器学习:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。机器学习的算法基本比较固定了,学习起来相对容易。 深度学习:深度学习的概念源于人工神经网络的研究,最近几年发展迅猛。深度学习应用的实例有AlphaGo、人脸识别、图像检测等。是国内外稀缺人才,但是深度学习相对比较难,算法更新也比较快,需要跟随有经验的老师学习。 最快的学习方法,就是师从行业专家,毕竟老师有多年积累的经验,自己少走弯路达到事半功倍的效果。

July 4, 2019 · 1 min · jiezi

如何进入大数据领域学习路线是什么

小白如何学习大数据技术?大数据怎么入门?大数据的应用前景等等问题,已成为热门大数据领域热门问题,今天小编就来为大家具体解答一下关于大数据学习的相关问题。 随着大数据行业的快速发展,也随之出现了一些问题,比如大数据人才的缺失就是目前急需解决的一个问题,那么很多学大数据的人又出现了一些问题,就是大家普遍担心的就是零基础能不能学习大数据,会不会不好学? 答案是可以学。大数据学习并不是高深莫测的,虽然对于零基础学员来说不是那么简单,但是只要你认真学习,加上有专业老师的指导和针对性的训练,相信你也是可以完全掌握大数据的。 .在入门学习大数据的过程当中有遇见学习,行业,缺乏系统学习路线,系统学习规划,欢迎你加入我的大数据学习交流裙:251956502 ,裙文件有我这几年整理的大数据学习手册,开发工具,PDF文档书籍,你可以自行下载。 如果你是刚刚学习大数据,很迷茫,不知道如何开始, 零基础学大数据四步骤 零基础的同学学习大数据开发不能急于求成,要分阶段分步骤来一步步完成,大概可以分为四步: 第一个阶段:了解大数据的基本概念 首先,学习一门课程的时候,要对这门课程有一个简单的了解,比如说,要先学习这门课程的一些专业的术语,学习一些入门概念知道这么课程是做什么的,主要的学习知识有哪些。那么学习大数据就必须知道什么是大数据,一般大数据的运用领域是那些,避免自己在对大数据一无所知的情况下就开始盲目学习。 第二个阶段:学习计算机的编程语言 对于零基础的小伙伴们来说,开始入门可能并不是那么容易,需要学习大量的理论知识,阅读枯燥的教材。因为要掌握一门计算机编程语言,还是很难的。大家都知道计算机编程语言有很多,比如:R,C++,Python,Java等等。 第三阶段:大数据有关的学习课程 经过了前两阶段的基础学习后,我们对编程语言也基本掌握了,接下来就可以进行大数据部分的课程学习了。在这里小编要特别提醒大家:行业真正大数据,82%主讲都是hadoop、spark生态体系、storm实时开发,初学者请务必认清你要学的是不是真正大数据! 第四个阶段:项目实战阶段 实战训练可以帮助我们更好的理解所学的内容,同时对相关知识加强记忆。在以后的实际运用中,可以更快的上手,对于相关知识的使用方法也有了经验。 世上无难事只怕有心人,无论你是有基础也好还是没基础也好,只要你认真学习大数据就一定会学好。 后续提高 大数据结合人工智可以达到真正的数据科学家。 机器学习:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。机器学习的算法基本比较固定了,学习起来相对容易。 深度学习:深度学习的概念源于人工神经网络的研究,最近几年发展迅猛。深度学习应用的实例有AlphaGo、人脸识别、图像检测等。是国内外稀缺人才,但是深度学习相对比较难,算法更新也比较快,需要跟随有经验的老师学习。

July 3, 2019 · 1 min · jiezi

4个步骤带你搞定大数据Linux到大数据学习路线资料绝对必看

Linux学习路线图 运维学习需要分为四个阶段: ①linux初级入门 ②linux中级进阶 ③linux高级提升 ④资深方向细化。 第一阶段:初级入门 Linux基础知识、基本命令(起源、组成、常用命令如cp、ls、file、mkdir等常见操作命令)Linux用户及权限基础Linux系统进程管理进阶Linux高效文本、文件处理命令(vim、grep、sed、awk、find等命令)第二阶段:中级进阶(基础运维) 中级进阶需要在充分了解linux原理和基础知识之后,对上层的应用和服务进行深入学习。 TCP/IP网络基础(差不多CCNA、NP的知识就够用)Linux企业常用服务(如dns、http、ftp、mail、nfs等)Linux企业级安全原理和防范技巧(系统性能/安全、安全威胁模型和保护方法加密/解密原理及数据安全、系统服务访问控制及服务安全基础iptables安全策略构建shell脚本进阶(主要是结合一些应用,写一些案例)MySQL应用原理及管理入门(能管理和搭建一个个人博客站点).在入门学习大数据的过程当中有遇见学习,行业,缺乏系统学习路线,系统学习规划,欢迎你加入我的大数据学习交流裙:251956502 ,裙文件有我这几年整理的大数据学习手册,开发工具,PDF文档书籍,你可以自行下载。第三阶段:高级运维 http服务代理缓存加速(其中主要学习varnish、nginx缓存系统,要对CDN的知识有所了解。)企业级负载集群(其中主要学习nginx、haproxy、lvs要对主要知识熟练掌握,对负载均衡算法有清晰认识,)企业级高可用集群 (其中需要对keepalived,heartbeat等进行深入讲解)运维监控zabbix详解(主要是zabbix、cacti、nagios等监控系统,现在用的比较多的是zabbix)运维自动化学习(需要学一些开源运维自动化工具的使用如ansible、puppet、cobbler等运维自动化工具)第四阶段:资深方向 大数据方向(需要对hadoop、storm等常见开源大数据系统需要深入了解)云计算方向(主要是openstack这套东西,当然像一些kvm等虚拟化技术,也是需要掌握的,现在docker也比较流行)运维开发(主要是python运维开发)自动化运维(在之前自动化基础上做深入)运维架构师(主要需要广度,差不多5年左右以上经验,可以担当此职位)

July 2, 2019 · 1 min · jiezi

java客户端无法上传文件到hdfs

could only be replicated to 0 nodes instead of minReplication (=1)

July 1, 2019 · 1 min · jiezi

Hive常用函数的使用

文章作者:foochane 原文链接:https://foochane.cn/article/2019062501.html 1 基本介绍1.1 HIVE简单介绍Hive是一个可以将SQL翻译为MR程序的工具,支持用户将HDFS上的文件映射为表结构,然后用户就可以输入SQL对这些表(HDFS上的文件)进行查询分析。Hive将用户定义的库、表结构等信息存储hive的元数据库(可以是本地derby,也可以是远程mysql)中。 1.2 Hive的用途做数据分析,不用自己写大量的MR程序,只需要写SQL脚本即可用于构建大数据体系下的数据仓库hive 2 以后 把底层引擎从MapReduce换成了Spark 启动hive前要先启动hdfs 和yarn 2 使用方式2.1 方式1:直接使用hive服务端输入命令 $ hive即可: hadoop@Master:~$ hiveSLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/usr/local/bigdata/hive-2.3.5/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-2.7.1/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]Logging initialized using configuration in file:/usr/local/bigdata/hive-2.3.5/conf/hive-log4j2.properties Async: trueHive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.hive>show databases;OKdbtestdefaultTime taken: 3.539 seconds, Fetched: 2 row(s)hive>技巧:让提示符显示当前库: ...

June 30, 2019 · 12 min · jiezi

zookeeper的安装和使用

文章作者:foochane  原文链接:https://foochane.cn/article/2019062601.html zookeeper数据存储形式 zookeeper安装 zookeeper命令行客户端的使用1 zookeeper数据存储形式zookeeper中对用户的数据采用kv形式存储 key:是以路径的形式表示的,各key之间有父子关系,比如 / 是顶层key 用户建的key只能在/ 下作为子节点,比如建一个key: /aa 这个key可以带value数据 也可以建一个key: /bb 也可以建多个key: /aa/xx zookeeper中,对每一个数据key,称作一个znode 2 znode类型zookeeper中的znode有多种类型: 1、PERSISTENT 持久的:创建者就算跟集群断开联系,该类节点也会持久存在与zk集群中2、EPHEMERAL 短暂的:创建者一旦跟集群断开联系,zk就会将这个节点删除3、SEQUENTIAL 带序号的:这类节点,zk会自动拼接上一个序号,而且序号是递增的组合类型: PERSISTENT :持久不带序号EPHEMERAL :短暂不带序号PERSISTENT 且 SEQUENTIAL :持久且带序号EPHEMERAL 且 SEQUENTIAL :短暂且带序号3 安装zookeeper解压安装包 zookeeper-3.4.6.tar.gz 修改conf/zoo.cfg # The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/usr/local/bigdata/data/zkdata# the port at which the clients will connectclientPort=2181# the maximum number of client connections.# increase this if you need to handle more clients#maxClientCnxns=60## Be sure to read the maintenance section of the # administrator guide before turning on autopurge.## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance## The number of snapshots to retain in dataDir#autopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge feature#autopurge.purgeInterval=1server.1=Master:2888:3888server.2=Slave01:2888:3888server.3=Slave02:2888:3888对3台节点,都创建目录 /usr/local/bigdata/data/zkdata ...

June 30, 2019 · 2 min · jiezi

初识大数据

什么是大数据?大数据有什么特点?大数据与传统的数据有什么关系?大数据和我们有什么关系?虽然很多书籍上直接说明了大数据的概念和特点,但是根据个人的体会,如果我们先了解数据的概念和特点,那么我们将会更加容易理解大数据。 关于数据的几个问题 什么是数据?狭义上讲数据就是数值,也就是我们通过观察、实验或计算得出的结果;从广义上讲,数据的含义更加广阔,也可以是文字、图像、声音等。当前我们所说的数据一般是指广义上的数据。 数据有什么特点?数据的种类繁多(语言、文字、数值、图像影音等),数据质量也参差不齐真假难辨,数据存储介质各异(口头相传、纸张书籍、数码磁盘),简单的总结数据的特点就是一下几个字:多、杂、乱。 数据有什么作用?数据的本身最主要作用是用于记录事物及其发展,人们可以根据这些记录的数据对事物进行相应的分析,得到相关的规律和结果(如根据实验数据得到相应的计算公式),并根据得到的规律和结果对现有或者未来的事物做出相应的决策行动。 在这里还是要推荐下我自己建的大数据学习交流群:251956502,群里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据软件开发相关的),包括我自己整理的一份最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴加入。 大数据的由来 大数据概念的的兴起也就是最近不到10年的时间,我们在了解了数据的几个基本概念之后,我们再来看一下大数据出现的背景。 关于数据的起源,早在远古时代人们就已经在石头、树木上记载相应的数据了,再到后来人们用竹简、棉帛等记载和传输数据,在这一阶段数据的记录和传播都是非常有限的;到后来纸张的出现和印刷术的发明,数据的记录和传播有了第一次长足的进步,但是此时的数据量仍旧是相当的小,传播速度也是较为缓慢,传播范围相对狭窄,人们对数据的分析和使用十分有限;直到了计算机和磁盘等存储介质的出现,人们记录数据和计算分析数据的能力有了质的飞跃,随着互联网的出现和通信技术的不断提高,数据的产生和传播速度以及传播范围急速提升,数据呈现爆发式的增长,人们几乎可以实时的了解世界上发生的所有重大事件,至此人们进入所谓的大数据时代。 大数据的基本概念 大数据和传统数据相比有什么异同呢?仅仅是数据量的增加吗?我们应对大数据的方法和应对传统数据的方法一样吗?大数据与我们的生活有什么直接的关系吗? 大数据和传统数据有什么异同呢?现在较为认可的大数据的特点是关于大数据“4V”的说法,也就是大数据与传统数据的异同点,即数据量大、数据类型繁多、数据处理速度快、数据的价值密度较低。 数据量(Volume) 数据类型(Variety) 处理方式(Velocity) 数据价值(Value) 传统数据 数据量较小,增长速度较慢 数据类型单一,以数字与文字为主 人工计算推导,单机处理,时效性不高 价值密度较高,存储的基本都是有用信息 大数据 数据量较大,数据量层指数型增加 数据类型丰富,影音数据的比例较大 分布式处理,时效性较高 价值密度较低,需要从大量数据中挖掘价值 那我们应该用什么方法去应对这些数据呢?根据大数据和传统数据的特点,我们在处理这些海量数据的时候思维上应该有一些改变,在《大数据时代:生活工作与思维的大变革》一书中指出,我们在应对大数据的时候应该有一下3中思维的改变:全量而非抽样,效率而非精确,相关而非因果。 全量而非抽样,在以前数据存储和计算能力的限制下,在数据分析中通常采用抽样的方法,通过对部分数据进行分析得到相应的结论进而推广到整个数据集中。在大数据时代中,数据的存储和计算不在是瓶颈,运用整个数据集进行全域的数据分析快速地得到相应的结果已经成为可能。 效率而非精确,在过去的抽样分析中,必须确保样本分析的精确性才能在全域数据中进行推广,以免数据分析结果的误差会在全域数据中扩大,这样导致数据的分析验证较为繁琐且效率低下。在大数据时代中,直接对全域数据进行分析,分析结果的误差直接基于所有的数据,在可接受误差范围内直接使用分析结果即可,不用担心分析误差的扩散。 相关而非因果,在过去的数据分析中,分析的目的往往是了解事物发生背后的原理,但是在大数据时代数据的因果关系不在那么重要,人们关注的往往是事情将如何发展而不是数据为什么这样发展,这样事物之间的相关性就显得更加的重要。

June 30, 2019 · 1 min · jiezi

零基础如何快速学好大数据

大数据技术及应用已经成为互联网+时代发展的最大的趋。这也使得很多人纷纷选择学习大数据,在时代发展的潮流中获得属于自己的一份天地。大数据技术体系庞大,包括的知识较多,系统的学习大数据可以让你全面掌握大数据技能。 一、在开始学习大数据前应该掌握哪些基础知识 怎样进行大数据学习的快速入门?需要什么基础 1、Java语言基础 学大数据课程之前要先学习一种计算机编程语言。Java是大数据学习必要的编程语言基础。因为大数据的开发基于Java语言,而且不论是学习hadoop,还是数据分析与挖掘,都需要有编程语言作为基础。因此,如果想学习大数据开发,掌握Java基础是必不可少的。 当然,Python也是可以的,但是Python语言更偏向于机器学习,深度学习等人工智能方面。大数据技术方面,Java还是比较适合。 .在入门学习大数据的过程当中有遇见学习,行业,缺乏系统学习路线,系统学习规划,欢迎你加入我的大数据学习交流裙:251956502 ,裙文件有我这几年整理的大数据学习手册,开发工具,PDF文档书籍,你可以自行下载。 2、数学知识 再者就是学习大数据需要用到一些数学知识。 数学知识是数据分析师的基础知识。 对于初级数据分析师,了解一些描述统计相关的基础内容,有一定的公式计算能力即可,了解常用统计模型算法则是加分。 对于高级数据分析师,统计模型相关知识是必备能力,线性代数(主要是矩阵计算相关知识)也有一定的了解。 而对于数据挖掘工程师,除了统计学以外,各类算法也需要熟练使用,对数学的要求是高的。 3、逻辑思维能力 这个如果数学好,或者平时就喜欢逻辑思考的话,一般的逻辑思维能力是有的。在大数据分析和数据挖掘需要用到逻辑思维能力。在学习Java的时候,也就用到了逻辑思维能力,所以学好Java也是锻炼了逻辑思维能力。 二、大数据需要学习哪些技术 1、Linux 2、Hadoop 3、HDFS系统 4、Hive 5、Storm实时数据处理 6、Hbase 7、Redis集群 8、spark 9、Docker技术 10、Kafka

June 29, 2019 · 1 min · jiezi

Hadoop集群下jps查看不到datanode信息的解决办法

在每次hdfs namenode -format之后,namenode的cluster id都会被自动更新,一般这种情况先去看datanode的logs日志,确定是cluster id不一致的问题了,这时候应该去到hdfs的tmp/dfs/current文件下,把datanode的cluster id更新成和namenode一样的cluster id就可以了

June 29, 2019 · 1 min · jiezi

新手入门大数据-Hadoop基础与电商行为日志分析三

HDFS:1.分布式2.commdity hardware 通用硬件上面3.高容错4.high throughput 高吞吐5.large data set普通文件系统 VS 分布式的文件系统 单机 横跨N个机器前提和设计目标:hardware failure硬件错误崩溃后的快速恢复Streaming Data Access HDFS更适合批处理,对延迟的要求不高关注的是吞吐量,而不是低延迟Large Data Set 大规模数据集Moving Computation is cheaper than moving data移动计算比移动数据更划算 HDFS架构1)Namenode(master)和Datanodes(slave)2)master和slave 主从关系

June 25, 2019 · 1 min · jiezi

新手入门大数据-Hadoop基础与电商行为日志分析一

chuanshang一个案例:美国一女高中生收到婴儿产品的推荐,被他的父亲向商场投诉,结果最终,意识到女儿真的怀了孕。大数据的4V特征:数据量 volume速度 velocity基于高度分析的价值 value (数据量与有用的数据价值可能是成反比的)多样性 variety 大数据带来的技术变革 技术驱动:数据量大 存储:文件存储-->分布式存储 计算:单机 --> 分布式计算 网络:万兆 DB :RDBMS --> NOSQL (HBase/Redis...)大数据技术概念: 单机:CPU Memory disk分布式并行计算/处理货物搬到船上,是一个数据采集处理:小于多少的石头扔了 精细化的筛选 大数据的几个重要部分: 1.采集 flume/sqoop 2.存储 hadoop 3.数据处理/挖掘/分析 hadoop spark flink 4.可视化大数据典型应用: 1.报表 2.用户画像 3. 指标监控 4.指标预警 (时效性的要求逐级变大)学习一个新技术,直接看他的官网最好Hadoop,hive,hbase都是Apache社区下面的顶级开源项目地址: hadoop.apache.org hive.apache.org hbase.apache.org reliable,scalable,distributed computing.(可依赖,可拓展,分布式计算)Hadoop:提供分布式的存储(一个文件被拆分成很多块,并且以副本的方式存储在各个节点中)和计算是一个分布式的系统基础架构:用户可以在不了解分布式底层细节的情况下进行使用分布式文件系统:HDFS 实现将文件分布式存储在很多的服务器上分布式计算框架:Mapreduce 实现在很多机器上进行分布式并行计算分布式资源调度框架:YARN 实现集群资源管理以及作业的调度

June 25, 2019 · 1 min · jiezi

Hive元数据管理

众所周知,hive表中的数据是HDFS上的文件,可是hive怎么知道这些文件的内容都对应哪个字段,对应哪个分区呢?就是hive的元数据管理着这一切。通常在hive-site.xml中的元数据库配置成MySQL,替换Derby。 <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql:///metastore?createDatabaseIfNotExists=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property>下面我们进MySQL看看元数据的表具体有哪些。 1.VERSION这个存hive版本,有且仅有一条数据 如果多了,会报错 Caused by: MetaException(message:Metastore contains multiple versions (2)2.库相关表 DBS是数据库主表,字段名顾名思义,样例数据如下 DATABASE_PARAMS是创建数据库 WITH DBPROPERTIES (property_name=property_value, …)指定的参数 FUNCS是函数表 FUNC_RU是函数在哪个jar包中 3.表相关表 PS:调整里半天位置来截个图,感觉像站队合影一样……哈哈TBLS是表的主表,存放hive所有表的主要信息,其中TBL_TYPE是表类型,MANAGED_TABLE表示内部表,EXTERNAL_TABLE表示外部表 TABLE_PARAMS是表参数,类似DATABASE_PARAMSTBL_PRIVS,TBL_COL_PRIVS分别是表权限与列权限 PARTITION_KEYS是分区信息表,INTEGER_IDX是分区字段序号 PARTITIONS是具体的分区记录,当某表添加新的分区时,会增加一条记录 4.存储相关表 SDS是存储主表,包含数据文件的输入输出格式,所在HDFS路径,是否压缩等 COLUMNS_V2是列的信息,INTEGER_IDX是列的下标,对应文件的内容顺序 SD_PARAMS是在创建表时候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定SERDES是序列化使用类的表 SERDE_PARAMS存储列分隔符,行分隔符等 在序列化参数表中记录列的分隔符,意味着Hive的存储是对每个字段各自序列化的。 参考博客:https://www.jianshu.com/p/ccf...https://www.cnblogs.com/11301...

June 21, 2019 · 1 min · jiezi

基于-ZooKeeper-搭建-Hadoop-高可用集群

一、高可用简介Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂,故下面先进行讲解: 1.1 高可用整体架构HDFS 高可用架构如下: 图片引用自:https://www.edureka.co/blog/h...HDFS 高可用架构主要由以下组件所构成: Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。Zookeeper 集群:为主备切换控制器提供主备选举支持。共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。1.2 基于 QJM 的共享存储系统的数据同步机制分析目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作为共享的存储系统,这里以 QJM 集群为例进行说明:Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。 ...

June 20, 2019 · 3 min · jiezi

大数据入门指南GitHub开源项目

项目GitHub地址:https://github.com/heibaiying... 前 言大数据技术栈思维导图大数据常用软件安装指南一、Hadoop分布式文件存储系统——HDFS分布式计算框架——MapReduce集群资源管理器——YARNHadoop单机伪集群环境搭建Hadoop集群环境搭建HDFS常用Shell命令HDFS Java API的使用基于Zookeeper搭建Hadoop高可用集群二、HiveHive简介及核心概念Linux环境下Hive的安装部署Hive CLI和Beeline命令行的基本使用Hive 常用DDL操作Hive 分区表和分桶表Hive 视图和索引Hive常用DML操作Hive 数据查询详解三、SparkSpark Core : Spark简介Spark开发环境搭建弹性式数据集RDDRDD常用算子详解Spark运行模式与作业提交Spark累加器与广播变量基于Zookeeper搭建Spark高可用集群Spark SQL : DateFrame 和 DataSet Structured API的基本使用Spark SQL外部数据源Spark SQL常用聚合函数Spark SQL JOIN 操作Spark Streaming : Spark Streaming 简介Spark Streaming 基本操作Spark Streaming 整合 FlumeSpark Streaming 整合 Kafka四、StormStorm和流处理简介Storm核心概念详解Storm单机环境搭建Storm集群环境搭建Storm编程模型详解Storm项目三种打包方式对比分析Storm集成Redis详解Storm集成HDFS/HBaseStorm集成Kafka五、FlinkTODO 六、HBaseHbase 简介HBase系统架构及数据结构HBase基本环境搭建(Standalone /pseudo-distributed mode)HBase集群环境搭建HBase常用Shell命令HBase Java APIHbase 过滤器详解HBase 协处理器详解HBase 容灾与备份HBase的SQL中间层——PhoenixSpring/Spring Boot 整合 Mybatis + Phoenix七、KafkaKafka 简介基于Zookeeper搭建Kafka高可用集群Kafka 生产者详解Kafka 消费者详解深入理解Kafka副本机制八、ZookeeperZookeeper 简介及核心概念Zookeeper单机环境和集群环境搭建Zookeeper常用Shell命令Zookeeper Java 客户端——Apache CuratorZookeeper ACL权限控制九、FlumeFlume简介及基本使用Linux环境下Flume的安装部署Flume整合Kafka十、SqoopSqoop简介与安装Sqoop的基本使用十一、AzkabanAzkaban简介Azkaban3.x 编译及部署Azkaban Flow 1.0 的使用Azkaban Flow 2.0 的使用十二、ScalaScala简介及开发环境配置基本数据类型和运算符流程控制语句数组——Array集合类型综述常用集合类型之——List & Set常用集合类型之——Map & Tuple类和对象继承和特质函数 & 闭包 & 柯里化模式匹配类型参数隐式转换和隐式参数十三、公共内容大数据应用常用打包方式 后 记资料分享与开发工具推荐 ...

June 18, 2019 · 1 min · jiezi

PySpark-SQL-相关知识介绍

本文作者:foochane 本文链接:https://foochane.cn/article/2019060601.html1 大数据简介大数据是这个时代最热门的话题之一。但是什么是大数据呢?它描述了一个庞大的数据集,并且正在以惊人的速度增长。大数据除了体积(Volume)和速度(velocity)外,数据的多样性(variety)和准确性(veracity)也是大数据的一大特点。让我们详细讨论体积、速度、多样性和准确性。这些也被称为大数据的4V特征。 1.1 Volume数据体积(Volume)指定要处理的数据量。对于大量数据,我们需要大型机器或分布式系统。计算时间随数据量的增加而增加。所以如果我们能并行化计算,最好使用分布式系统。数据可以是结构化数据、非结构化数据或介于两者之间的数据。如果我们有非结构化数据,那么情况就会变得更加复杂和计算密集型。你可能会想,大数据到底有多大?这是一个有争议的问题。但一般来说,我们可以说,我们无法使用传统系统处理的数据量被定义为大数据。现在让我们讨论一下数据的速度。 1.2 Velocity越来越多的组织机构开始重视数据。每时每刻都在收集大量的数据。这意味着数据的速度在增加。一个系统如何处理这个速度?当必须实时分析大量流入的数据时,问题就变得复杂了。许多系统正在开发,以处理这种巨大的数据流入。将传统数据与大数据区别开来的另一个因素是数据的多样性。 1.3 Variety数据的多样性使得它非常复杂,传统的数据分析系统无法正确地分析它。我们说的是哪一种?数据不就是数据吗?图像数据不同于表格数据,因为它的组织和保存方式不同。可以使用无限数量的文件系统。每个文件系统都需要一种不同的方法来处理它。读取和写入JSON文件与处理CSV文件的方式不同。现在,数据科学家必须处理数据类型的组合。您将要处理的数据可能是图片、视频、文本等的组合。大数据的多样性使得分析变得更加复杂。 1.4 Veracity你能想象一个逻辑错误的计算机程序产生正确的输出吗?同样,不准确的数据将提供误导的结果。准确性,或数据正确性,是一个重要的问题。对于大数据,我们必须考虑数据的异常。 2 Hadoop 介绍Hadoop是一个解决大数据问题的分布式、可伸缩的框架。Hadoop是由Doug Cutting和Mark Cafarella开发的。Hadoop是用Java编写的。它可以安装在一组商用硬件上,并且可以在分布式系统上水平扩展。 在商品硬件上工作使它非常高效。如果我们的工作是在商品硬件,故障是一个不可避免的问题。但是Hadoop为数据存储和计算提供了一个容错系统。这种容错能力使得Hadoop非常流行。 Hadoop有两个组件:第一个组件是HDFS(Hadoop Distributed File System),它是一个分布式文件系统。第二个组件是MapReduce。HDFS用于分布式数据存储,MapReduce用于对存储在HDFS中的数据执行计算。 2.1 HDFS介绍HDFS用于以分布式和容错的方式存储大量数据。HDFS是用Java编写的,在普通硬件上运行。它的灵感来自于谷歌文件系统(GFS)的谷歌研究论文。它是一个写一次读多次的系统,对大量的数据是有效的。HDFS有两个组件NameNode和DataNode。 这两个组件是Java守护进程。NameNode负责维护分布在集群上的文件的元数据,它是许多datanode的主节点。HDFS将大文件分成小块,并将这些块保存在不同的datanode上。实际的文件数据块驻留在datanode上。HDFS提供了一组类unix-shell的命令。但是,我们可以使用HDFS提供的Java filesystem API在更细的级别上处理大型文件。容错是通过复制数据块来实现的。 我们可以使用并行的单线程进程访问HDFS文件。HDFS提供了一个非常有用的实用程序,称为distcp,它通常用于以并行方式将数据从一个HDFS系统传输到另一个HDFS系统。它使用并行映射任务复制数据。 2.2 MapReduce介绍计算的MapReduce模型最早出现在谷歌的一篇研究论文中。Hadoop的MapReduce是Hadoop框架的计算引擎,它在HDFS中对分布式数据进行计算。MapReduce已被发现可以在商品硬件的分布式系统上进行水平伸缩。它也适用于大问题。在MapReduce中,问题的解决分为Map阶段和Reduce阶段。在Map阶段,处理数据块,在Reduce阶段,对Map阶段的结果运行聚合或缩减操作。Hadoop的MapReduce框架也是用Java编写的。 MapReduce是一个主从模型。在Hadoop 1中,这个MapReduce计算由两个守护进程Jobtracker和Tasktracker管理。Jobtracker是处理许多任务跟踪器的主进程。Tasktracker是Jobtracker的从节点。但在Hadoop 2中,Jobtracker和Tasktracker被YARN取代。 我们可以使用框架提供的API和Java编写MapReduce代码。Hadoop streaming体模块使具有Python和Ruby知识的程序员能够编写MapReduce程序。 MapReduce算法有很多用途。如许多机器学习算法都被Apache Mahout实现,它可以在Hadoop上通过Pig和Hive运行。 但是MapReduce并不适合迭代算法。在每个Hadoop作业结束时,MapReduce将数据保存到HDFS并为下一个作业再次读取数据。我们知道,将数据读入和写入文件是代价高昂的活动。Apache Spark通过提供内存中的数据持久性和计算,减轻了MapReduce的缺点。 更多关于Mapreduce 和 Mahout 可以查看如下网页: https://www.usenix.org/legacy/publications/library/proceedings/osdi04/tech/full_papers/dean/dean_html/index.htmlhttps://mahout.apache.org/users/basics/quickstart.html3 Apache Hive 介绍计算机科学是一个抽象的世界。每个人都知道数据是以位的形式出现的信息。像C这样的编程语言提供了对机器和汇编语言的抽象。其他高级语言提供了更多的抽象。结构化查询语言(Structured Query Language, SQL)就是这些抽象之一。世界各地的许多数据建模专家都在使用SQL。Hadoop非常适合大数据分析。那么,了解SQL的广大用户如何利用Hadoop在大数据上的计算能力呢?为了编写Hadoop的MapReduce程序,用户必须知道可以用来编写Hadoop的MapReduce程序的编程语言。 现实世界中的日常问题遵循一定的模式。一些问题在日常生活中很常见,比如数据操作、处理缺失值、数据转换和数据汇总。为这些日常问题编写MapReduce代码对于非程序员来说是一项令人头晕目眩的工作。编写代码来解决问题不是一件很聪明的事情。但是编写具有性能可伸缩性和可扩展性的高效代码是有价值的。考虑到这个问题,Apache Hive就在Facebook开发出来,它可以解决日常问题,而不需要为一般问题编写MapReduce代码。 根据Hive wiki的语言,Hive是一个基于Apache Hadoop的数据仓库基础设施。Hive有自己的SQL方言,称为Hive查询语言。它被称为HiveQL,有时也称为HQL。使用HiveQL, Hive查询HDFS中的数据。Hive不仅运行在HDFS上,还运行在Spark和其他大数据框架上,比如Apache Tez。 Hive为HDFS中的结构化数据向用户提供了类似关系数据库管理系统的抽象。您可以创建表并在其上运行类似sql的查询。Hive将表模式保存在一些RDBMS中。Apache Derby是Apache Hive发行版附带的默认RDBMS。Apache Derby完全是用Java编写的,是Apache License Version 2.0附带的开源RDBMS。 HiveQL命令被转换成Hadoop的MapReduce代码,然后在Hadoop集群上运行。 了解SQL的人可以轻松学习Apache Hive和HiveQL,并且可以在日常的大数据数据分析工作中使用Hadoop的存储和计算能力。PySpark SQL也支持HiveQL。您可以在PySpark SQL中运行HiveQL命令。除了执行HiveQL查询,您还可以直接从Hive读取数据到PySpark SQL并将结果写入Hive ...

June 13, 2019 · 1 min · jiezi

Spark的安装及配置

本文作者:foochane 本文链接:https://foochane.cn/article/2019051904.html1 安装说明在安装spark之前,需要安装hadoop集群环境,如果没有可以查看:Hadoop分布式集群的搭建 1.1 用到的软件软件版本下载地址linuxUbuntu Server 18.04.2 LTShttps://www.ubuntu.com/downlo...hadoophadoop-2.7.1http://archive.apache.org/dis...javajdk-8u211-linux-x64https://www.oracle.com/techne...sparkspark-2.4.3-bin-hadoop2.7https://www.apache.org/dyn/cl...scalascala-2.12.5http://www.scala-lang.org/dow...AnacondaAnaconda3-2019.03-Linux-x86_64.shhttps://www.anaconda.com/dist...1.2 节点安排名称iphostname主节点192.168.233.200Master子节点1192.168.233.201Slave01子节点2192.168.233.202Slave022 安装Spark2.1 解压到安装目录$ tar zxvf spark-2.4.3-bin-hadoop2.7.tgz -C /usr/local/bigdata/$ cd /usr/local/bigdata/$ mv spark-2.4.3-bin-hadoop2.7 spark-2.4.32.2 修改配置文件配置文件位于/usr/local/bigdata/spark-2.4.3/conf目录下。 (1) spark-env.sh将spark-env.sh.template重命名为spark-env.sh。添加如下内容: export SCALA_HOME=/usr/local/bigdata/scalaexport JAVA_HOME=/usr/local/bigdata/java/jdk1.8.0_211export HADOOP_HOME=/usr/local/bigdata/hadoop-2.7.1export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoopSPARK_MASTER_IP=MasterSPARK_LOCAL_DIRS=/usr/local/bigdata/spark-2.4.3SPARK_DRIVER_MEMORY=512M(2)slaves将slaves.template重命名为slaves修改为如下内容: Slave01Slave022.3 配置环境变量在~/.bashrc文件中添加如下内容,并执行$ source ~/.bashrc命令使其生效 export SPARK_HOME=/usr/local/bigdata/spark-2.4.3export PATH=$PATH:/usr/local/bigdata/spark-2.4.3/bin:/usr/local/bigdata/spark-2.4.3/sbin3 运行Spark先启动hadoop$ cd $HADOOP_HOME/sbin/$ ./start-dfs.sh$ ./start-yarn.sh$ ./start-history-server.sh然后启动启动sapark$ cd $SPARK_HOME/sbin/$ ./start-all.sh$ ./start-history-server.sh要注意的是:其实我们已经配置的环境变量,所以执行start-dfs.sh和start-yarn.sh可以不切换到当前目录下,但是start-all.sh、stop-all.sh和/start-history-server.sh这几个命令hadoop目录下和spark目录下都同时存在,所以为了避免错误,最好切换到绝对路径下。 spark启动成功后,可以在浏览器中查看相关资源情况:http://192.168.233.200:8080/,这里192.168.233.200是Master节点的IP 4 配置Scala环境spark既可以使用Scala作为开发语言,也可以使用python作为开发语言。 4.1 安装Scalaspark中已经默认带有scala,如果没有或者要安装其他版本可以下载安装包安装,过程如下:先下载安装包,然后解压 $ tar zxvf scala-2.12.5.tgz -C /usr/local/bigdata/然后在~/.bashrc文件中添加如下内容,并执行$ source ~/.bashrc命令使其生效 export SCALA_HOME=/usr/local/bigdata/scala-2.12.5export PATH=/usr/local/bigdata/scala-2.12.5/bin:$PATH测试是否安装成功,可以执行如下命令: scala -versionScala code runner version 2.12.5 -- Copyright 2002-2018, LAMP/EPFL and Lightbe4.2 启动Spark shell界面执行 spark-shell --master spark://master:7077命令,启动spark shell。 ...

June 13, 2019 · 2 min · jiezi

Hive的安装及配置

title: Hive的安装及配置summary: 关键词:Hive ubuntu 安装和配置 Derby MySQL PostgreSQL 数据库连接date: 2019-5-19 13:25urlname: 2019051903author: foochaneimg: /medias/featureimages/19.jpgcategories: 大数据tags: hive大数据本文作者:foochane 本文链接:https://foochane.cn/article/2019051903.html1 安装说明在安装hive之前,需要安装hadoop集群环境,如果没有可以查看:Hadoop分布式集群的搭建 1.1 用到的软件软件版本下载地址linuxUbuntu Server 18.04.2 LTShttps://www.ubuntu.com/downlo...hadoophadoop-2.7.1http://archive.apache.org/dis...javajdk-8u211-linux-x64https://www.oracle.com/techne...hivehive-2.3.5http://mirror.bit.edu.cn/apac...mysql-connector-javamysql-connector-java-5.1.45.jar命令行安装postgresql-jdbc4postgresql-jdbc4.jar命令行安装1.2 节点安排名称iphostname主节点192.168.233.200Master子节点1192.168.233.201Slave01子节点2192.168.233.202Slave021.3 说明注意:本文的hive 、MySQL、PostgreSQL均只安装在Master节点上,实际生产环境中,需根据实际情况调整 Hive默认元数据保存在内嵌的 Derby 数据库中,这是最简单的一种存储方式,使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。Derby 数据库中,只能允许一个会话连接,只适合简单的测试,实际生产环境中不适用。 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 或者PostgreSQL作为元数据库,Hive 内部对 MySQL和PostgreSQL提供了很好的支持。 本文将逐一介绍hive连接Derby、PostgreSQL、MySQL这三种数据库数据库的安装和配置。 2 hive连接Derby2.1 解压$ tar -zxvf apache-hive-2.3.5-bin.tar.gz -C /usr/local/bigdata & cd /usr/local/bigdata$ mv apache-hive-2.3.5-bin hive-2.3.5$ sudo chown -R hadoop:hadoop hive #之前bigdata目录已经修改过权限了2.2 修改配置文件要修改的文件在/usr/local/hive-2.3.5/conf目录下,需要修改hive-site.xml、hive-env.sh、hive-log4j2.properties这3个文件。 先把.template文件复制一份出来,然后进行修改。 $ cd /usr/local/hive-2.3.5/conf$ cp hive-default.xml.template hive-site.xml$ cp hive-env.sh.template hive-env.sh$ cp hive-log4j.properties.template hive-log4j.properties2.2.1 hive-site.xml(Derby)配置Derby只需要修改javax.jdo.option.ConnectionURL指定metastore_db的存储位置即可具体修改如下: ...

June 13, 2019 · 6 min · jiezi

Hadoop分布式集群的搭建

title: Hadoop分布式集群的搭建summary: 关键词: Hadoop ubuntu 分布式集群 环境搭建 ssh 网络配置 java环境 date: 2019-5-19 11:09author: foochaneurlname: 2019051901categories: 大数据tags: hadoop大数据本文作者:foochane 本文链接:https://foochane.cn/article/2019051901.html1 安装说明1.1 用到的软件软件版本下载地址linuxUbuntu Server 18.04.2 LTShttps://www.ubuntu.com/downlo...hadoophadoop-2.7.1http://archive.apache.org/dis...javajdk-8u211-linux-x64https://www.oracle.com/techne...1.2 节点安排名称iphostname主节点192.168.233.200Master子节点1192.168.233.201Slave01子节点2192.168.233.202Slave022 创建hadoop用户所有的节点均创建一个名为hadoop的用户,并添加管理员权限。注意:这里这是单纯为了方便管理,创建的用户名,也可以使用其他用户名,或者使用系统之前的用户,主要有管理员权限即可 $ sudo useradd -m hadoop -s /bin/bash #创建用户$ sudo passwd hadoop #修改密码$ sudo adduser hadoop sudo #添加管理员权限3 配置网络环境3.1 修改主机名修改 /etc/hostname文件,每个节点都要修改。 主节点修改为:Master从节点分别修改为:Slave01,Slave02,...注意:如果是ubuntu18.04桌面版直接修改/etc/hostname文件即可,ubuntu18.04服务器版还需要修改/etc/cloud/cloud.cfg文件,修改如下: # This will cause the set+update hostname module to not operate (if true)preserve_hostname: true #这里是将false改成true3.2 添加IP与主机名的映射关系在/etc/hosts文件里添加如下内容(每个节点都要修改,根据实际情况修改ip) 192.168.233.200 Master192.168.233.201 Slave01192.168.233.202 Slave02检查各个节点是否能相互ping通。 3.3 设置SSH无密码登录节点让Master能够通过SSH无密码登录各个Slave节点 ...

June 13, 2019 · 2 min · jiezi

优酷背后的大数据秘密

在本文中优酷数据中台的数据技术专家门德亮分享了优酷从Hadoop迁移到阿里云MaxCompute后对业务及平台的价值。 本文内容根据演讲视频以及PPT整理而成。 大家好,我是门德亮,现在在优酷数据中台做数据相关的事情。很荣幸,我正好见证了优酷从没有MaxCompute到有的这样一个历程,因为刚刚好我就是入职优酷差不多5年的时间,我们正好是在快到5年的时候,去做了从Hadoop到MaxCompute的这样一个升级。这个是2016年5月到2019年现在的5月优酷的发展历程,上面是计算资源,下面是储存资源。大家可以看到整个用户数,还有表的数据,实际上是在呈一个指数式增长的。但是在2017年5月,当优酷完成了整个Hadoop迁移MaxCompute后,优酷的计算消耗,还有储存的消耗实际上是呈下降趋势的,整个迁移得到了一个非常大的收益。 下面说一下优酷的业务特点。 第一个特点从大数据平台整个的用户复杂度上面,不止是数据的同学和技术的同学在使用,还会包括一些BI同学,测试同学,甚至产品运营都可能去使用这个大数据的平台。 第二个特点就是业务复杂,优酷是一个视频网站,它有非常复杂的业务场景,从日志分类上,除了像页面浏览,还会有一些播放相关的数据、性能相关的数据。从整个的业务模式上,有直播、有会员、有广告、有大屏等这样一些非常不一样的场景。 第三个特点,就是数据量是非常巨大的,一天的日志量会达到千亿级别,这是一个非常旁大的数据量,而且会做非常复杂的计算。 第四个是比较有意思的,不管是小公司、大公司,对成本的意识是非常高的。优酷也是有非常严格的预算,包括在阿里集团内是有非常严格的预算系统的,但是我们也经常会去做一些重要的战役,像双十一战役,像我们暑期的世界杯战役,还有春节也会搞各种战役。这样的话,其实对计算资源的弹性要求是非常高的。 基于上面的优酷的业务特点,我整理了MaxCompute可以完美的支持我们业务的几个特点。 第一个,简单易用。第二个,完善的生态。第三个,性能非常强悍。第四个,资源使用非常弹性。 第一个特点,简单易用。MaxCompute有一个非常完整的链路,不管是从数据开发,还是数据运维,包括数据集成,数据质量的管控,还有整个数据地图,数据安全。当年优酷从Hadoop迁到MaxCompute之后,我们最大的体会是自己不用半夜经常起来去维护集群了,不用去跑任务了,写一个任务,别人之前提一个需求过来,我可能要给他排几周,而现在我可以告诉他,我给你马上跑一下,就可以出来了。包括之前像分析师BI还要登录客户端,写脚本,自己写调度,经常会说我的数今天为什么没出来?包括高层看的数,可能要到12点钟才能出来。而现在基本上所有重要的数据都会在7点钟产出,包括一些基本的业务需求,其实分析师或者产品,他们自己都可以实现了,不需要所有需求都提到数据这边。 第二个特点,完整的生态。优酷在2017年之前是完全基于Hadoop的生态,迁到MaxCompute之后,是基于阿里云提供的Serverless大数据服务的生态。大家可以在开源上看到的组件,在整个的MaxCompute上都是有的,而且比开源的要更好用、更简单。从架构图上可以看到,我们中间是MaxCompute,左侧依赖的Mysql、Hbase、ES、Redis这些都是由同步中心去做一个双向的同步。右侧会有资源管理、资源监控、数据监控,包括数据资产,还有一些数据规范。我们下层的数据输入,包括一些集团的采集工具,再往上边,有提供给开发人员用的DataWorks,包括一些命令行的工具;有提供给BI人员用的QuickBI及数据服务。 第三个特点,强悍的性能,MaxCompute支撑了优酷EB级的数据存储,千亿级的数据样本分析,包括千亿级的数据报表,10W级实例的并发、任务。这些在之前维护Hadoop的时候,是想都不敢想的。 第四个特点,资源使用的弹性。我们在2016年迁移之前,其实优酷的Hadoop集群规模已经达到了一千多台,这个当时还是一个比较大的规模。当时我们遇到了很多问题,包括像NameNode 这种内存的问题,机房没有办法再扩容的问题,当时是非常痛苦的,包括一些运维管理上面的问题。我们不断的去问运维要资源,运维告诉说,说你们已经花了多少多少资源,花了多少多少钱。我们面临的问题是计算资源如何按需使用,夜里的时候作业很多,到了下午之后,我的整个集群都空下来了,没有人用,造成了浪费。其实MaxCompute完美的解决了这个问题。 第一个,它是按用量计费的,不是说给你多少台机器,然后就收你多少钱的,真的是你用了多少资源收多少钱的,这个在成本上来说,比自己去维护集群,可能是一个砍半(降50%)这样的收益。 第二个,实际上MaxCompue计算资源是可以分时的,比如说生产队列,凌晨的时候会调高一些,保证报表能够尽快出来。到白天时候,让开发的计算资源高一些,可以让分析师、开发去临时跑一些数据,会更顺畅一些。 第三个,MaxCompute快速的扩容能力,比如说突然有一个比较强的业务需求,发现数据跑不动了,计算资源不够,所有的队列都堵死了,这个时候其实可以直接跟运维说一声,帮忙一键扩容,他两秒钟敲一个命令就搞定了。这样的话,所有的资源可以迅速的消化下去。 上面是优酷为什么采用MaxCompute,下面是在优酷的业务场景下,我们一些典型的方案、应用。这张图实际上是优酷,包括可能现在阿里集团内部一些非常典型的技术架构图。中间可以看到,MaxCompute在中间核心的位置,左侧主要是一个输入,右侧是一个输出的趋向,绿色的线是一个实时的链路,包括现在我们从整个的数据源上,比如DB也好或者服务器的本地日志Log也好,我们通过TT&Datahub存储到MaxCompute上面做分析。当然现在非常火的Flink实时计算,其实是作为一个实时处理的链路。 包括DB的同步,除了实时的链路,DB也会去通过按天/按小时,把数据同步到MaxCompute,数据计算结果也可以同步到Hbase、Mysql这种DB上面。再通过统一的服务层对应用提供服务。下面这个是机器学习Pai做的一些算法训练,再把训练的结果通过OSS传到一个算法的应用上面去。 这张图可能也是业界比较流行的一个数仓分层的图,因为我们这边是数据中台,所有的数据都是统一从ods层cdm层,然后ads层,去一层一层的往上去做精细,再到最上面,通过接口服务、文件服务、SQL服务,去提供多样化的服务。再往上面,提供对内的一些数据产品,对高管、对小二,可能还有一些对外的,比如说像优酷的播放数,包括热度这些对应用的数据。 这张图其实就是我们从Hadoop迁到MaxCompute平台上以来,两个非常经典的案例。我们通过数据中台对不同场景的用户打通,来去赋能到两个不同的场景,提升业务价值。 第二个,可能是内部的,我们通过优酷,还有集团内部的一些BU去做换量,我们通过统一的标签去做样本放大,把优酷的量导给其它的BU,把其它BU的量导给优酷,这样去达到一个共赢的效果。 这张图大部分互联网公司不太会涉及到,就是关于反作弊的问题。这个是我们在MaxCompute做的一个反作弊的架构,通过原始的数据去提取它的特征,然后再通过算法模型,包括机器学习、深度学习、图模型去支持流量反作弊、渠道反作弊等等。再通过业务场景上反作弊的监控工具,把监控到的作弊信息去打一个黑白样本,再把这个黑白样本跟特征一起来不断的迭代优化算法模型。同时针对算法模型,做一个模型的评价,不断来完善反作弊体系。 最后一点,其实还是跟成本相关,在日常使用中,一定是有小白用户或者一些新来的用户去错误的使用或者不在乎的使用一些资源,比如经常会有一些实习生或者是非技术的同学,如分析师,一个SQL消费比较高,这个其实是非常浪费资源,而且可能他一个任务,让其他所有人的任务都在这儿等着排队,实际上我们会去对整个的资源做一个治理。 从节点的粒度上,通过大数据来治理大数据,我们可以算出哪些表产出来之后,多少天没有被读取的,包括它的访问跨度可能没有那么大的,我们会去做下线或者去做治理,有一些业务场景可能并不是非常的重要或者它的时间要求没有那么高,比如一些算法训练,可以去做一些错峰的调度,保证水位不要太高。从MaxCompute任务的角度,可以算出哪些任务有数据倾斜、哪些数据可能会有相似计算,哪些任务需要去做MapJoin,哪些任务需要去做一些裁剪,然后来节省它的IO。还有哪些任务会去做暴力扫描,扫一个月、扫一年的数据,哪些数据可能会有这样一个数据膨胀,比如说它做了CUBE之类的这种复杂计算,一些算法模型的迭代;我们通过数据计算出来的这些迹象,去反推用户,来去提高它的这样一个数据的质量分,来去达到我们降低整个计算资源的目的。 在计算平台的角度,我们也持续的在使用MaxCompute推出的一些非常高级的用法,比如我们这边的HBO、Hash Cluster、Aliorc,HBO就是我们基于一个历史的优化,这样避免了用户不知道怎么调参,我可能为了自己任务快一点,就调一个特别大的参数,这样的话,对集成的资源是非常浪费的。通过这个功能,用户就不用去调参数,集群自动调好,用户就写好自己业务逻辑就好了。 第二块,可能就是最近两年推出的Hash Cluster,当时在使用Hadoop的时候经常会出现,两个大表Join的时候计算不出来,这个Hash Cluster其实是一个优化的利器。大表跟小表Join,可以做一些分发,做一些优化。大表跟大表就涉及到一个排序的问题。这个Hash Cluster,实际上就是提前把数据排好,中间省掉很多计算环节,来达到效率提升的目的。 第三个,Aliorc,在一些固定的场景上面,可以稳定的提升20%的计算效率。 第四个,Session。对一些比较小的数据,直接就放到SSD或缓存里面,一个节点下游有100个叶子场景,是非常友好的,因为低延迟秒出结果。同时,优酷也在使用Lightning解决计算加速,这个是在一个计算架构方案上的优化,它是一个MPP的架构。 最后一页是存储的优化,因为像一些关键的原始数据或者是需要审计的数据是不能删的,永久不能删的。实际上就会造成我们数据存储的趋势是一直往上不减的,计算会在某一个时间点达到一个平衡。当前用这么多的计算资源,再往后,其实应该也不会再大涨了,比如说旧的业务逻辑下掉了,会换新的业务逻辑,这样会保持在一个相对平稳的波动上面。但是储存,因为它有一些历史的数据是永远不能删的,可能会出现一直在增长,而且是指数级的。所以我们也会持续关注存储的情况,我们主要有四个手段。 第一个,还是通过大数据来治大数据,去看哪些表它的访问不够或者它的访问跨度不够。就是对一些生命周期的优化,来去控制它的增速。包括下面的,刚才提到的Aliorc,实际上是做压缩的,我们会去做一些大字段的拆分,来提高压缩的比例。 OK,这个是优酷在MaxCompute中的一些应用场景,感谢大家的聆听。 本文作者:隐林原文链接 本文为云栖社区原创内容,未经允许不得转载。

June 13, 2019 · 1 min · jiezi

优酷背后的大数据秘密

在本文中优酷数据中台的数据技术专家门德亮分享了优酷从Hadoop迁移到阿里云MaxCompute后对业务及平台的价值。 本文内容根据演讲视频以及PPT整理而成。 大家好,我是门德亮,现在在优酷数据中台做数据相关的事情。很荣幸,我正好见证了优酷从没有MaxCompute到有的这样一个历程,因为刚刚好我就是入职优酷差不多5年的时间,我们正好是在快到5年的时候,去做了从Hadoop到MaxCompute的这样一个升级。这个是2016年5月到2019年现在的5月优酷的发展历程,上面是计算资源,下面是储存资源。大家可以看到整个用户数,还有表的数据,实际上是在呈一个指数式增长的。但是在2017年5月,当优酷完成了整个Hadoop迁移MaxCompute后,优酷的计算消耗,还有储存的消耗实际上是呈下降趋势的,整个迁移得到了一个非常大的收益。 下面说一下优酷的业务特点。 第一个特点从大数据平台整个的用户复杂度上面,不止是数据的同学和技术的同学在使用,还会包括一些BI同学,测试同学,甚至产品运营都可能去使用这个大数据的平台。 第二个特点就是业务复杂,优酷是一个视频网站,它有非常复杂的业务场景,从日志分类上,除了像页面浏览,还会有一些播放相关的数据、性能相关的数据。从整个的业务模式上,有直播、有会员、有广告、有大屏等这样一些非常不一样的场景。 第三个特点,就是数据量是非常巨大的,一天的日志量会达到千亿级别,这是一个非常旁大的数据量,而且会做非常复杂的计算。 第四个是比较有意思的,不管是小公司、大公司,对成本的意识是非常高的。优酷也是有非常严格的预算,包括在阿里集团内是有非常严格的预算系统的,但是我们也经常会去做一些重要的战役,像双十一战役,像我们暑期的世界杯战役,还有春节也会搞各种战役。这样的话,其实对计算资源的弹性要求是非常高的。 基于上面的优酷的业务特点,我整理了MaxCompute可以完美的支持我们业务的几个特点。 第一个,简单易用。第二个,完善的生态。第三个,性能非常强悍。第四个,资源使用非常弹性。 第一个特点,简单易用。MaxCompute有一个非常完整的链路,不管是从数据开发,还是数据运维,包括数据集成,数据质量的管控,还有整个数据地图,数据安全。当年优酷从Hadoop迁到MaxCompute之后,我们最大的体会是自己不用半夜经常起来去维护集群了,不用去跑任务了,写一个任务,别人之前提一个需求过来,我可能要给他排几周,而现在我可以告诉他,我给你马上跑一下,就可以出来了。包括之前像分析师BI还要登录客户端,写脚本,自己写调度,经常会说我的数今天为什么没出来?包括高层看的数,可能要到12点钟才能出来。而现在基本上所有重要的数据都会在7点钟产出,包括一些基本的业务需求,其实分析师或者产品,他们自己都可以实现了,不需要所有需求都提到数据这边。 第二个特点,完整的生态。优酷在2017年之前是完全基于Hadoop的生态,迁到MaxCompute之后,是基于阿里云提供的Serverless大数据服务的生态。大家可以在开源上看到的组件,在整个的MaxCompute上都是有的,而且比开源的要更好用、更简单。从架构图上可以看到,我们中间是MaxCompute,左侧依赖的Mysql、Hbase、ES、Redis这些都是由同步中心去做一个双向的同步。右侧会有资源管理、资源监控、数据监控,包括数据资产,还有一些数据规范。我们下层的数据输入,包括一些集团的采集工具,再往上边,有提供给开发人员用的DataWorks,包括一些命令行的工具;有提供给BI人员用的QuickBI及数据服务。 第三个特点,强悍的性能,MaxCompute支撑了优酷EB级的数据存储,千亿级的数据样本分析,包括千亿级的数据报表,10W级实例的并发、任务。这些在之前维护Hadoop的时候,是想都不敢想的。 第四个特点,资源使用的弹性。我们在2016年迁移之前,其实优酷的Hadoop集群规模已经达到了一千多台,这个当时还是一个比较大的规模。当时我们遇到了很多问题,包括像NameNode 这种内存的问题,机房没有办法再扩容的问题,当时是非常痛苦的,包括一些运维管理上面的问题。我们不断的去问运维要资源,运维告诉说,说你们已经花了多少多少资源,花了多少多少钱。我们面临的问题是计算资源如何按需使用,夜里的时候作业很多,到了下午之后,我的整个集群都空下来了,没有人用,造成了浪费。其实MaxCompute完美的解决了这个问题。 第一个,它是按用量计费的,不是说给你多少台机器,然后就收你多少钱的,真的是你用了多少资源收多少钱的,这个在成本上来说,比自己去维护集群,可能是一个砍半(降50%)这样的收益。 第二个,实际上MaxCompue计算资源是可以分时的,比如说生产队列,凌晨的时候会调高一些,保证报表能够尽快出来。到白天时候,让开发的计算资源高一些,可以让分析师、开发去临时跑一些数据,会更顺畅一些。 第三个,MaxCompute快速的扩容能力,比如说突然有一个比较强的业务需求,发现数据跑不动了,计算资源不够,所有的队列都堵死了,这个时候其实可以直接跟运维说一声,帮忙一键扩容,他两秒钟敲一个命令就搞定了。这样的话,所有的资源可以迅速的消化下去。 上面是优酷为什么采用MaxCompute,下面是在优酷的业务场景下,我们一些典型的方案、应用。这张图实际上是优酷,包括可能现在阿里集团内部一些非常典型的技术架构图。中间可以看到,MaxCompute在中间核心的位置,左侧主要是一个输入,右侧是一个输出的趋向,绿色的线是一个实时的链路,包括现在我们从整个的数据源上,比如DB也好或者服务器的本地日志Log也好,我们通过TT&Datahub存储到MaxCompute上面做分析。当然现在非常火的Flink实时计算,其实是作为一个实时处理的链路。 包括DB的同步,除了实时的链路,DB也会去通过按天/按小时,把数据同步到MaxCompute,数据计算结果也可以同步到Hbase、Mysql这种DB上面。再通过统一的服务层对应用提供服务。下面这个是机器学习Pai做的一些算法训练,再把训练的结果通过OSS传到一个算法的应用上面去。 这张图可能也是业界比较流行的一个数仓分层的图,因为我们这边是数据中台,所有的数据都是统一从ods层cdm层,然后ads层,去一层一层的往上去做精细,再到最上面,通过接口服务、文件服务、SQL服务,去提供多样化的服务。再往上面,提供对内的一些数据产品,对高管、对小二,可能还有一些对外的,比如说像优酷的播放数,包括热度这些对应用的数据。 这张图其实就是我们从Hadoop迁到MaxCompute平台上以来,两个非常经典的案例。我们通过数据中台对不同场景的用户打通,来去赋能到两个不同的场景,提升业务价值。 第二个,可能是内部的,我们通过优酷,还有集团内部的一些BU去做换量,我们通过统一的标签去做样本放大,把优酷的量导给其它的BU,把其它BU的量导给优酷,这样去达到一个共赢的效果。 这张图大部分互联网公司不太会涉及到,就是关于反作弊的问题。这个是我们在MaxCompute做的一个反作弊的架构,通过原始的数据去提取它的特征,然后再通过算法模型,包括机器学习、深度学习、图模型去支持流量反作弊、渠道反作弊等等。再通过业务场景上反作弊的监控工具,把监控到的作弊信息去打一个黑白样本,再把这个黑白样本跟特征一起来不断的迭代优化算法模型。同时针对算法模型,做一个模型的评价,不断来完善反作弊体系。 最后一点,其实还是跟成本相关,在日常使用中,一定是有小白用户或者一些新来的用户去错误的使用或者不在乎的使用一些资源,比如经常会有一些实习生或者是非技术的同学,如分析师,一个SQL消费比较高,这个其实是非常浪费资源,而且可能他一个任务,让其他所有人的任务都在这儿等着排队,实际上我们会去对整个的资源做一个治理。 从节点的粒度上,通过大数据来治理大数据,我们可以算出哪些表产出来之后,多少天没有被读取的,包括它的访问跨度可能没有那么大的,我们会去做下线或者去做治理,有一些业务场景可能并不是非常的重要或者它的时间要求没有那么高,比如一些算法训练,可以去做一些错峰的调度,保证水位不要太高。从MaxCompute任务的角度,可以算出哪些任务有数据倾斜、哪些数据可能会有相似计算,哪些任务需要去做MapJoin,哪些任务需要去做一些裁剪,然后来节省它的IO。还有哪些任务会去做暴力扫描,扫一个月、扫一年的数据,哪些数据可能会有这样一个数据膨胀,比如说它做了CUBE之类的这种复杂计算,一些算法模型的迭代;我们通过数据计算出来的这些迹象,去反推用户,来去提高它的这样一个数据的质量分,来去达到我们降低整个计算资源的目的。 在计算平台的角度,我们也持续的在使用MaxCompute推出的一些非常高级的用法,比如我们这边的HBO、Hash Cluster、Aliorc,HBO就是我们基于一个历史的优化,这样避免了用户不知道怎么调参,我可能为了自己任务快一点,就调一个特别大的参数,这样的话,对集成的资源是非常浪费的。通过这个功能,用户就不用去调参数,集群自动调好,用户就写好自己业务逻辑就好了。 第二块,可能就是最近两年推出的Hash Cluster,当时在使用Hadoop的时候经常会出现,两个大表Join的时候计算不出来,这个Hash Cluster其实是一个优化的利器。大表跟小表Join,可以做一些分发,做一些优化。大表跟大表就涉及到一个排序的问题。这个Hash Cluster,实际上就是提前把数据排好,中间省掉很多计算环节,来达到效率提升的目的。 第三个,Aliorc,在一些固定的场景上面,可以稳定的提升20%的计算效率。 第四个,Session。对一些比较小的数据,直接就放到SSD或缓存里面,一个节点下游有100个叶子场景,是非常友好的,因为低延迟秒出结果。同时,优酷也在使用Lightning解决计算加速,这个是在一个计算架构方案上的优化,它是一个MPP的架构。 最后一页是存储的优化,因为像一些关键的原始数据或者是需要审计的数据是不能删的,永久不能删的。实际上就会造成我们数据存储的趋势是一直往上不减的,计算会在某一个时间点达到一个平衡。当前用这么多的计算资源,再往后,其实应该也不会再大涨了,比如说旧的业务逻辑下掉了,会换新的业务逻辑,这样会保持在一个相对平稳的波动上面。但是储存,因为它有一些历史的数据是永远不能删的,可能会出现一直在增长,而且是指数级的。所以我们也会持续关注存储的情况,我们主要有四个手段。 第一个,还是通过大数据来治大数据,去看哪些表它的访问不够或者它的访问跨度不够。就是对一些生命周期的优化,来去控制它的增速。包括下面的,刚才提到的Aliorc,实际上是做压缩的,我们会去做一些大字段的拆分,来提高压缩的比例。 OK,这个是优酷在MaxCompute中的一些应用场景,感谢大家的聆听。 本文作者:隐林阅读原文 本文为云栖社区原创内容,未经允许不得转载。

June 12, 2019 · 1 min · jiezi

王真催的面试题

.讲一下第一个项目hive中shuffle的优化 压缩压缩可以使磁盘上存储的数据量变小,通过降低I/O来提高查询速度。 对hive产生的一系列MR中间过程启用压缩 set hive.exec.compress.intermediate=true;set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;对最终输出结果压缩(写到hdfs、本地磁盘的文件) set hive.exec.compress.output=true;set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;join优化 map join 如果关联查询两张表中有一张小表默认map join,将小表加入内存 hive.mapjoin.smalltable.filesize=25000000 默认大小 hive.auto.convert.join=true 默认开启 如果没有开启使用mapjoin,使用语句制定小表使用mapjoin ```sql select /*+ MAPJOIN(time_dim) */ count(1) from store_sales join time_dim on (ss_sold_time_sk = t_time_sk) ``` 2. smb join Sort-Merge-Bucket join 解决大表与大表join速度慢问题 通过分桶字段的的hash值对桶的个数取余进行分桶 3. 倾斜连接 ```xml <!-- hive.optimize.skewjoin:是否为连接表中的倾斜键创建单独的执行计划。它基于存储在元数据中的倾斜键。在编译时,Hive为倾斜键和其他键值生成各自的查询计 划。 --> <property> <name>hive.optimize.skewjoin</name> <value>true</value> </property> <property> <!-- hive.skewjoin.key:决定如何确定连接中的倾斜键。在连接操作中,如果同一键值所对应的数据行数超过该参数值,则认为该键是一个倾斜连接键。 --> <name>hive.skewjoin.key</name> <value>100000</value> </property> <!-- hive.skewjoin.mapjoin.map.tasks:指定倾斜连接中,用于Map连接作业的任务数。该参数应该与hive.skewjoin.mapjoin.min.split一起使用,执行细粒度的控制。 --> <property> <name>hive.skewjoin.mapjoin.map.tasks</name> <value>10000</value> </property> <!-- hive.skewjoin.mapjoin.min.split:通过指定最小split的大小,确定Map连接作业的任务数。该参数应该与hive.skewjoin.mapjoin.map.tasks一起使用,执行细粒度的控制。 --> <property> <name>hive.skewjoin.mapjoin.min.split</name> <value>33554432</value> </property> ```Hive在集群过程中怎么解决数据倾斜本质原因:key的分布不均导致的 ...

June 8, 2019 · 4 min · jiezi

hadoop277安装和集群适用hadoop312和docker容器

准备hadoop2(master), Hadoop3,hadoop4,三台机器 vi /etc/profile.d/hadoop.sh export JAVA_HOME=/usr/local/src/jdk1.8.0_92export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATHexport JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/binexport PATH=$PATH:${JAVA_PATH}export HADOOP_HOME=/usr/local/src/hadoop-2.7.7export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbinexport HDFS_DATANODE_USER=rootexport HDFS_DATANODE_SECURE_USER=rootexport HDFS_SECONDARYNAMENODE_USER=rootexport HDFS_NAMENODE_USER=rootexport YARN_RESOURCEMANAGER_USER=rootexport YARN_NODEMANAGER_USER=root mapred-env.sh hadoop-env.xml yarn-env.sh 至少有一个设置JAVA_HOME core-site.xml,配置hdfs端口和地址,临时文件存放地址 更多参考core-site.xml <configuration><property> <name>fs.default.name</name> <value>hdfs://hadoop2:9091</value></property><property> <name>hadoop.tmp.dir</name><value>/data/docker/hadoop/tmp</value></property></configuration>hdfs-site.xml, 配置HDFS组件属性,副本个数以及数据存放的路径 更多参考hdfs-site.xml dfs.namenode.name.dir和dfs.datanode.data.dir不再单独配置,官网给出的配置是针对规模较大的集群的较高配置。 <font color=red>注意:这里目录是每台机器上的,不要去使用volumes-from data_docker资源共享卷</font> 三台机器同时做 mkdir -p /opt/hadoop/tmp && mkdir -p /opt/hadoop/dfs/data && mkdir -p /opt/hadoop/dfs/name <configuration> <property> <name>dfs.namenode.http-address</name> <value>hadoop2:9092</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop/dfs/data</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property></configuration>mapred-site.xml,配置使用yarn框架执行mapreduce处理程序 ...

June 3, 2019 · 2 min · jiezi

Windows安装Hadoop

1.下载解压安装配置Hadoophttps://www.jianshu.com/p/1e7... 2.Hadoop Error: JAVA_HOME is incorrectly set. 问题https://www.cnblogs.com/honey...注:上文中的第二种解决办法不好用,用第一种就不错! 3.启动时datanode端口被占用netstat -aon|findstr "50010"查看到记录的最右边一项是占用该端口进程PID打开任务管理器 => 详细信息,找到PID对应的进程,关掉即可。我的是Window10的商店。。哈哈

June 1, 2019 · 1 min · jiezi

Hadoop-HA

Hadoop HA什么是 HAHA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。 hadoop HA机制介绍hadoop2.0的HA 机制有两个namenode,一个是active namenode,状态是active;另外一个是standby namenode,状态是standby。两者的状态是可以切换的,但不能同时两个都是active状态,最多只有1个是active状态。只有active namenode提供对外的服务,standby namenode是不对外服务的。active namenode和standby namenode之间通过NFS或者JN(journalnode,QJM方式)来同步数据。active namenode会把最近的操作记录写到本地的一个edits文件中(edits file),并传输到NFS或者JN中。standby namenode定期的检查,从NFS或者JN把最近的edit文件读过来,然后把edits文件和fsimage文件合并成一个新的fsimage,合并完成之后会通知active namenode获取这个新fsimage。active namenode获得这个新的fsimage文件之后,替换原来旧的fsimage文件。这样,保持了active namenode和standby namenode的数据的实时同步,standby namenode可以随时切换成active namenode(譬如active namenode挂了)。而且还有一个原来hadoop1.0的secondarynamenode,checkpointnode,buckcupnode的功能:合并edits文件和fsimage文件,使fsimage文件一直保持更新。所以启动了hadoop2.0的HA机制之后,secondarynamenode,checkpointnode,buckcupnode这些都不需要了。 搭建 hadoop HA 集群环境linux: CentOS-7.5_x64hadoop: hadoop-3.2.0zookeeper: zookeeper-3.4.10 机器规划主机名IP安装软件运行进程node-1192.168.91.11hadoopNameNode,ResourceManager,DFSZKFailoverControllernode-2192.168.91.12hadoop,zookeeperNameNode,ResourceManager,QuorumPeerMain,DFSZKFailoverControllernode-3192.168.91.13hadoop,zookeeperQuorumPeerMain,DataNode,NodeManager,JournalNodenode-4192.168.91.14hadoop,zookeeperQuorumPeerMain,DataNode,NodeManager,JournalNode前置准备四台机器需要ssh免密登录,node-2,node-3,node-4需要安装zookeeper、java环境 集群搭建# 下载$ wget http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.2.0.tar.gz# 解压$ tar -zxvf hadoop-3.2.0.tar.gz# 配置系统的环境变量$ vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_191export PATH=$PATH:$JAVA_HOME/binexport HADOOP_HOME=/export/servers/hadoop-3.2.0export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin# 进入解压目录配置环境变量$ cd $HADOOP_HOME# 配置hadoop-env.sh 添加下面配置(不配置启动会报错)$ vim etc/hadoop/core-site.xmlexport JAVA_HOME=/usr/local/jdk1.8.0_191export HDFS_NAMENODE_USER=rootexport HDFS_DATANODE_USER=rootexport HDFS_JOURNALNODE_USER=rootexport HDFS_SECONDARYNAMENODE_USER=rootexport YARN_RESOURCEMANAGER_USER=rootexport YARN_NODEMANAGER_USER=root# 配置core-site.xml$ vim etc/hadoop/core-site.xml<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file.--><!-- Put site-specific property overrides in this file. --><configuration> <!-- HA 配置指定 hdfs 的 nameService 为ns --> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!-- HA 配置,指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>node-2:2181,node-3:2181,node-4:2181</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoop/temp</value> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property></configuration># 配置hdfs-site.xml$ vim etc/hadoop/hdfs-site.xml<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file.--><!-- Put site-specific property overrides in this file. --><configuration> <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns</value> </property> <!-- bi下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>node-1:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>node-1:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>node-2:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>node-2:50070</value> </property> <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node-3:8485;node-4:8485/ns</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/export/data/hadoop/journaldata</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.bi</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>dfs.ha.namenodes.jn</name> <value>node-3,node-4</value> </property></configuration># 配置mapred-site.xml$ vim etc/hadoop/mapred-site.xml<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file.--><!-- Put site-specific property overrides in this file. --><configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property></configuration># 配置yarn-site.xml$ vim etc/hadoop/yarn-site.xml<?xml version="1.0"?><!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file.--><configuration><!-- Site specific YARN configuration properties --> <!-- 开启RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node-1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node-2</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node-2:2181,node-3:2181,node-4:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property></configuration># 配置workers节点$ vim $HADOOP_HOME/etc/hadoop/workersnode-3node-4# 拷贝hadoop到其他节点(node-2,node-3,node-4)$ scp -r hadoop-3.2.0 root@node-2:/xxx/xxx/hdfs HA 配置# 启动zookeeper集群$ $ZOOKEEPER_HOME/bin/zkServer.sh start# 查看zookeeper状态$ $ZOOKEEPER_HOME/bin/zkServer.sh status# 启动 JournalNode 集群 分别在 node-3、node-4 上执行以下命令$ hdfs --daemon start journalnode# 格式化 ZooKeeper 集群$ hdfs zkfc -formatZK# 格式化集群的 NameNode (在 node-1 上执行)$ hdfs namenode -format# 启动刚格式化的 NameNode (在 node-1 上执行)$ hdfs --daemon start namenode# 同步 NameNode1 元数据到 NameNode2 上 (在 node-2 上执行) $ hdfs namenode -bootstrapStandby# 启动 NameNode2 (在 node-2 上执行)$ hdfs --daemon start namenode# 启动集群中所有的DataNode (在 node-1 上执行) $ sbin/start-dfs.sh# 启动 ZKFC 进程 (在 node-1 和 node-2 的主机上分别执行如下命令)$ hdfs --daemon start zkfc# 验证ha(在node-1节点停掉namenode进程)$ hafs --daemon stop namenoderesourceManager HA 配置# 在 RM1 启动 YARN (在 node-1 上执行)$ yarn --daemon start resourcemanager# 在 RM2 启动 YARN (在 node-2 上执行)$ yarn --daemon start resourcemanager# 在任意节点执行获取resourceManager状态(active)$ yarn rmadmin -getServiceState rm1# 在任意节点执行获取resourceManager状态(standby)$ yarn rmadmin -getServiceState rm2# 验证 yarn 的 ha(在node-1节点执行)standby 的 resourcemanager 则会转换为 active$ yarn --daemon stop resourcemanager# 在任意节点执行获取resourceManager状态(active)$ yarn rmadmin -getServiceState rm2总结搭建hadoop HA 过程中遇到了很多各种各样的问题上述步骤都是经过验证的如在安装过程中遇到问题可以留言,谢谢! ...

May 22, 2019 · 4 min · jiezi

HBase浅度学习

简介hbase是大数据hadoop的数据库存储数据 支持海量数据的存储hbase是构建在hdfs上的分布式数据库检索数据 hbase支持对存储在hbase表中的海量数据进行随机的实时的查询服务 hbase对其大表中的海量数据构建了层层索引 已经有RDBMS数据库为什么还需要hbase这种hadoop数据库?(什么时候需要选择hbase)要存储的数据为海量的数据 RDBMS 集群性能比较弱,不容易集群节点扩展 一旦存储的表的数据量较大,导致表的索引文件也变大,影响到后续的读写效率 hbase 构建在hdfs上分布式数据库,支持节点无限扩展 hbase的出现就是RDBMS在面对海量数据存储及检索时的一个可替代工具/框架要存储的数据为非结构化的数据 结构化数据 mysql或hive表中的数据结构化的数据 非结构化的数据 每条数据的字段数量不相同 图片、视频、文本数据都是非结构化的数据 hbase是一种nosql数据库(非关系型数据库)“Not Only SQL”的缩写,不仅仅是sql ,以nosql数据库在记录数据时所使用的数据结构的不同将nosql数据库分为四大家族 列存储数据库家族 -- 代表 hbase 表中每列的数据是一个连续的存储单元 hive表或者mysql中默认每行的数据是一个连续的存储单元 文档型数据库家族 -- 代表MongoDB 以文档形式记录数据库中的数据 爬虫项目中 键值对数据库家族 --代表redis 以key-value形式记录数据的数据库 redis是基于内存的key-value数据库 sparkStreaming/strom/Flink进行实时分析计算-》redis-》接入前端进行实时更新展示图形结构数据库家族--代表Neo4J 以图形形式记录数据 https://baike.baidu.com/item/... hbase常见的应用场景接入在线业务提供内容查询服务 (借助hbase分布式数据库进行海量用户数据的存储,并依靠其完善的检索机制为海量数据提供随机的实时的查询服务)微博、论坛、朋友圈等社交数据的存储 海量数据 图片、视频、文本数据都是非结构化的数据各大电商平台的订单数据 未完成的订单(热数据)-- oracle已完成的订单(冷数据)-- hbase物流信息存储查询银行客户交易数据支付公司的交易数据移动电信公司的话单记录存储交通数据存储医疗数据 大数据分析平台中的数据存储库 可以用hbase作为大数据分析平台中的数据源 MapReduce、hive、spark等计算框架可以直接从hbase表中读写数据 HBase在滴滴出行的应用场景和最佳实践https://blog.51cto.com/xiaogo... hbase的特点:hbase源自于谷歌三大论文之一的 BigTable GFS -- hdfs MapReduce -- MapReduce BigTable -- hbase hbase在hadoop生态圈中的地位 构建在hdfs上分布式数据库,支持海量数据的存储 可以MapReduce、hive、spark框架进行集成使用 基于【列存储】的数据库 列存储与行存储 RDBMS数据库都是默认行存储 每行的数据在底层是一个连续的存储单元 在select查询时如果只涉及到表中的其中几列数据,则无关列也会被加载读取,大大增加系统的io流 Hbase数据库默认是列存储 每列的数据在底层是一个连续的存储单元 在select查询时如果只涉及到表中的其中几列数据,则只有涉及到的列会被加载读取 因为每列的数据保存在一起,并且每列的数据的数据类型相同,则更容易实现压缩存储 适合存储非结构化和结构化的数据 基于key-value形式存储的数据库 根据key来获取对应的value值 rowkey+列簇+列+时间戳 =》value高可靠、高性能、可伸缩的分布式数据库 高可靠、可伸缩:构建在hdfs上 高性能:对比RDBMS,针对海量数据的读写是高性能的 行存储与列存储 https://blog.csdn.net/dc_726/... ...

May 18, 2019 · 18 min · jiezi

Hive浅度学习指南

hive介绍由Facebook开源的,用于解决海量结构化日志的数据统计的项目 本质: 将HQL转化为MapReduce程序 Hive的其实时HDFS上的目录和文件 Hive的安装模式嵌入模式元数据信息被保存在自带的Deybe数据库中 只允许创建一个连接 多用于Demo 本地模式元数据信息被保存在MySQL数据库 MySQL数据库与Hive运行在同一台物理机器上 多用于开发和测试 远程模式元数据信息被保存在MySQL数据库 MySQL数据库与Hive运行在不同台物理机器上 用于实际生成环境 Linux下MySQL安装 1) 卸载 $ rpm -qa | grep mysql $ sudo rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps 2) 安装 可选择将缓存替换,然后再安装 $ sudo cp -r /opt/software/x86_64/ /var/cache/yum/ $ sudo yum install -y mysql-server mysql mysql-devel 3) 启动mysql服务 $ sudo service mysqld start 4) 设置密码 $ /usr/bin/mysqladmin -u root password '新密码' ...

May 16, 2019 · 13 min · jiezi

Flume浅度学习

flume简介cloudera 公司开源的,贡献给Apache基金会 http://flume.apache.org/ http://archive.cloudera.com/c... 只能运行在linux系统上 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application. flume用来高效的收集、聚合、移动大量的日志数据 ...

May 15, 2019 · 4 min · jiezi

Namenode启动后挂掉连不上journalnode

使用start-dfs.sh启动HDFS后,jps查看到有namenode进程,但是过一会没了。查看日志,是连不上8485端口,8485配的是journalnode,也就是说连不上journalnode而挂掉的。 参考https://segmentfault.com/a/11...,ha的集群需要先启动journalnode,那么node再连接journalnode,所以再搭建hadoop ha时,先手动启动的journalnode没有问题。可是start-dfs.sh是先启动namenode,后启动journalnode,然后让namenode进程启动后去等待重试连接journalnode,所以如果有时候journalnode启动慢了,可能namenode就启动不了挂了,这就是为什么会出现jps中出现了namenode而一会儿又消失的原因。 找到原因了,就对症下药:(二选一)1.修改core-site.xml配置,让namenode多等一会儿,详见原文出处;2.手动启动挂掉的namenode

May 15, 2019 · 1 min · jiezi

OPPO数据中台之基石基于Flink-SQL构建实数据仓库

本文整理自 2019 年 4 月 13 日在深圳举行的 Flink Meetup 会议,分享嘉宾张俊,目前担任 OPPO 大数据平台研发负责人,也是 Apache Flink contributor。本文主要内容如下: OPPO 实时数仓的演进思路;基于 Flink SQL 的扩展工作;构建实时数仓的应用案例;未来工作的思考和展望。一.OPPO 实时数仓的演进思路 1.1.OPPO 业务与数据规模 大家都知道 OPPO 是做智能手机的,但并不知道 OPPO 与互联网以及大数据有什么关系,下图概要介绍了 OPPO 的业务与数据情况: OPPO 作为手机厂商,基于 Android 定制了自己的 ColorOS 系统,当前日活跃用户超过 2 亿。围绕 ColorOS,OPPO 构建了很多互联网应用,比如应用商店、浏览器、信息流等。在运营这些互联网应用的过程中,OPPO 积累了大量的数据,上图右边是整体数据规模的演进:从 2012 年开始每年都是 2~3 倍的增长速度,截至目前总数据量已经超过 100PB,日增数据量超过 200TB。要支撑这么大的一个数据量,OPPO 研发出一整套的数据系统与服务,并逐渐形成了自己的数据中台体系。 1.2.OPPO 数据中台 今年大家都在谈数据中台,OPPO 是如何理解数据中台的呢?我们把它分成了 4 个层次: 最下层是统一工具体系,涵盖了"接入 - 治理 - 开发 - 消费"全数据链路;基于工具体系之上构建了数据仓库,划分成"原始层 - 明细层 - 汇总层 - 应用层",这也是经典的数仓架构;再往上是全域的数据体系,什么是全域呢?就是把公司所有的业务数据都打通,形成统一的数据资产,比如 ID-Mapping、用户标签等;最终,数据要能被业务用起来,需要场景驱动的数据产品与服务。以上就是 OPPO 数据中台的整个体系,而数据仓库在其中处于非常基础与核心的位置。 ...

May 14, 2019 · 4 min · jiezi

ubuntu下编译Hadoop

Ubuntu 下编译 Hadoop-2.9.2系统环境系统: ubuntu-18.10-desktop-amd64maven: Apache Maven 3.6.0jdk: jdk_1.8.0_201ProtocolBuffer: portoc-2.5.0OpenSSL: OpenSSL 1.1.1cmake: cmake3.12.1hadoop: hadoop-2.9.2安装所需环境# 安装各种所需依赖库$ sudo apt-get install autoconf automake libtool zlib1g-dev pkg-config libssl-dev libsnappy-dev libbz2-dev# 安装ssh-server$ sudo apt-get install ssh-server# 安装openssl$ sudo apt-get install openssl# 安装cmake$ sudo apt-get install cmake # 安装编译c++库$ sudo apt-get install g++# 安装protobuf# 下载protobuf-2.5.0$ wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz# 解压缩$ tar -zxvf protobuf-2.5.0.tar.gz# 进入protobuf解压缩目录配置$ ./configur --prefix=/usr/local/protoc-2.5.0# 编译安装$ make && make install# 配置到环境变量中~/.bash_profileexport PATH="/usr/local/protoc-2.5.0/bin:$PATH"编译过程中可能遇到的问题注意 libssl-dev安装换成 libssl1.0-dev版本。 我之前就是默认安转,在编译OpenSSL功能的时候一直卡主编译不通过。具体错误形式如下 ...

May 13, 2019 · 4 min · jiezi

ZooKeeper安装效果演示

高可用(HA) -- ZooKeeperZooKeeper一个开源的分布式的,为分布式应用提供服务的项目提供原语集合以便分布式应用可以在它之上构建更高层次的同步服务角色 观察者模式: leader: 领导者负责进行投票的发起及决议, 更新状态 学习者: follower: 接受客户端请求并发挥客户端返回结果,参与投票 observer: 接受请求,转发给leader,不参与投票,只同步leader. 客户端: 发起请求 观察者模式的应用: 软件皮肤, 编辑工具设置安装 伪分布模式 1)安装ZooKeeper (再次注意权限)$ tar -zxf /opt/software/zookeeper-3.4.5.tar.gz -C /opt/modules/2)新建一个Zookeeper的data目录$ mkdir zkData --//可以不用手动创建,启动自动生成3)修改配置文件${ZOOKEEPER_HOME}/conf (注意: 配置文件为模板,需拷贝重名为zoo.cfg)$cd /opt/modules/zookeeper-3.4.5/ ##切换目录到zookeeper-3.4.5$ cp conf/zoo_sample.cfg conf/zoo.cfg ##拷贝$ vi conf/zoo.cfg ##修改12行,设置以下:dataDir=/opt/modules/zookeeper-3.4.5/zkData4)启动zookeeper$bin/zkServer.sh start$ jps #查看java进程如下2088 QuorumPeerMain5)查看zookeeper的状态$bin/zkServer.sh status #信息如下JMX enabled by defaultUsing config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfgMode: standalone #单机模式6)一些命令的认识$ bin/zkCli.sh #进入zookper help #查看命令 quit #退出 create #创建 -e临时znode -s 自动编号 get path #查看信息 ls path #查看指定目录的列表 rmr path #删除ls / #查看根目录create -e /myapp msg #创建目录 get /myapp #查看myapp创建信息 ls / watch # 添加关注事件rmr /myapp #删除触发关注事件 quit 完全分布模式 ...

May 12, 2019 · 4 min · jiezi

Mac-下编译-Hadoop

Mac 下编译 Hadoop-2.9.2系统环境系统: Mac OS_10.14.4maven: Apache Maven 3.6.0jdk: jdk_1.8.0_201ProtocolBuffer: portoc-2.5.0zlib: 1.2.3-libOpenSSL: 1_0_2rcmale: 3.14.3-win64-x64Cygwin: 2.897_x86_64hadoop: hadoop-2.9.2snappy: 搭建编译环境1.java环境在oracle官网下载安装安装好配置好环境变量2.maven我用的是brew直接安装的`brew install maven`3.cmake 使用brew安装 `brew install cmake`4.openssl 使用brew安装 `brew install openssl`5.snappy 使用brew安装 `brew install snappy`6.zlib 使用brew 安装 `brew install zlib`7.protobuf由于必须使用2.5.0版本需要自行[下载](https://github.com/protocolbuffers/protobuf/releases)安装下载后解压后进入protobuf目录# 配置$ ./configure --prefix=/usr/local/Cellow/protoc/2.5/# 编译$ make# 安装$ make install# 配置环境变量 `~/.bash_profile` 或 `~/.zshrc`export PATH="/usr/local/Cellow/protoc/2.5/bin:$PATH"# 验证protoc版本$ protoc --version过程中可能遇到的问题1.[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (make) on project hadoop-pipes: An Ant BuildException has occured: exec returned: 1[ERROR] around Ant part ...<exec dir="/Users/Downloads/hadoop-2.9.2/hadoop-tools/hadoop-pipes/target/native" executable="cmake" failonerror="true">... @ 5:153 in /Users/Downloads/hadoop-2.9.2/hadoop-tools/hadoop-pipes/target/antrun/build-main.xml ...

May 11, 2019 · 4 min · jiezi

Hadoop中间结果lzop压缩

为了节省磁盘空间,文件的存储往往需要压缩,有的需要压缩比大,有的需要压缩速度快。而对于一套计算的结果存储,如多个MapReduce之间,需要能支持分片的压缩方式。lzop就是个可以支持分片的压缩方式,非常适合用于多个MapReduce之间的计算中间结果存储。 一、在Hadoop上安装lzop与在hive上的使用https://www.iteblog.com/archi... 二、添加索引以支持分片lzop默认是不支持分片的,需要添加索引。https://www.iteblog.com/archi...

May 4, 2019 · 1 min · jiezi

Zookeeper启动失败(CentOS 7 防火墙)

zookeeper配置:1.zoo.cfg的server.id=host:2888:38882.zoo.cfg的dataDir3.在dataDir中创建myid文件,写入当前节点的id 正确配置下zookeeper启动失败,ssh免密登录也已配置,查看zookeeper.out java.net.NoRouteToHostException: No route to host可能是防火墙没有关。CentOS 7 关闭防火墙命令: systemctl start firewalld #启动systemctl stop firewalld #关闭systemctl status firewalld #查看状态systemctl disable firewalld #停用(开机不启动)systemctl enable firewalld #启用(开机自启动)

April 22, 2019 · 1 min · jiezi

你应该知道的 HBase 基础,都在这儿了

阿里妹导读:2006 年10 月Google 发布三架马车之一的《Bigtable:A Distributed Storage System for Strctured Data》论文之后,Powerset 公司就宣布 HBase 在 Hadoop 项目中成立,作为子项目存在。后来,在2010 年左右逐渐成为 Apache 旗下的一个顶级项目。可能是实际应用中包装得太好,很多人对于 HBase 的认识止步于 NoSQL 。今天,蚂蚁金服的南俊从基础开始讲起,希望有助于增强大家在实际业务中对 HBase 的理解。一、 HBase 简介 HBase 名称的由来是由于其作为 Hadoop Database 存在的,用来存储非结构化、半结构化数据。 要想知道 HBase 的用途,就需要看一看其在 Apache 的 Hadoop 生态系统中的位置,可以看到 HBase 是构建在 HDFS 之上的,这是由于 HBase 内部管理的文件全部都是存储在 HDFS 当中的。同时,MapReduce 这个计算框架在 HBase 之上又提供了高性能的计算能力来处理海量数据。此外还有一些像 Pig、Hive 用来提供高层语言的支持。还有 Sqoop 用来完成传统数据库到 HBase 之间的数据迁移。类似衍生出来的新技术还有很多,有兴趣的同学可以自己去了解一下。 Google 的三架马车 BigTable、GFS、MapReduce 现在在开源社区中都能找到对应的实现。HBase 就是 Bigtable 的开源实现,当然这句话不是完全正确,因为两者之间还是有些差异的。但是主要还是基于 BigTable 这个数据模型开发的,因此也是具有 Key-Value 特征的,同时也就具有 Bigtable 稀疏的、面向列的这些特性。 ...

April 22, 2019 · 1 min · jiezi

从用户成为“股东” —— 在 Apache 基金会的 2600 天

3月27日,腾讯云大数据及人工智能产品研发的专家研究员堵俊平受邀成为 Apache 软件基金会Member(Apache Softeware Foundation Member,以下简称 ASF Member),一封名为 “邀请成为 ASF Member” 的电子邮件正式为堵俊平敲开了开源世界的新大门。从用户成为“股东” —— 在 Apache 基金会的 2600 天从 2012年开始为 Hadoop 的初始版本打补丁,堵俊平已经在 Apache Hadoop 社区深耕了近8年,13年10月成为中国第一个 Hadoop 的 Committer, 15年7月 PMC Member,19年3月荣升ASF Member。“我很荣幸,但从此,我也有了更多的责任。” 现在全世界有 883 位 ASF Member ,中国区仅有13人,其中较为出名的包括 Kyligence 联合创始人兼 CEO 韩卿 (Luke Han) ,以及中国开源社的理事长刘天栋 (Ted Liu) 。与在一个项目单元下垂直贡献不同,ASF Member 会收到 Apache 基金会下超过 350 个开源项目的季度报告,横向地对更多的项目起到管理义务。ASF Member 关注的是 Apache 基金会本身,这通常通过项目相关和跨项目活动来证明。从法律上讲,Member 是基金会的“股东”,也是业主之一。他们有权选举董事会,成为董事会选举的候选人。他们也有权作为导师 (Mentor) 提出一个新的孵化项目。有一点需要特别指出,Apache 基金会中从 Committer 开始的每个角色都只能通过他人提名并投票决定,这代表社区伙伴的认可,每上一个新台阶的背后都有着日日夜夜事无巨细的付出:不断贡献高质量代码、提交 patch,组织 release,回答用户问题,参与投票,培养和提名committer,发表合理合适意见,还有一些影响更加深远的贡献,推动腾讯内部持续贡献 Apache 基金会,组织黑客松和 meetup ,身体力行地推广Hadoop,传递开源理念。堵俊平今年的想法是主动去挖掘 1-2 个合适的项目,推荐进入孵化流程,“Mentor 有点像投资人,只不过我们是拿出自己的时间来投资”,堵俊平做了这样的比喻,时间比资金更有限、更私人,所以选择开源项目时会坚持从技术驱动,在自己有兴趣的领域帮助有潜力的项目快速成熟。代码、人,社区都在成长 —— Apache 基金会的运作模式Apache 基金会的官网上有几十份、累计数十万字的文档内容在介绍 Apache 基金会的运作模式,在真正接触到基金会的“内部人士”前,外界似乎很难相信一个跨时区、跨文化、跨公司的组织能够严格按照这样的模式运作了20年。它详细到超乎想象,哪怕是针对一些意外情况,也多能在这些文档找到解决方案。“ASF Member 想要退休怎么办?”,“决策投票的有效期在跨时区的情况下如何保证?”,“投出+0.9票的成员是怎么想的”……诸如此类。Apache 基金会中的每个人、每个项目、每个社区,都并非固定一成不变的,它是一个极其动态的过程,每个人、项目和社区时刻都在成长,而这一切是透明的,作为一个普通用户,几乎不要花多少功夫,你就能找到这个庞大的社区每天发生的一切变化:代码量的增减、提交者的变化、最新的Release清单。Apache 基金会像是一个精密的齿轮,日夜不停地转动,开源这个概念自身的魅力正是其磨合剂。作为社区中的人,只要你参与在 Apache 基金会的项目中,你就肯定能找到一个对应角色:•用户(User):开始使用一个或多个 Apache 基金会的开源项目。•贡献者(Contributor):提交代码或文档的patches,在官方渠道(邮件列表,IRC等)支持其它用户。•提交者(Committer):持续贡献,坚持贡献,被提名、投票通过后,拥有直接访问并提交代码的权限。•项目管理成员(PMC Member):做了更多不局限于代码的贡献,进入单个项目个管理委员会,通过投票影响这个项目的发展方向。•Apache 基金会成员(ASF Member):对 Apache 基金会直接负责,在多个项目中做出贡献,拥有董事会的投票权。如果你已经在维护一个开源项目,想让它进入Apache基金会,那你则需要充分了解项目在社区不断演进的过程,“提名→进入孵化器→成为顶级项目”,每一步都有迹可循。 (图为一个开源项目进入孵化器的过程)从 Apache Way 到 Tencent Way—— 以 TOSA 加速力行开源实践Apache 之道影响了包括腾讯在内的众多中国公司,近几年,中国的开源爱好者们在大会演讲中终于不是只会讲系统是如何设计的、代码是如何实现的,“开源社区”成为业内一个有点抽象的流行词。“社区”到底是什么?其实就是多人+互动关系,开源社区就是指大家的互动关系围绕着开源项目而产生。不过这种关系并不会凭空产生,原始开发者需要站在一个完全陌生的开发者角度去思考“我为什么要加入你?”这里有很多方法已经在 Apache 之道中得到总结:首先这应该是一个创新的项目,简单易懂的上手指南、详细全面的项目文档、统一规范的代码格式都能够降低其他开发者的门槛,吸纳贡献者之前要先想清楚项目需要哪方面的帮助,贡献者加入之前也要明确如何协调工作。对于自由开发者来说,践行以上方法,可能只需要多一点点决心而已,但对于公司体制下的开源开发者,得到公司和所在团队的支持也许更加实际。18年中旬,腾讯正式成立了开源管理办公室,腾讯BG相对独立、自下而上的管理模式其实和 Apache 软件基金会颇有类似之处,因此这个办公室的组织架构也设计成类似于 Apache 软件基金会的模式。开源合规组应对开源的法律风险,TPMC聚集了每个项目的内外部开发者,而这个略带江湖气息的腾讯开源联盟TOSA则是整个组织的大脑,负责思考腾讯开源要向哪个方向前行。堵俊平现任腾讯开源联盟的主席,除了负责 Apache 基金会 的各项事宜外,他还主动承担起管理和治理腾讯开源工作的职责。“我非常高兴能看到腾讯开源选择 Apache 的模式,这奠定了一个项目不断壮大的基础,对于发展中遇到的问题,我会坚持开放透明的方式去解决”,堵俊平提出了三点目标:
改进腾讯开源的审核流程。发布统一的审核平台,能让大家看到自己及其它正在审核中的项目的进程,尽量从内部开始,就把流程透明化。此外,目前开源前的审核大多是法律方面的流程,很少有针对项目本身代码质量、文档建设的考量,开源后会不会被骂谁也没有把握,我希望腾讯也能有个的导师制度,导师深度参与到一个新的开源项目中,给予帮助。我们甚至可以建立一个tencent-incubator的仓库,放置一些不那么成熟的项目,这样外部开发者使用的时候也更容易选择:选择成熟的,成本低;选择孵化中的,有机会一起改变。帮助项目构建外部的生态。对于构建开源项目的外部生态,堵俊平表示这对腾讯来说并不是一个轻松的过程,除了他个人可以作为Mentor推荐腾讯的开源项目在Apache 基金会中孵化成顶级项目以外,腾讯云也在持续为开源Hadoop等项目贡献patch和feature,包括验证release用于生产环境。他表示腾讯云愿意为开源项目提供支持,可能有很多方式,帮助开源项目打包成商业级服务在腾讯云上便捷的提供给用户,或者组织技术大会给开源提供更多的曝光窗口等。建立腾讯对开源的评估体系。“国内有一些有关各大公司开源水平的评价新闻我认为并不够确切,纯粹去比拼数量和Star其实是个简单粗暴的行为”,堵俊平谈到:“就像 Apache 基金会对孵化的项目提出的要求——至少有来自三家公司以上的贡献者才能毕业,这个行为其实是在保护用户,我希望腾讯对于自己的开源项目也能有一些更加细致、更加专业的评估体系,这样无论在任何场合,面对任何报道,我们都让外界对腾讯的开源、腾讯的技术充满信心。”关于腾讯开源腾讯开源始于2010年。在开放战略背景下,腾讯在内部开始推行“开放、共享、合力开发”的研发模式。如今,腾讯已有超过8000个内部开源的开发项目(组件)在公司跨团队、跨部门、跨业务地运用。从2016年起,腾讯开始将内部优质项目对外发布,以Github为主要阵地进行开源项目经营,腾讯对外开源开始进入了快节奏时代。目前,腾讯已将三个广受社区的认可的开源项目TARS、TSeer和Angel分别捐赠Linux基金会和Linux深度学习基金会长期运作。同时,腾讯已成为Linux 基金会、Apache基金会、Openstack基金会、MariaDB基金会及LF深度学习基金会的白金会员,还加入GPL合作承诺,坚持以专业、合规的方式推进开源工作。 ...

April 18, 2019 · 1 min · jiezi

hadoop配置与wordcount

hadoop配置与wordcount参考的博客大多都是hadoop2.x和低版本的java之上的,配置过程写出来看似很简单,看别人的博客也感觉步骤都差不多,但是自己配置时候出了很多问题:datanode启动不了,网页不能正常显示,datanode莫名死掉,resourcemanager启动不了,nodemanager启动不了,mapreduce过程中无法连接到slave等等。这个过程看博客看日志折腾了许多时间才弄好,记录一下。我是在虚拟机中安装了四个linux系统作为节点,所需环境相同,因此这里先配置一台,然后用虚拟机自带的功能直接复制得到其他三台。环境:Macos , Parallels DesktopLinux 16.04Jdk 1.8.0Hadoop 3.2.0Java 环境配置在oracle官网下载最新的jdk压缩文件,复制到安装的目标目录下解压:sudo tar -zxvf jdk-12_linux-x64_bin.tar.gzsudo rm jdk-12_linux-x64_bin.tar.gz然后配置环境变量。可以写在~/.bashrc或者/etc/profile中,其中~/.bashrc是在用户的主目录下,只对当前用户生效,/etc/profile是所有用户的环境变量。vim /etc/profile在末尾加入jdk的环境变量JAVA_HOME=/usr/lib/jdk-12CLASSPATH=.:$JAVA_HOME/lib.tools.jarPATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME CLASSPATH PATH之后source /etc/profile生效,java —version检查是否配置正确。在后面启动resourcemanager时候出现了问题,更换成了jdk8,过程同上。ssh 免密钥连接接着安装hadoop,过程放在下一部分,安装好了之后复制生成三个相同环境的虚拟机。我用的是parallels,相比于其他的比较稳定易用。接着就是分布式的部分了。纯的分布式是很难实现的,hadoop仍然是用一个master来集中式地管理数据节点,master并不存储数据,而是将数据存储在datanode之中,这里命名为slave1, slave2, slave3三个datanode,网络连接均为桥接。因此master需要能免密钥登陆到slave。添加节点的ip地址(为了在ip变化时候不用再重新配置,可以配置静态ip):vim /etc/hosts192.168.31.26 master192.168.31.136 slave1192.168.31.47 slave2192.168.31.122 slave3vim /etc/hostnamemaster # 分别配置slave1, slave2, slave3ping slave1 # 测试安装ssh,这个在ubuntu官方的源里面很慢,我试图换到国内的清华和阿里云等的源,但里面是没有的,也可能是有不同的版本之类的原因吧。懒得去管的话直接耐心等待就好了。sudo apt-get install ssh然后生成公钥和私钥:ssh-keygen -t rsa这里默认路径是用户主目录下.ssh,一路回车就好了。使每台主机能够免密钥连接自己:cp .id_rsa.pub authorized_keys接着为了使master能够免密钥连接到slave,将master的公钥追加到每个slave的authorized_keys中。然后测试是否能够正常连接:ssh slave1安装配置hadoop从官网下载hadoop3.2,解压到/usr/lib/。并且将读权限分配给hadoop用户cd /usr/libsudo tar –xzvf hadoop-3.2.0.tar.gzchown –R hadoop:hadoop hadoop #将文件夹"hadoop"读权限分配给hadoop普通用户sudo rm -rf hadoop-3.2.0.tar.gz添加环境变量:HADOOP_HOME=/usr/lib/hadoop-3.2.0PATH=$HADOOP_HOME/bin:$PATHexport HADOOP_HOME PATH接着是最重要的配置hadoop部分,分别配置HADOOP_HOME/etc/hadoop/下的以下几个文件:hadoop-env.shexport JAVA_HOME=/usr/lib/jdk1.8.0_201core-site.xml<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/lib/hadoop-3.2.0/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property></configuration>hdfs-site.xml<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.name.dir</name> <value>/usr/lib/hadoop-3.2.0/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/usr/lib/hadoop-3.2.0/hdfs/data</value> </property></configuration>yarn-site.xml<configuration> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property></configuration>mapred-site.xml<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.job.tracker</name> <value>master:49001</value> </property> <property> <name>mapred.local.dir</name> <value>/usr/lib/hadoop-3.2.0/var</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property></configuration>workersslave1slave2slave3这些做完之后就配置完了,接着将整个文件夹复制到其他三台主机就完成了。启动格式化namenodehdfs namenode -format # 前提是已经将HADOOP_HOME添加到环境变量中如果看到如上INFO说明这一步成功了。然后运行start脚本:./sbin/start-all.sh # 在hadoop 2.x版本放在./bin/下面用jps查看Java进程,master应该包含NameNode, SecondaryNameNode, ResourceManager,slave应该包含DataNode, NodeManager。这里很常见的问题包括没有datanodes,没有访问权限,resouecemanager不能启动等,一些原因我写在下面了,大部分都是配置出了问题,查看log文件就能找到原因。通过master:9870可以网页查看集群状态。WordCount示例程序wordcount可以说是hadoop学习过程中的"hello world",网上可以找到源码,也可以自己写,我这里直接用了官方$HADOOP_HOME/share/hadoop/mapreduce/下的示例程序。先将输入文件传到dfs中,我这里是自己写了两个含有"hadoop", “hello”, “world"单词的txt文件。然后运行示例程序:hdfs dfs -mkdir /inhdfs dfs -put ~/Desktop/file*.txt /inhadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount /in /out这里可以看到mapreduce分为map和reduce过程。mapreduce分为map,shuffle,reduce过程,先将大任务分到各个节点分别计算,然后shuffle是按照一定的规则将不同的key值分到不同的节点做整合,然后提交任务再reduce整合。查看结果:hdfs dfs -cat /out/part-r-00000至此hadoop集群环境才能说是正确安装了。接下来就是修改wordcount代码自己玩了,上手后就可以自己写了。一些遇到的问题复制配置好的文件夹时候不小心复制错了,复制成了之前一次配置失败时候用过的文件夹,导致datanode启动一直失败,但是全程无提示。谷歌好久解决不了。后来看datanode的log文件找到错误的地方,是core-site.xml出了问题,修改之后重新格式化,启动成功。这个悲伤的故事告诉我们,出了问题先去看看log文件定位错误,大家的错误千奇百怪,谷歌不是万能的。没有resourcemanager和nodemanager:查看日志找到原因为classNoFound(javax.XXXXXXX)。发现是由于java9以上的一些限制,默认禁用了javax的API,参考博客得到解决办法有两个:在yarn-env.sh中添加(但是我试过不可行,由于本人不会java,因此放弃深究)export YARN_RESOURCEMANAGER_OPTS=”–add-modules=ALL-SYSTEM"export YARN_NODEMANAGER_OPTS="–add-modules=ALL-SYSTEM"更换为jdk8第一次运行wordcount程序时候将$HADOOP_HOME/etc/hadoop整个文件夹全传入作为输入,结果出错,根据log发现是内存不足,我的每个虚拟机只开了1G的内存。由此可见这样的配置只是仅仅能够作为熟悉hadoop分布式环境用途,根本达不到能够解决问题的条件。 ...

April 16, 2019 · 1 min · jiezi

hive小结

自动化 MapJoinset hive.auto.convert.join=true;自动化了 MapJoin,之后我们就不需要在 query 中再写了。MapJoin 用于小表 Join 大表的场景,在大表通过 Mapper 时,小表会被完全放入内存中,Hive 会在 map 端进行连接,因为 Hive 可以和内存中的小表进行逐一匹配,从而省略掉 reduce 过程。任务并行set hive.exec.parallel=true;set hive.exec.parallel.thread.number=100;参数 hive.exec.parallel 控制着同一个 sql 中是否允许并行执行,默认为 false,设置为 true 则开启任务的并行执行。并通过设置 hive.exec.parallel.thread.number 来指定同一个 sql 允许并行运行的最大线程数。设置超时时间set mapred.task.timeout=600000000;这里设置的是 Job 运行多久后会因超时而被 kill 掉,根据数据量而定。我目前工作中处理的数据有上亿条,维度近千,所以设置得比较大。“健康监测”set mapred.healthChecker.script.timeout=600000000;这个参数的作用是,若检测到脚本在一定时间内无响应,那么 NodeHealthCheckerService 线程会将该节点的监控状态标注为 “unhealthy”。但 Hadoop 2.x 以后,参数 mapred.healthChecker.script.timeout 的名字已经改为 mapreduce.tasktracker.healthchecker.script.timeout,虽然原名还可用,最好还是使用新的参数名。设置容量大小set hive.tez.container.size=10240;Tez 是 YARN 的作业模式,hive.tez.container.size 参数可设置堆的大小,即增大内存容量。由于 D12 计算机具有 28GB 内存,因此我们常使用 10GB (10240MB) 大小的容器。设置聚集操作执行时机set hive.map.aggr=false;若将该参数设置为 true,则会在 mapper 端先进行 group by,然后执行 merge 操作,减少 reduce 要处理的数据量,效率更高但需要更多内存。若将该参数设置为 false,则把前面的步骤放在了 reduce 阶段再进行。设置 reduce 个数set mapred.reduce.tasks=500;该参数用于设置 reduce 的任务个数,设置为500,即生成500个文件。根据具体数据量进行调整,使得单个 map 能处理合适的数据量。 ...

April 13, 2019 · 1 min · jiezi

hadoop-2.6.0-cdh5.7.0源码编译支持压缩

在hadoop-2.6.0-cdh5.7.0源码中有个BUILDING.txt文件,里面列出了编译所需依赖组件。Requirements:Unix SystemJDK 1.7+Maven 3.0 or laterFindbugs 1.3.9 (if running findbugs)ProtocolBuffer 2.5.0CMake 2.6 or newer (if compiling native code), must be 3.0 or newer on MacZlib devel (if compiling native code)openssl devel ( if compiling native hadoop-pipes )Internet connection for first build (to fetch all Maven and Hadoop dependencies)转载链接文章中或通过yum安装或通过自己下载提供了所有正确版本组件,并将已下载组件通过百度云分享。我想补充一点的是,yum安装可能报出Another app is currently holding the yum lock; waiting for it to exit…的错误,可参考https://blog.csdn.net/testcs_…强制关闭yum进程来解决。根据BUILDING.txt提示Build options:Use -Pnative to compile/bundle native code * Use -Pdocs togenerate & bundle the documentation in the distribution (using -Pdist)Use -Psrc to create a project source TAR.GZ * Use -Dtar to create a TAR with the distribution (using -Pdist)Building distributions:Create binary distribution without native code and withoutdocumentation:$ mvn package -Pdist -DskipTests -DtarCreate binary distribution with native code and with documentation:$ mvn package -Pdist,native,docs -DskipTests -Dtar使用mvn clean package -Pdist,native -DskipTests -Dtar编译,编译完成后,默认会在源码根目录的hadoop-dist目录下生成target,里面的hadoop-2.6.0-cdh5.7.0文件夹就是已经编译好并已解压的hadoop了(直接用的),可以将其拷贝到自定义的位置进行部署配置。[root@NN1 hadoop-2.6.0-cdh5.7.0]# ./bin/hadoop checknative19/04/10 11:22:34 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native19/04/10 11:22:34 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib libraryNative library checking:hadoop: true /root/hadoop-c/hadoop-2.6.0-cdh5.7.0-target/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0zlib: true /lib64/libz.so.1snappy: true /lib64/libsnappy.so.1lz4: true revision:99bzip2: true /lib64/libbz2.so.1openssl: true /lib64/libcrypto.so可以看到编译的hadoop支持了各种压缩,亲测有效! ...

April 10, 2019 · 1 min · jiezi

使用Python操作Hadoop,Python-MapReduce

环境环境使用:hadoop3.1,Python3.6,ubuntu18.04Hadoop是使用Java开发的,推荐使用Java操作HDFS。有时候也需要我们使用Python操作HDFS。本次我们来讨论如何使用Python操作HDFS,进行文件上传,下载,查看文件夹,以及如何使用Python进行MapReduce编程。使用Python操作HDFS首先需要安装和导入hdfs库,使用pip install hdfs。1. 连接并查看指定路径下的数据from hdfs import * client = Client(‘http://ip:port’) #2.X版本port 使用50070 3.x版本port 使用9870client.list(’/’) #查看hdfs /下的目录2. 创建目录client.makedirs(’/test’)client.makedirs(’/test’,permision = 777 ) # permision可以设置参数3. 重命名、删除client.rename(’/test’,‘123’) #将/test 目录改名为123client.delete(’/test’,True) #第二个参数表示递归删除 4.下载将/test/log.txt 文件下载至/home目录下。client.download(’/test/log.txt’,’/home’) 5. 读取with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader: print reader.read()其他参数:read(args, *kwds) hdfs_path:hdfs路径 offset:设置开始的字节位置 l- ength:读取的长度(字节为单位) buffer_size:用于传输数据的字节的缓冲区的大小。默认值设置在HDFS配置。 encoding:指定编码 chunk_size:如果设置为正数,上下文管理器将返回一个发生器产生的每一chunk_size字节而不是一个类似文件的对象 delimiter:如果设置,上下文管理器将返回一个发生器产生每次遇到分隔符。此参数要求指定的编码。 progress:回调函数来跟踪进度,为每一chunk_size字节(不可用,如果块大小不是指定)。它将传递两个参数,文件上传的路径和传输的字节数。称为一次与- 1作为第二个参数。6.上传数据将文件上传至hdfs的 /test下。client.upload(‘/test’,’/home/test/a.log’)Python-MapReduce编写mapper代码,map.py:import sysfor line in sys.stdin: fields = line.strip().split() for item in fields: print(item + ’ ’ + ‘1’)编写reducer代码,reduce.py:import sysresult = {}for line in sys.stdin: kvs = line.strip().split(’ ‘) k = kvs[0] v = kvs[1] if k in result: result[k]+=1 else: result[k] = 1for k,v in result.items(): print("%s\t%s" %(k,v))添加测试文本,test1.txt:tale as old as timetrue as it can bebeauty and the beast本地测试执行map代码:cat test1.txt | python map.py结果:tale 1as 1old 1as 1time 1true 1as 1it 1can 1be 1beauty 1and 1the 1beast 1本地测试执行reduce代码:cat test1.txt | python map.py | sort -k1,1 | python reduce.py执行结果:and 1be 1old 1beauty 1true 1it 1beast 1as 3can 1time 1the 1tale 1在Hadoop平台执行map-reduce程序本地测试完毕,编写脚本在HDFS中执行程序脚本:run.sh (请根据本机环境修改)HADOOP_CMD="/app/hadoop-3.1.2/bin/hadoop"STREAM_JAR_PATH="/app/hadoop-3.1.2/share/hadoop/tools/lib/hadoop-streaming-3.1.2.jar"INPUT_FILE_PATH_1="/py/input/“OUTPUT_PATH="/output”$HADOOP_CMD fs -rmr-skipTrash $OUTPUT_PATH# Step 1.$HADOOP_CMD jar $STREAM_JAR_PATH -input $INPUT_FILE_PATH_1 -output $OUTPUT_PATH -mapper “python map.py” -reducer “python reduce.py” -file ./map.py -file ./reduce.py \添加执行权限chmod a+x run.sh;执行测试:bash run.sh,查看结果:练习1. 文件合并去重输入文件file1的样例如下:20150101 x20150102 y20150103 x20150104 y20150105 z20150106 x输入文件file2的样例如下:20150101 y20150102 y20150103 x20150104 z20150105 y根据输入文件file1和file2合并得到的输出文件file3的样例如下:20150101 x20150101 y20150102 y20150103 x20150104 y20150104 z20150105 y20150105 z20150106 x对于两个输入文件,即文件file1和文件file2,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件file3。为了完成文件合并去重的任务,你编写的程序要能将含有重复内容的不同文件合并到一个没有重复的整合文件,规则如下:第一列按学号排列;学号相同,按x,y,z排列。2. 挖掘父子关系输入文件内容如下:child parentSteven LucySteven JackJone LucyJone JackLucy MaryLucy FrankJack AliceJack JesseDavid AliceDavid JessePhilip DavidPhilip AlmaMark DavidMark Alma输出文件内容如下:grandchild grandparentSteven AliceSteven JesseJone AliceJone JesseSteven MarySteven FrankJone MaryJone FrankPhilip AlicePhilip JesseMark AliceMark Jesse你编写的程序要能挖掘父子辈关系,给出祖孙辈关系的表格。规则如下:孙子在前,祖父在后孙子相同,祖父的名字按照A-Z排列 ...

April 7, 2019 · 2 min · jiezi

Hadoop集群搭建踩坑

在Hadoop集群安装配置完成后,需将namenode格式化,namenode格式化需先启动journalnode。]$ hadoop-daemons.sh start journalnode出现报错:: Name or service not knownstname hadoop001只启动成功了一个节点我用hadoop-daemon.sh start journalnode命令分别启动各个journalnode节点,格式化namenode成功。]$ start-dfs.sh第二次出现: Name or service not knownstname hadoop001最后发现是slaves文件的问题,vi打开后显示[doc], 删了重新创建。再启动,好了~

April 7, 2019 · 1 min · jiezi

秒懂ssh免密登录

在搭建Hadoop集群等场景,需提前配置好各节点两两之间的ssh免密登录。那么ssh免密登录是怎么回事呢?本文以一图讲述原理,并以最简单的命令完成配置。原理如图:命令配置:ssh-keygen即上图中的1,生成一对公钥私钥。ssh-copy-id <user>@<host>即上图中的2,将公钥发送给目标服务器并追加到authorized_keys参考文章:https://www.cnblogs.com/kex1n…

April 7, 2019 · 1 min · jiezi

记录Hadoop3.1.1 伪分布式运行模式

一、前期准备本篇是在上一篇https://segmentfault.com/a/11… 的基础上进行的操作。1.1 修改/添加部分#修改主机名hostnamectl set-hostname hadoop104#ssh免密钥登陆配置##删除现有的ssh信息[admin@hadoop104 ~]$ cd ~/.ssh[admin@hadoop104 .ssh]$ rm -rf ##然后不输入密码(直接按三次回车)生成私钥和公钥[admin@hadoop104 .ssh]$ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/home/admin/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/admin/.ssh/id_rsa.Your public key has been saved in /home/admin/.ssh/id_rsa.pub.The key fingerprint is:SHA256:kjL6k939tz4wgrdYIlA7/r5EgzGVJ12YlQB7BfkNMSU admin@hadoop104The key’s randomart image is:+—[RSA 2048]—-+| o+oOE+. || ..o..oo || .o..o.. o || . o= . . . || oo+.S. || . oooo.+ o || . o +.* o o || .o ..+ o o || .. .o. ..ooo |+—-[SHA256]—–+[admin@hadoop104 .ssh]$ ll总用量 8-rw——- 1 admin admin 1675 4月 2 21:26 id_rsa #id_rsa为私钥文件-rw-r–r– 1 admin admin 397 4月 2 21:26 id_rsa.pub #id_rsa.pub为公钥文件##将公钥发送给从节点hadoop104[admin@hadoop104 .ssh]$ ssh-copy-id hadoop104/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/home/admin/.ssh/id_rsa.pub"The authenticity of host ‘hadoop104 (192.168.119.104)’ can’t be established.ECDSA key fingerprint is SHA256:X25gXFFr2vsKVxn7LLOpQtYBb1OHOmRGj9XmJpQQ9Vs.ECDSA key fingerprint is MD5:d6:55:be:36:9b:b6:33:f7:4d:75:5a:c5:40:89:a1:7c.Are you sure you want to continue connecting (yes/no)? yes/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keysadmin@hadoop104’s password: Number of key(s) added: 1Now try logging into the machine, with: “ssh ‘hadoop104’“and check to make sure that only the key(s) you wanted were added.##然后就可以了[admin@hadoop104 .ssh]$ ssh hadoop104Last login: Thu Apr 4 10:48:25 2019 from hadoop104为 “二、实际操作-2.1 HDFS上运行MapReduce 程序” 进行的配置,配置完请先进行 2.1 HDFS上运行MapReduce 程序 操作。# core-site.xmlvi /opt/module/hadoop-3.1.1/etc/hadoop/core-site.xml<!– 指定HDFS中NameNode的地址 –><property> <name>fs.defaultFS</name> <value>hdfs://hadoop104:9000</value></property><!– 指定hadoop运行时产生文件的存储目录 –><property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.1/data/tmp</value></property># hdfs-site.xmlvi /opt/module/hadoop-3.1.1/etc/hadoop/hdfs-site.xml<!– 指定HDFS副本的数量 –><property> <name>dfs.replication</name> <value>1</value></property>为 “二、实际操作-2.2 YARN上运行MapReduce 程序” 进行的配置,配置完进行 2.2 YARN上运行MapReduce 程序 操作。#配置yarn-site.xml<!– reducer获取数据的方式 –><property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value></property><!– 指定YARN的ResourceManager的地址 –><property> <name>yarn.resourcemanager.hostname</name> <value>hadoop104</value></property>#配置mapred-site.xml<!– 指定mr运行在yarn上 –><property> <name>mapreduce.framework.name</name> <value>yarn</value></property>二、实际操作2.1 HDFS上运行MapReduce 程序#格式化namenode(第一次启动时格式化,以后不要总格式化)[admin@centos104 hadoop-3.1.1]$ bin/hdfs namenode -format#启动[admin@hadoop104 hadoop-3.1.1]$ sbin/start-dfs.sh#查看[admin@hadoop104 hadoop-3.1.1]$ jps14448 NameNode14769 SecondaryNameNode14571 DataNode14892 Jps#浏览器查看HDFS文件系统,Hadoop3.0中namenode的默认端口配置发生变化:从50070改为9870http://192.168.119.104:9870/dfshealth.html#tab-overview 或者http://hadoop104:9870/dfshealth.html#tab-overview (本地windows需要配hosts)#在hdfs文件系统上创建一个input文件夹[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -mkdir -p /user/qianxkun/mapreduce/wordcount/input#将测试文件内容上传到文件系统上[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -put wcinput/wc.input /user/qianxkun/mapreduce/wordcount/input/#查看上传的文件[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -ls /user/qianxkun/mapreduce/wordcount/input/Found 1 items-rw-r–r– 1 admin supergroup 47 2019-04-04 16:07 /user/qianxkun/mapreduce/wordcount/input/wc.input[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -cat /user/qianxkun/mapreduce/wordcount/input/wc.inputhadoop yarnhadoop mapreduceqianxkunqianxkun#在HDFS上运行mapreduce程序[admin@hadoop104 hadoop-3.1.1]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /user/qianxkun/mapreduce/wordcount/input/ /user/qianxkun/mapreduce/wordcount/output查看输出结果命令行查看[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -cat /user/qianxkun/mapreduce/wordcount/output/hadoop 2mapreduce 1qianxkun 2yarn 1浏览器查看#将测试文件内容下载到本地[admin@hadoop104 hadoop-3.1.1]$ hadoop fs -get /user/qianxkun/mapreduce/wordcount/output/part-r-00000 ./wcoutput/#删除输出结果[admin@hadoop104 hadoop-3.1.1]$ hdfs dfs -rm -r /user/qianxkun/mapreduce/wordcount/output2.2 YARN上运行MapReduce 程序#启动[admin@hadoop104 hadoop-3.1.1]$ sbin/start-yarn.sh #查看[admin@hadoop104 hadoop-3.1.1]$ jps14448 NameNode14769 SecondaryNameNode15939 ResourceManager16374 Jps14571 DataNode16063 NodeManager#yarn的浏览器页面查看http://192.168.119.104:8088/cluster 或者http://hadoop104:8088/cluster#删除文件系统上的output文件[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -rm -R /user/qianxkun/mapreduce/wordcount/outputDeleted /user/qianxkun/mapreduce/wordcount/output#执行mapreduce程序[admin@hadoop104 hadoop-3.1.1]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /user/qianxkun/mapreduce/wordcount/input /user/qianxkun/mapreduce/wordcount/output ##报错"错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster”##解决###停止yarn[admin@hadoop104 hadoop-3.1.1]$ sbin/stop-yarn.sh###将hadoop classpath 下内容配置到yarn-site.xml文件中[admin@hadoop104 hadoop-3.1.1]$ hadoop classpath/opt/module/hadoop-3.1.1/etc/hadoop:/opt/module/hadoop-3.1.1/share/hadoop/common/lib/:/opt/module/hadoop-3.1.1/share/hadoop/common/:/opt/module/hadoop-3.1.1/share/hadoop/hdfs:/opt/module/hadoop-3.1.1/share/hadoop/hdfs/lib/:/opt/module/hadoop-3.1.1/share/hadoop/hdfs/:/opt/module/hadoop-3.1.1/share/hadoop/mapreduce/lib/:/opt/module/hadoop-3.1.1/share/hadoop/mapreduce/:/opt/module/hadoop-3.1.1/share/hadoop/yarn:/opt/module/hadoop-3.1.1/share/hadoop/yarn/lib/:/opt/module/hadoop-3.1.1/share/hadoop/yarn/[admin@hadoop104 hadoop-3.1.1]$ vi etc/hadoop/yarn-site.xml<property><name>yarn.application.classpath</name><value>/opt/module/hadoop-3.1.1/etc/hadoop:/opt/module/hadoop-3.1.1/share/hadoop/common/lib/:/opt/module/hadoop-3.1.1/share/hadoop/common/:/opt/module/hadoop-3.1.1/share/hadoop/hdfs:/opt/module/hadoop-3.1.1/share/hadoop/hdfs/lib/:/opt/module/hadoop-3.1.1/share/hadoop/hdfs/:/opt/module/hadoop-3.1.1/share/hadoop/mapreduce/lib/:/opt/module/hadoop-3.1.1/share/hadoop/mapreduce/:/opt/module/hadoop-3.1.1/share/hadoop/yarn:/opt/module/hadoop-3.1.1/share/hadoop/yarn/lib/:/opt/module/hadoop-3.1.1/share/hadoop/yarn/*</value></property>##重新启动后执行成功[admin@hadoop104 hadoop-3.1.1]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /user/qianxkun/mapreduce/wordcount/input /user/qianxkun/mapreduce/wordcount/output#查看运行结果[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -cat /user/qianxkun/mapreduce/wordcount/output/*hadoop 2mapreduce 1qianxkun 2yarn 1三、历史服务配置启动查看# 配置mapred-site.xml<property> <name>mapreduce.jobhistory.address</name> <value>hadoop104:10020</value></property><property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop104:19888</value></property>#查看启动历史服务器文件目录:[admin@hadoop104 hadoop-3.1.1]$ ls sbin/ |grep mrmr-jobhistory-daemon.sh#启动历史服务器[admin@hadoop104 hadoop-3.1.1]$ sbin/mr-jobhistory-daemon.sh start historyserver#查看历史服务器是否启动[admin@hadoop104 hadoop-3.1.1]$ jps19442 SecondaryNameNode19800 NodeManager19257 DataNode19146 NameNode19692 ResourceManager20142 Jps18959 JobHistoryServer#查看jobhistoryhttp://192.168.119.104:19888/jobhistory 或者http://hadoop104:19888/jobhistory四、日志的聚集#配置yarn-site.xml<!– 日志聚集功能使能 –><property> <name>yarn.log-aggregation-enable</name> <value>true</value></property><!– 日志保留时间设置7天 –><property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value></property>#启动hdfs、yarn和historymanager[admin@hadoop104 hadoop-3.1.1]$ sbin/start-dfs.sh [admin@hadoop104 hadoop-3.1.1]$ sbin/start-yarn.sh[admin@hadoop104 hadoop-3.1.1]$ sbin/mr-jobhistory-daemon.sh start historyserver#删除hdfs上已经存在的hdfs文件[admin@hadoop104 hadoop-3.1.1]$ bin/hdfs dfs -rm -R /user/qianxkun/mapreduce/wordcount/output#执行wordcount程序[admin@hadoop104 hadoop-3.1.1]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /user/qianxkun/mapreduce/wordcount/input /user/qianxkun/mapreduce/wordcount/output2019-04-04 18:23:59,294 INFO client.RMProxy: Connecting to ResourceManager at hadoop104/192.168.119.104:80322019-04-04 18:24:00,525 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/admin/.staging/job_1554373388828_0001#查看日志http://192.168.119.104:19888/jobhistory 或者http://hadoop104:19888/jobhistory ...

April 4, 2019 · 3 min · jiezi

YARN架构简记

HA:RM启动时会向zk的/mrstore路径下写入lock文件,写入成功的则为active RM,否则为standby RM。启动后,RM会将job信息写入/mrstore,RM进程中的ZKFC线程会监控/mrstore中的lock文件,若不存在则RM为active,存在则为standby,切换后可从/mrstore读取job信息。运行:Client提交job,会访问RM,若访问到standby RM则重新访问active RM。RM根据job上下文以及从NM收集到的状态信息分配资源并调度,启动一个container用来运行AM。NM负责启动container,监控所在节点的资源使用情况,并通过心跳机制报告给RM。job的task会在container中运行。RM,NM相当于写字楼的管理者,RM总管,NM区域管理,它们提供container(办公室);AM相当于项目经理,向写字楼管理者申请办公室,在它们提供的container上执行task,完成客户提交的job。

April 3, 2019 · 1 min · jiezi

HDFS架构

读写:客户端通过命名空间发请求,可以无感知的找到active NN,active NN所做操作会保存在editlog文件中,并向JournalNode节点写入editlog。DN向NN发送心跳报告的时候,NN将editlog上的数据操作发送给DN实现。HA:standby NN会实时从JN上读取editlog信息,进行重演,保持与active NN的数据同步。如果active NN挂掉了,ZKFC会监控到,向zk集群发送心跳报告时会将这一消息报告上去,zk集群会进行选举,被选举到的standby NN所在节点的ZKFC进程收到通知,这个ZKFC会切换NN的状态为active。

April 2, 2019 · 1 min · jiezi

从数据谈起存储/计算/分布式

数据的存储存储——性能(存储介质,数据格式,数据组织,索引,cache) ——扩展性 ——功能(索引,事务) ——一致性 ——可靠性 ——成本(物理,维护)性能存储介质特点数据组织磁带 内存 map,set,list,skip-list,memory-table,stm(支持内存事务)磁盘顺序读写强,随机读写差,block-Tress =>B+ 层数一样,性能稳定,中间节点只有索引,容易缓存,数据只在子节点,数据可以扫描SSD随机性能高,并行度高,擦除影响寿命SST(sst为何适合SSD)PCM 扩展性分片,元数据hash(事先分多),range(hbase 热点),一致性hash(不推荐,写不好)一般三个副本可以保证11个9,两副本大规模下3个9必丢数据可靠性复制,同步,故障恢复,故障发现,主动上报/心跳/lease一致性CAP是针对一条数据的ACID,最终一致性,sessioin一致性,单调一致性考虑高可用的备份,高性能的负载,地理就近,存储单机瓶颈等原因会从单机发展到分布式。架构(多主,单主等),困难:丢包/延迟,时钟不同步。会导致设计上再延时(同步,半同步,异步)和一致性(线性一致性,原子事务提交)上有一定取舍,并有通用调的方式来解决。这部分理论在后续案例后再讨论。先看存储的例子。1.redis=>codisredis单机基础内存跳表-list无索引,基本不支持事务redis的分布式1,代码中写;2,redis Cluster。请求不在的key要两次,先返回ip再请求一次3,代理分片,比如tuemproxy,codisredis clustercodis架构扩展性分片:hash元数据:codis-proxy中,用codis-dashboard控制,zk保持同步扩展:固定1024个slot。迁移是按照slot的维度迁移有两个阶段,第一阶段状态改为pre_m。若proxy都确认,将状态改m。向所在的redis-server发送迁移命可靠性codis-proxy的用zookeeper保证。client获取zk节点做负载均衡codis-group的主从用redis的哨兵模式一致性2.mysql=>proxy3.fusion4.leveldb/rockdb5.mongodb

April 1, 2019 · 1 min · jiezi

windows调试hadoop-mapreduce任务踩坑记录(使用idea)

首先准备Hadoop连接驱动,放到任意一个文件夹中,并将其bin目录写入path环境环境变量,另取其中的hadoop.dll文件放入c盘System32文件夹中。创建空maven项目,这是我的全部依赖 <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency> </dependencies>将hadoop四大配置文件放在resources根目录下,还有log4j.properties再准备你的mapreduce源码,在main函数中写入以下代码System.setProperty(“HADOOP_USER_NAME”, “hadoop”);Configuration conf = new Configuration();conf.set(“fs.defaultFS”, “hdfs://10.32.6.132:9000”);//ip依照自己的集群进行定义conf.set(“mapreduce.framework.name”, “yarn”);conf.set(“mapreduce.app-submission.cross-platform”, “true”);//允许跨平台提交conf.set(“mapred.jar”,“E:\hadooptest\target\hadooptest-1.0-SNAPSHOT-jar-with-dependencies.jar”);mapred.jar就写编译出来的jar包位置idea中运行配置如下其中输入路径一定要存在,输出路径一定要不存在,由Hadoop自行创建此处写hadoop驱动的根目录,之后点击运行即可。遇到的问题:1.一定要保证hadoop集群是可运行的,单机版也可以,但一定要保证是正常的。2.在本机运行过程中会调用hadoop历史服务器,采用sbin/mr-jobhistory-daemon.sh start historyserver命令启动不启动的异常为10020端口无法访问3.运行过程中出现的各种连接异常的警告可以忽视,不可忽视的是异常,端口默认访问地址是0.0.0.0是无法被其他主机访问的,所以任何连接被异常中断时请检查是否在配置文件中显式指定了套接字。

March 16, 2019 · 1 min · jiezi

用于大数据测试、学习的测试数据

近期在做一个数据报表的项目,原数据在mysql中,现数据量上百万后,整个报表无法查询。故学习hadoop、kylin相关知识,学习过程中碰到了不少问题,后续讲统一整理发布本篇主要为记录为学习准备的测试数据模拟订单测试数据,文件为mysql导出的csv文件,比较好处理,可以导入hive,或者导入mysql数据库,适用于想学习大数据或测试mysql性能等场景。如果是test_order_all.zip则是整个文件如果是test_order.zip.001或test_order.zip.001.zip则是分卷压缩,需要下载所有的,总共8个文件test_order.zip.001.zip 需下载完成后改名为test_order.zip.001分卷压缩的8个文件和test_order_all.zip内容一样下载链接1:https://u1634284.pipipan.com/…下载链接2:http://www.90pan.com/o105422下载链接3:https://www.gueizu.com/file-4…https://www.gueizu.com/file-4...https://www.gueizu.com/file-4...https://www.gueizu.com/file-4...https://www.gueizu.com/file-4...https://www.gueizu.com/file-4...https://www.gueizu.com/file-4...https://www.gueizu.com/file-4…

March 6, 2019 · 1 min · jiezi

全面了解大数据“三驾马车”的开源实现

三架马车:·Google File System(GFS)的开源实现:HDFS·MapReduce 的开源实现:Hadoop MapReduce·BigTable 的开源实现:HBaseGoogle File System(GFS)的开源实现:HDFS1.HDFS 是在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。2.HDFS 的关键组件有两个,一个是 DataNode,一个是 NameNode。3.DataNode 负责文件数据的存储和读写操作,HDFS 将文件数据分割成若干数据块(Block),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。4.NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。HDFS 为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为 3 份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有磁盘损坏,或者某个 DataNode 服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。MapReduce 的开源实现:Hadoop MapReduce1.MapReduce 是什么?MapReduce 既是一个编程模型,又是一个计算框架。开发人员许哟按照MapReduce的编程模型来开发,并且将程序通过MapReduce分发到Hadoop集群中运行。2.MapReduce 运行过程涉及三类关键进程·大数据应用进程。这类进程是启动 MapReduce 程序的主入口,主要是指定 Map 和 Reduce 类、输入输出文件路径等,并提交作业给 Hadoop 集群,也就是下面提到的 JobTracker 进程。这是由用户启动的 MapReduce 程序进程,比如 WordCount 程序。·JobTracker 进程。这类进程根据要处理的输入数据量,命令下面提到的 TaskTracker 进程启动相应数量的 Map 和 Reduce 进程任务,并管理整个作业生命周期的任务调度和监控。这是 Hadoop 集群的常驻进程,需要注意的是,JobTracker 进程在整个 Hadoop 集群全局唯一。·TaskTracker 进程。这个进程负责启动和管理 Map 进程以及 Reduce 进程。因为需要每个数据块都有对应的 map 函数,TaskTracker 进程通常和 HDFS 的 DataNode 进程启动在同一个服务器。也就是说,Hadoop 集群中绝大多数服务器同时运行 DataNode 进程和 TaskTacker 进程。3.MapReduce 计算真正产生奇迹的地方是数据的合并与连接。每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 <Key, Value> 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。这样不管 Map 位于哪个服务器节点,相同的 Key 一定会被发送给相同的 Reduce 进程。Reduce 任务进程对收到的 <Key, Value> 进行排序和合并,相同的 Key 放在一起,组成一个 <Key, Value 集合 > 传递给 Reduce 执行。map 输出的 <Key, Value>shuffle 到哪个 Reduce 进程是这里的关键,它是由 Partitioner 来实现,MapReduce 框架默认的 Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。BigTable 的开源实现:HBase1.HBase 为可伸缩海量数据储存而设计,实现面向在线业务的实时数据访问延迟。HBase 的伸缩性主要依赖其可分裂的 HRegion 及可伸缩的分布式文件系统 HDFS 实现。2.HRegion 是 HBase 负责数据存储的主要进程,应用程序对数据的读写操作都是通过和 HRetion 通信完成。上面是 HBase 架构图,我们可以看到在 HBase 中,数据以 HRegion 为单位进行管理,也就是说应用程序如果想要访问一个数据,必须先找到 HRegion,然后将数据读写操作提交给 HRegion,由 HRegion 完成存储层面的数据操作。HRegionServer 是物理服务器,每个 HRegionServer 上可以启动多个 HRegion 实例。当一个 HRegion 中写入的数据太多,达到配置的阈值时,一个 HRegion 会分裂成两个 HRegion,并将 HRegion 在整个集群中进行迁移,以使 HRegionServer 的负载均衡。 ...

March 4, 2019 · 1 min · jiezi

SQLflow:基于python开发的分布式机器学习平台, 支持通过写sql的方式,运行spark, 机器学习算法, 爬虫

项目git:https://github.com/lqkweb/sql…SQLflow (python3+)Sqlflow based on python development, support to Spark, Flink, etc as the underlying distributed computing engine, through a set of unified configuration file to complete the batch, flow calculation, the Rest service development.2019-01-22 更新界面,近期会规范一下代码,写一些注释并加入读写功能主页:结果页面:项目目标基于python开发的分布式机器学习平台, 支持通过写sql的方式,运行spark, 机器学习算法, 爬虫。安装python3环境, 执行项目git clone https://github.com/lqkweb/sql...pip install -r requirements.txt(sqlflow/sqlflow/execute/main.py 中的data.csv需要修改成你电脑中的绝对路径,数据文件在sqlflow/data/中)python manage.py打开http://127.0.0.1:5000 就可以测试了。项目测试在http://127.0.0.1:5000/demo输入框输入:测试1:select * from A limit 3;测试2:select * from A limit 3 as B;新开一个http://127.0.0.1:5000/demo网页, 直接就可以查询数据表B了:select * from B limit 2;as B 相当于创建了一个B临时表。是不是很简单。正在新增sql版机器学习算法功能, 谢谢支持。正在新增sql版爬虫功能, 谢谢支持。记得给个start鼓励一下!Thanks♪(・・)ノ

February 15, 2019 · 1 min · jiezi

Hadoop小文件解决方案-基于文件整合的解决方案

通过研究一些不太常用的替代方案来解决MapReduce性能问题以及选择解决方案时要考虑的因素。解决MapReduce性能问题以下解决方案来缓解MapReduce性能问题:更改摄取过程/间隔批处理文件合并序列文件HBaseS3DistCp(如果使用Amazon EMR)使用CombineFileInputFormatHive配置使用Hadoop的附加功能已经讨论过更改摄取过程,批处理文件合并和序列文件。Hbase如果要生成大量小文件,将数据作为文件存储在HDFS中可能不是最佳解决方案。相反,您可以考虑使用HBase列存储。使用HBase可以将摄取过程从生成许多小型HDFS文件更改为将单个记录写入HBase表。如果您的数据访问模式基于明确定义的随机访问查找,则HBase可能是您的最佳选择。它在架构上针对高速数据记录插入,大容量,单个记录查找和基于流的分析进行了调整。但是,如果您的数据访问模式倾向于完整文件/表扫描,那么HBase可能不是最佳的。可以创建映射到HBase数据的Hive表; 但是,此设计中的查询性能会有所不同。当选择单行或一系列行时,HBase上的Hive会闪烁,但如果您的查询倾向于全表扫描,则HBase的效率非常低。大多数分析查询,尤其是那些使用group by的查询,都需要进行全表扫描。HBase提供了将数据流式传输到Hadoop并使其可实时处理的最佳能力。但是,平衡HBase与其他集群进程的需求可能具有挑战性,并且需要高级系统管理。此外,HBase性能在很大程度上取决于数据访问模式,在选择HBase解决小文件问题之前,应仔细考虑这些模式。S3DistCp此解决方案仅适用于Amazon EMR的用户。Amazon EMR集群的生命周期很短,将数据保存在Amazon S3中。即使使用Amazon S3,处理大量小文件仍然会导致启动不必要的map任务,从而降低性能。S3DistCp是亚马逊提供的一种实用程序,用于将数据从S3分发复制到临时HDFS甚至其他S3存储桶。该实用程序提供了通过使用groupBy和targetSize选项将文件连接在一起的功能。当您在S3中存储了数千个要使用Amazon EMR处理的小文件时,这非常有用。S3DistCp通过连接许多小文件并使它们出现在更快,短暂的HDFS存储中,一举两得。据报道,使用这种机制可以提高15倍的性能。出于所有实际目的,S3DistCp执行与提到的批处理文件合并方法相同的任务。如果使用Amazon EMR,请注意您有一个预先构建的工具来完成此任务。使用CombineFileInputFormatCombineFileInputFormat是Hadoop提供的抽象类,它在MapReduce读取时合并小文件。合并的文件不会持久保存到磁盘。相反,该过程读取多个文件并“动态”合并它们以供单个map任务使用。您可以获得不为每个文件启动一个map任务的好处,并且不需要将多个文件合并到一个持久文件中作为准备步骤的一部分。这解决了MapReduce作业启动太多map任务的问题; 但是,由于作业仍在读取多个小文件,因此随机磁盘IO仍然存在问题。此外,CombineFileInputFormat的大多数实现都不考虑数据局部性,并且通常会通过网络从各种数据节点提取数据。为了实现这一点,必须在Java中为不同的文件类型扩展CombineFileInputFormat。这需要大量的开发专业知识来开发您的自定义输入格式类。但是,一旦编写,您可以配置最大分割大小,它将合并文件,直到满足此大小。请注意,由于合并数据不会在HDFS中保留,因此CombineFileInputFormat不会缓解NameNode内存问题。Hive配置如果您注意到Hive通过“create table as”或“insert overwrite”语句在Hadoop集群中创建小文件,则可以调整一些Hive特定配置设置以进行缓解。使用时,这些设置会告诉Hive将创建的任何小文件合并到较大的文件中。但是,有一个惩罚。Hive将启动一个额外的MapReduce作业后查询,以执行合并。此外,在Hive向用户指示查询已完成处理而不是异步发生之前完成合并。应该注意,这些设置仅适用于由Hive创建的文件。例如,如果使用其他工具(如Sqoop)在Hive外部创建文件,则使用hdfs fs -mv命令将其复制到Hive表中,Hive将不会合并文件。因此,当摄入Hadoop的文件很小时,此解决方案不起作用。此解决方案仅建议在以Hive为中心的体系结构中,其中insert overwrite和create table as语句中的小性能损失是可接受的。要使用的设置是:使用Hadoop的附加功能附加可能是可用的,但Hadoop生态系统中的主要工具都不支持它:Flume,Sqoop,Pig,Hive,Spark和Java MapReduce。MapReduce强制执行一条规则,即MapReduce作业的输出位置在执行之前不得存在。由于这个规则,MapReduce显然不可能通过其输出附加到预先存在的文件。由于Sqoop,Pig和Hive都使用了MapReduce,因此这些工具也不可能支持追加。Flume不支持追加很大程度上是因为它假设经过一段时间(无论是秒,字节,事件数或不活动秒),Flume将关闭文件而不再打开它。Flume社区认为这足够,而不是要求追加支持。如果你真的必须在Hadoop中使用appends,你必须编写自己的系统来执行摄取并附加到现有文件。此外,如果您的任何群集内处理需要附加到现有文件,您将无法使用Spark或MapReduce。因此,使用HDFS附加功能非常复杂,只能由技术最精湛的组织使用。如果没有重要的工程团队和支持承诺,则不建议使用此选项。选择解决方案选择使用小文件的最佳解决方案取决于各种问题。可能有必要根据访问模式和数据要求使用这些解决方案的组合。应该考虑的问题包括:数据流中的哪一点是生成的小文件?是在摄取时还是通过群集内处理创建小文件?生成小文件的工具是什么?更改工具配置可以减少小文件的数量吗?您的组织有多少技术技能?您是否有能力维护输入格式或编写自己的摄取引擎?生成小文件的频率是多少?为了创建大文件,可以多久合并一次小文件?这些小文件需要哪种数据访问?这些文件是否需要通过Hive访问?可以在集群内部运行流程以减轻小文件的管理周期类型?MapReduce流程可接受的延迟级别是多少?

January 29, 2019 · 1 min · jiezi

Hadoop小文件解决方案-基于NameNode内存和MapReduce性能解决方案

[TOC]在第一篇文章中,我讨论了什么构成了一个小文件,以及为什么Hadoop存在小文件问题。我将一个小文件定义为小于Hadoop块大小75%的任何文件,并解释说由于NameNode内存使用和MapReduce性能,Hadoop更喜欢较少的较大文件。在这篇文章中,当小文件真正不可避免时,我将讨论这些挑战的解决方案。解决NameNode内存问题正如之前的文章中所讨论的,Hadoop中每个块的元数据必须存储在NameNode的内存中。这导致实际限制Hadoop中可以存储的对象数量,并且还会影响启动时间和网络带宽。有两种解决方案,减少Hadoop集群中的对象数量,或以某种方式使NameNode更多地使用内存 - 但不会导致过多的启动时间。解决此内存问题的最常用方法涉及Hadoop存档(HAR)文件和联合NameNodes。Hadoop存档文件Hadoop归档文件通过将许多小文件打包到更大的HAR文件中来缓解NameNode内存问题,类似于Linux上的TAR文件。这导致NameNode保留单个HAR文件的知识,而不是数十个或数百个小文件。可以使用har://前缀而不是hdfs://来访问HAR文件中的文件。HAR文件是从HDFS中存在的文件创建的。因此,HAR文件可以合并摄取的数据以及通过正常的MapReduce处理创建数据。可以独立于用于创建小文件的技术来使用HAR文件。除了HDFS之外没有共同的依赖。虽然HAR文件减少了许多小文件的NameNode内存占用,但访问和处理HAR文件内容的效率可能会降低。HAR文件仍然随机存储在磁盘上,并且读取HAR内的文件需要两个索引访问 - 一个用于NameNode以找到HAR文件本身,一个用于在HAR内查找小文件的位置。在HAR中读取文件实际上可能比读取本机存储在HDFS上的相同文件慢。MapReduce作业会影响此性能问题,因为它们仍将在HAR中的每个文件中启动一个map任务。最后,你有一个HAR文件可以解决NameNode内存问题,但可能会恶化处理性能。如果您的小文件主要用于存档目的,并且不经常访问,那么HAR文件是一个很好的解决方案。如果小文件是正常处理流程的一部分,您可能需要重新考虑您的设计。Federated NameNodesFederated NameNodes允许您在群集中拥有多个NameNode,每个NameNode都存储对象元数据的子集。这消除了将所有对象元数据存储在单个机器上的需要,从而为内存使用提供了更多的扩展。从表面上看,用这种技术解决小文件内存问题很有吸引力,但是稍微想一想你会很快意识到这些局限性。Federated NameNodes隔离对象元数据 - 只有一个NameNode知道任何特定对象。这意味着要获取文件,您必须知道要使用哪个NameNode。如果您的群集包含多个租户或孤立的应用程序,那么Federated NameNode很自然 - 您可以通过租户或应用程序隔离对象元数据。但是,如果要在群集中的所有应用程序之间共享数据,则此方法并不理想。由于Federated实际上不会更改群集中的对象或块的数量,因此它无法解决MapReduce性能问题。相反,Federated为您的Hadoop安装和管理增加了重要且通常不必要的复杂性。当用于解决小文件问题时,通常更多的是隐藏小文件问题的机制。解决MapReduce性能问题MapReduce性能问题是由随机磁盘IO和启动/管理太多map任务的组合引起的。解决方案似乎很明显 - 拥有更少,更大的文件或启动更少的map任务; 然而,这说起来容易做起来难。一些最常见的解决方案包括:更改摄取过程/间隔批处理文件合并序列文件HBaseS3DistCp(如果使用Amazon EMR)使用CombineFileInputFormatHive配置使用Hadoop的附加功能更改摄取过程/间隔摆脱小文件的最简单方法就是不首先生成它们。如果源系统生成数千个复制到Hadoop的小文件,请调查更改源系统以生成一些大文件,或者在摄取到HDFS时可能连接文件。如果您每小时仅摄取10 MB数据,请确定是否每天只能摄取一次。您将创建1x240MB文件而不是24x10MB文件。但是,您可能无法控制创建文件的源系统或业务需求要求您以间隔频率接收数据,以便小文件不可避免。如果小文件确实是不可避免的,那么应该考虑其他解决方案。批处理文件合并当小文件不可避免时,文件合并是最常见的解决方案。使用此选项,您可以定期运行一个简单的合并MapReduce作业来读取文件夹中的所有小文件,并将它们重写为更少的大文件。如果文件夹中有1000个文件,并且MapReduce作业仅指定5个文件,则1000个输入文件将合并为5个输出文件。接下来是一些简单的HDFS文件/文件夹操作,您将内存占用减少了200:1,并且可能提高了对同一数据的未来MapReduce处理的性能。这可以在Pig,load和store语句中实现。例如,如果合并文本文件:在Hive或Java MapReduce中实现这一点也同样容易。这些MapReduce作业在执行时显然需要集群资源,并且通常在非工作时间进行调度。但是,应该足够频繁地运行它们,这样小文件的性能影响就不会变得太大。通常在这些作业中内置额外的逻辑,以便只合并文件夹中对性能有显著影响的文件。在一个仅包含三个文件的文件夹中合并文件的性能优势不如在一个包含500个小文件的文件夹中合并文件。检查文件夹以确定应合并哪些文件夹可以通过多种方式完成。例如,Pentaho数据集成作业可用于迭代HDFS中的一组文件夹,找到满足最小合并要求的文件夹。还有一个专门为此任务设计的预编写应用程序名为File Crush,这是一个由Edward Capriolo编写的开源项目。File Crush不受专业支持,因此不保证它将继续与未来版本的Hadoop一起使用。批处理文件合并不会保留原始文件名。如果拥有原始文件名对于处理或了解数据来源非常重要,则批处理文件合并将不起作用。但是,大多数HDFS设计在文件夹级别而不是在每个文件中嵌入命名语义。采用这种做法会将文件名依赖性作为一个问题删除。序列文件当需要维护原始文件名时,一种非常常见的方法是使用Sequence文件。在此解决方案中,文件名作为密钥存储在序列文件中,文件内容作为值存储。下表给出了如何将小文件存储在序列文件中的示例:如果您有10,000个小文件,则您的序列文件将包含10,000个密钥,每个文件一个。序列文件支持块压缩,并且是可拆分的,这意味着MapReduce作业每个128MB块只能启动一个map任务,而不是每个小文件一个map任务。当您需要维护输入文件名,并且同时摄取数百或数千个小文件时,这非常有效。但是,如果您一次只提取少量小文件,则序列文件也不能正常工作,因为Hadoop文件是不可变的,无法追加。三个10MB文件将产生30MB的序列文件,根据我们的定义,这仍然是一个小文件。另一个挑战是检索序列文件中的文件名列表需要处理整个文件。此外,Hive在此结构中与序列文件不兼容。Hive将值中的所有数据视为单行。使用Hive查询此数据并不容易,因为文件的整个内容将是Hive中的单行。最后,您创建的Hive表将无法访问序列文件密钥,文件名,并且只能访问值,即文件的内容。可以编写自定义Hive serde来解决这些挑战,但这是一个超越Hadoop本机功能的高级功能。结论我们讨论了使用Hadoop Archive(HAR)文件来最小化NameNode内存使用的权衡。我们讨论并驳回了使用Federated NameNodes作为小文件问题的灵丹妙药。并且,我们为小文件整合引入了一些常用的解决方案 - 这些解决方案可以提高NameNode内存使用率和MapReduce性能。

January 26, 2019 · 1 min · jiezi

Hadoop小文件解决方案-Hadoop小文件的前因后果

Hadoop不适用于大量小文件,而是需要更少的大文件。这可能是您之前听过的声明。但是,为什么Hadoop会出现大量小文件的问题?而且,“小”究竟是什么意思呢?在本系列的第一部分中,我将回答这些问题。后续部分将讨论解决或解决小文件问题。什么是小文件?小文件可以定义为任何明显小于Hadoop块大小的文件。Hadoop块大小通常设置为64,128, 256 MB,越来越大。在本博客的其余部分提供示例时,我们将使用128MB的块大小。如果一个文件的大小不是块大小的75%,那么它就是一个小文件。然而,小文件问题并不仅仅影响小文件。如果Hadoop集群中的大量文件稍微大于块大小的增量,那么您将遇到与小文件相同的挑战。例如,如果您的块大小为128MB,但加载到Hadoop的所有文件都是136MB,那么您将拥有大量小的8MB块。好消息是解决小块问题就像选择合适的(较大的)块大小一样简单。解决小文件问题要复杂得多。注意我从来没有提到行数。虽然行数可以影响MapReduce性能,但在确定如何将文件写入HDFS时,它远不如文件大小重要。为什么会出现小文件?小文件问题是我们经常在Hadoop项目中看到的问题。公司可能在Hadoop中拥有小文件的原因有很多,包括:公司越来越渴望能够实时获得数据,导致Hadoop摄取过程每小时/每周/每周运行,每个周期只生成10MB的新数据。源系统生成数千个小文件,这些文件无需修改即可直接复制到Hadoop中。MapReduce作业的配置使用超过必要数量的reducer,每个reduceup输出自己的文件。同样,如果数据中的偏差导致大部分数据转到一个减速器,那么剩余的减速器将处理非常少的数据并产生小的输出文件。为什么Hadoop有一个小文件问题?Hadoop存在小文件问题有两个主要原因:NameNode内存管理和MapReduce性能。namenode内存问题Hadoop中的每个目录,文件和块都表示为NameNode内存中的对象。根据经验,每个对象需要150个字节的内存。如果你有2000万个文件,每个文件需要1个块,你的NameNode需要6GB的内存。这显然是非常可行的,但随着您的扩展,您最终会达到NameNode可以处理的文件(块)数量的实际限制。十亿个文件需要300GB的内存,并假设每个文件都在同一个文件夹中!让我们考虑300GB NameNode内存要求的影响……当NameNode重新启动时,它必须从本地磁盘上的缓存中读取每个文件的元数据。这意味着从磁盘读取300GB的数据 - 可能会导致启动时间延迟。在正常操作中,NameNode必须不断跟踪并检查群集中每个数据块的存储位置。这是通过监听数据节点来报告其所有数据块来完成的。数据节点必须报告的块越多,它将消耗的网络带宽就越多。即使节点之间存在高速互连,这种规模的简单块报告也可能会造成破坏性。优化很明显。如果可以减少群集中的小文件数,则可以减少NameNode内存占用,启动时间和网络影响。MapReduce的性能问题拥有大量小文件会降低MapReduce处理的性能,无论是Hive,Pig,Cascading,Pentaho MapReduce还是Java MapReduce。第一个原因是大量的小文件意味着大量的随机磁盘IO。磁盘IO通常是MapReduce性能的最大限制因素之一。一次大的顺序读取总是胜过通过几次随机读取相同数量的数据。如果您可以将数据存储在更少,更大的块中,则可以减轻磁盘IO的性能影响。性能下降的第二个原因有点复杂,需要了解MapReduce如何处理文件和调度资源。我将在此解释中使用MapReduce版本1术语,因为它比使用Yarn更容易解释,但相同的概念适用于Yarn。当MapReduce作业启动时,它会为每个正在处理的数据块计划一个映射任务。存储在Hadoop中的每个文件至少有一个块。如果您有10,000个文件,每个文件包含10 MB的数据,则MapReduce作业将安排10,000个map任务。通常配置Hadoop,以便每个map任务在其自己的JVM中运行。您的Hadoop集群只有这么多资源。在MapReduce v1中,为避免节点过载,请指定节点可以处理的最大并发map数。通常,map的最大数量在5到20范围内。因此,要同时运行10,000个map,您必须拥有500到2000个节点。大多数Hadoop集群都小于此,导致JobTracker在等待打开的插槽时对map任务进行排队。如果您有一个包含总共100个插槽的20个节点群集,则您的队列将变得非常大,并且您的过程将花费很长时间。不要忘记,您的工作可能不是竞争集群资源的唯一工作。如果您拥有800个128 MB的文件而不是10,000个10MB文件,那么您只需要800个map任务。这将需要一个数量级减少JVM维护时间,并将导致更好的磁盘IO。即使处理128 MB的单个map任务将花费比处理10 MB的map任务处理更长的时间,但是当处理800个更大的文件时,所有处理时间的总和几乎总是要快几个数量级。如果你有小文件,你会怎么做?现在我们已经讨论了什么构成一个小文件以及为什么Hadoop更喜欢更大的文件,你如何避免小文件问题?在下一篇文章中,我将讨论NameNode内存问题的解决方案以及解决MapReduce性能问题的一些初始方案。在本系列一篇文章中,我将讨论性能问题的其他解决方案以及如何为您的情况选择最佳解决方案。

January 23, 2019 · 1 min · jiezi

以智能数据架构,挖掘增长金矿

对很多技术团队来说,在搭建智能数据架构的过程中,或多或少会遇到一些疑惑和挑战,经过多次实践后,有些团队已经破除疑惑,成功探索出一条搭建智能数据架构之路,那么他们是如何实现这一技术的呢?在近日的个推技术沙龙成都站,几位架构大师在现场开启了数据技术的“脑暴时间”。诺基亚网络成都研发中心研发经理刘朋 《数据增长时代的研发管理》企业在应对数据增长带来的巨大挑战时,需在研发和管理方面做好充足准备。研发方面,提升数据存储的扩展性;管理方面,除了增加对人和设备的管理外,要努力打造一支具有数据驱动型领导力的团队,让团队中的决策以数据为依据,同时创造出以数据为核心的文化氛围。大数据时代,想要成为一名数据驱动型领导(Data-Driver Leader),需要具备三大招式。第一招:关注研发团队的经济效益数据(Take an Economic View)研发团队不仅是成本中心,他们也具有创造经济效益的能力,作为一名数据驱动型领导,在日常工作中要关注相关技术实践能否为公司带来经济利益。第二招:让团队数据可视化(Transparency)在一支研发团队中,部门领导需要将数据可视化,让团队中的每个人都对核心数据有所了解,这样一来,当问题出现时,每个人都有能力去解决。第三招:基于数据,及时快速反馈(Fast Feedback)在团队运行过程中,作为领导者,不仅要制定好相应规划,同时要不断分析数据查找问题,并基于数据以及KPI给成员提供反馈。虽然数据驱动型领导在推动公司决策方面具有重要作用,但随着公司人员的扩充,部门墙和局部优化(Sub-optimization)越来越明显,此时需要打破部门墙,让各个部门和团队都能围绕一个共同的目标进行协作,以达到效益最大化的目标。个推大数据架构师袁凯 《机器学习平台建设与实践》机器学习工作的常规流程:运营者首先要将商业问题转化为机器学习能够解决的问题,然后再进行数据收集以及清洗和聚合的工作,接下来开启数据探索和特征工程,经过上述步骤,便能得到事物预测所需要的全部因素,此时,运营者可以选用不同的算法,并将算法进行训练,得到相应的应用模型。最后,运营者还需要利用真实的数据进行验证,确保模型的可行性。机器学习作为一门多领域交叉学科,是解决许多实际问题的有效工具。个推通过机器学习,构建了独有的冷、热、温标签,用以分析不同群体的基础属性和行为特征,描绘用户的精准画像,最终运用于智能推送和精准营销。想要完成机器学习平台的建设,需要注意三大要点:1.只有端到端的平台建设才会真正产生价值,同时,特征工程的数据和代码沉淀需要共享运营。2.从成效出发,聚焦痛点,不要盲目跟随行业,做好系统和培训的一体化。3.谨慎引入新技术栈。为了避免机器学习平台建设中出现的常见问题,个推的建模平台会提供相应的IDE以及呈现相应特征的管理系统,同时还能提供标准化的ID匹配服务和数据抽取服务,减少工程师的重复工作。此外,个推提供的打包部署服务和后续监控服务,也能够帮助企业保证平台的顺利运行。聚美优品大数据高级工程师贺鹏《大数据3.0流计算与智能决策》大数据3.0时期,Hadoop第一代、Spark内存计算第二代,早期流计算以及人工智能流计算同时并存。早期流计算具有强一致性、数据乱序与延迟等五大困难点,Flink的出现,有效解决了这些难题,同时Flink还兼具了可以实时增量计算、SQL支持以及CEP支持等六大优点。流计算发展至今,已经具备了CEP这一强大功能,这也是支撑流计算智能化的关键因素所在。现实生活中,很多复杂的场景无法通过显式规则来进行判断(传统编程为规则编程、指令编程以及if else编程),比如你无法用if else写出如何判断哪一张图片是树叶,你无法用有限的规则写出如何判断数据流中哪些是人为操作、哪些是机器人刷单,此时需要用机器学习模型来检测和匹配,同时需要ML和流计算相结合使用。通常情况下, ML模型主流场景有分类和回归两大场景,他们可以检查抽象中无状态 f = fx(x1,x2 ..)无状态模型(有状态的模型典型代表rnn),而在SQL语义中 UDF刚好与之对应(无状态),需要把模型放入流处理系统中,也就是将tensorflow PB model模型注册为udf,完成上述步骤后,数据流会进入ML检测阶段。使用流计算相关功能时,需要强大的平台予以支持,以便在上面实施SQL开发、授权等操作。

January 15, 2019 · 1 min · jiezi

应用AI芯片加速 Hadoop 3.0 纠删码的计算性能

本文由云+社区发表做为大数据生态系统中最重要的底层存储文件系统HDFS,为了保证系统的可靠性,HDFS通过多副本的冗余来防止数据的丢失。通常,HDFS中每一份数据都设置两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。随着数据量的增长,复制的代价也变得越来越明显:传统的3份复制相当于增加了200%的存储开销,给存储空间和网络带宽带来了很大的压力。因此,在保证可靠性的前提下如何提高存储利用率已成为当前HDFS应用的主要问题之一。针对这些问题,英特尔、Cloudera、华为以及其他的Apache Hadoop communit共同参与开始引入纠删码(Erasure Coding,EC)技术,在保证数据可靠性的同时大幅降低存储开销,节省2倍的存储空间。该feature计划在Hadoop3.0版本发布。什么是纠删码 ECErasure coding纠删码技术简称EC,是一种数据保护技术。最早用于通信行业中数据传输中的数据恢复,是一种编码容错技术。他通过在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。在一定范围的数据出错情况下,通过纠删码技术都可以进行恢复。在存储系统中,纠删码技术主要是通过利用纠删码算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。其基本思想是将k块原始的数据元素通过一定的编码计算,得到m块校验元素。对于这k+m块元素,当其中任意的m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的k块数据。生成校验的过程被成为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。Reed-Solomon(RS)码是存储系统较为常用的一种纠删码,它有两个参数k和m,记为RS(k,m)。如图1所示,k个数据块组成一个向量被乘上一个生成矩阵(Generator Matrix)GT从而得到一个码字(codeword)向量,该向量由k个数据块和m个校验块构成。如果一个数据块丢失,可以用(GT)-1乘以码字向量来恢复出丢失的数据块。RS(k,m)最多可容忍m个块(包括数据块和校验块)丢失。ECHDFS引入EC码的优势和劣势优势EC码的优势是显而易见的,可以大幅度的降低数据的存储空间。特别是PB、EB级的场景下,会极大的削减存储的成本。劣势EC技术的优势确实明显,但是他的使用也是需要一些代价的,一旦数据需要恢复,他会造成两大资源的消耗:网络带宽消耗(数据恢复需要去读其他的数据块和校验块),CPU消耗(编解码计算)。GPU、TPU加速纠删码的运算从上面的EC码优缺点对比可以看出,虽然EC码可以大幅的节省空间,但是因为在存储和恢复的过程中需要额外的运算。用在线上系统的时候,一旦有节点挂掉触发数据恢复,计算量是比较大的,可能会对集群的整体性能造成影响,拖慢正常的计算任务。在上面的介绍中我们看到,EC码的计算实际上就是矩阵相乘的计算,而目前AI业界最火热的神经网络的计算也是当量的矩阵相乘相加。由此我们可以大胆的想象,是否可以利用目前GPU和TPU对矩阵运算的优化,来加速EC码的计算性能呢?目前业界比较领先的两个AI计算加速芯片分别为NVIDIA的Volta GPU架构和Google的TPU。对于纯矩阵相加相乘的运算,GPU或TPU相比于CPU,性能的提升可以达到50~80倍。NVIDIANVIDIA的Tesla V100提供了120个专门用于矩阵运算的Tensor Core。每个 Tensor Core 包含一个 4x4x4 的矩阵处理阵列来完成 D=A x B + C 的运算,其中 A、B、C、D 是 4×4 的矩阵,如下图所示。矩阵相乘的输入 A 和 B 是 FP16 矩阵,相加矩阵 C 和 D 可能是 FP16 矩阵或 FP32 矩阵。Tensor Core每个 Tensor Core 每个时钟可执行 64 次浮点 FMA 混合精度运算(FP16 乘法与 FP32 累加),一个 SM 单元中的 8 个 Tensor Core 每个时钟可执行共计 1024 次浮点运算。相比于使用标准 FP32 计算的 Pascal GP100 而言,单个 SM 下的每个深度学习应用的吞吐量提升了 8 倍,所以这最终使得 Volta V100 GPU 相比于 Pascal P100 GPU 的吞吐量一共提升了 12 倍。Tensor Core 在与 FP32 累加结合后的 FP16 输入数据之上操作。FP16 的乘法得到了一个全精度结果,该结果在 FP32 和其他给定的 4x4x4 矩阵乘法点积的乘积运算之中进行累加。TPUTPU是Google为TensorFlow定制化的AI加速芯片。这个TPU芯片是面向datacenter inference应用。它的核心是由65,536个8-bit MAC组成的矩阵乘法单元(matrix multiply unit),峰值可以达到92 TeraOps/second (TOPS) 。有一个很大的片上存储器,一共28 MiB。它可以支持MLP,CNN和LSTM这些常见的NN网络,并且支持TensorFLow框架。摘要里面还可以看出,传统CPU和GPU使用的技术(caches, out-of-order execution, multithreading, multiprocessing, prefetching)它都没用,原因是它面向的应用都是deterministic execution model,这也是它可以实现高效的原因。它的平均性能(TOPS)可以达到CPU和GPU的15到30倍,能耗效率(TOPS/W)能到30到80倍。如果使用GPU的DDR5 memory,这两个数值可以达到大约GPU的70倍和CPU的200倍。TPU前景分析由于HDFS的内部逻辑已然十分复杂,社区对于HDFS EC码的改造需要分几个步奏来实现:用户可以读和写一个条形布局(Striping Layout)的文件;如果该文件的一个块丢失,后台能够检查出并恢复;如果在读的过程中发现数据丢失,能够立即解码出丢失的数据从而不影响读操作。支持将一个多备份模式(HDFS原有模式)的文件转换成连续布局(Contiguous Layout),以及从连续布局转换成多备份模式。编解码器将作为插件,用户可指定文件所使用的编解码器。编码器可以作为独立的插件,从而可以将使用AI加速硬件的编码器作为独立的插件,分发到有GPU或TPU硬件资源的集群中。特别是Hadoop 3.0的yarn组件目前也在也k8s深度整合,做一些GPU硬件资源的调度和管理。此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

January 8, 2019 · 1 min · jiezi

要不,我们简单聊聊Hadoop与它的生态圈

实际上,关于Hadoop及其生态系统的文章或者书籍已经汗牛充栋,在2016年大数据这个概念兴起的时候,有幸于能进入数据行业。虽然,在这2年里,并没有达到自己最初的期望,不过还是跨出了那么一步。 这里,我们简单的聊聊Hadoop及其生态圈(系统),不做太深入的探讨。Hadoop是什么?在互联网上经常看到Hadoop和大数据的名词,那么有时候有没有想过什么是Hadoop呢? Hadoop是什么,是1个使用Java编写的分布式系统架构。它让用户在不了解分布式底层细节的情况下,可以开发出分布式程序,并充分利用集群进行高速运算和存储。 现在,你应该知道Hadoop是什么了吧。Hadoop的组成在Hadoop的框架版本1.0中,最核心的设计是:HDFSMapReduce其中HDFS是Hadoop Distributed File System的缩写,是1个分布式文件系统,实际操作与POSIX(如Unix、Linux)系统的操作类似。这个文件系统提供了海量数据的存储,可以部署在低廉的硬件上。这对企业来说是1个很不错的选择,在硬件成本上降低了不少却完成了任务。 而MapReduce主要是为海量数据提供了计算。这样,通过Hadoop这个架构,我们就可以实现对海量数据的存储、访问与计算。 而在Hadoop版本2.0中,其核心设计演变为:HDFSYARN在这里,MapReduce被YARN所替代。YARN是1个Hadoop的资源管理器,它为上层应用提供了统一的资源管理和调度。它的引入,为集群在利用率、资源统一管理和数据共享等方面带来了巨大的好处。此时的Hadoop就不再是1个简单MapReduce处理的架构了。Hadoop适合怎样的应用场景?对于Hadoop适应的应用场景的问题,我们先来说下它不适合的场景:Hadoop不适合实时计算与分析方面的应用Hadoop不适合大量小文件处理场景Hadoop不适合低延迟数据访问场景Hadoop不适合多用户写入的场景由于Hadoop在设计的最初被设计为针对超大文件及流式数据访问,因此Hadoop适合如下一些场景:日志处理非实时的数据分析海量存储,比如ETL广告推荐离线计算需要注意的是,Hadoop只是1个架构。具体的应用场景,还需要借助它生态圈的其他工具来完善。Hadoop的生态圈有哪些?Hadoop的生态圈主要包括:Hive,提供数据仓库的数据分析Pig,提供数据流处理Mahout,提供数据挖掘相关算法HBase,提供分布式、实时、高维数据库Sqoop,提供关系型数据库数据与Hadoop的导入导出Flume,提供日志收集Zookeeper,提供分布式协作服务其结构如下图所示:Hadoop有哪些替代产品?由于Hadoop设计的问题以及企业业务的要求,存在如下一些替代Hadoop的产品:SparkFlinkdisco其中以Spark作为代表,最有潜力可以替代Hadoop。但是需要注意的是,Hadoop只是1个工具,存在其他替代品是很正常的。但是,这并不代表Hadoop会在未来就消失,只是在某些场景上使用的更少一些而已。 毕竟,Hadoop已经比较成熟和稳定,生态也相对完善,因此企业也喜欢应用。Hadoop与Spark有什么区别?Spark是另外1个大数据处理框架,相比Hadoop,其将计算数据存储在内存而不是硬盘,因此计算性能上比Hadoop快很多,可以作为Hadoop的1种补充。 相比Hadoop,Spark更适用于实时处理与分析的场景,另外在Spark中还提供了图计算GraphX及机器学习的Mlib库,通用性比Hadoop更强一些。 另外,Spark不是非要依附在Hadoop上才能生存,它可以与其他的分布式文件系统进行集成来运作。对于大数据开发来说,很多情况下是堆积木的1个过程。 对于大数据的技术栈而言,存在多个可选的方案而不是完全替代的方案。毕竟在软件工程项目中,是要考虑成本的,我们需要根据项目的经费选择合适的技术方案。学习Hadoop能拿高薪吗?任何1门高薪的职业,必定有其不可替代的技术门槛和技能要求,比如基金经理,必定是金融行业那么一撮的精英的存在,但是人家也要至少花个1亿美金的操练才可能称为称职的职业人士。 如果单纯觉得学习1个Hadoop就可以拿到高薪,那只能是痴人说梦话。当然,不排除一些培训机构会打着这样的幌子让你去培训。而要拿到高薪需要具有如下一些条件:有这样需求和给得起钱的企业你具有相关的职业技能你具有相关的学历具备相关面试技巧在2018年,可以说大家都过得小心翼翼,加薪是1件不容易的事情。伴随着2018各家厂商的裁员,人们在互联网的冬天的呼喊中迎来2019年爆竹声。随着资本会在2019年逐渐回归本质,但是要真的想通过大数据拿到高薪还是1件不容易的事情。 据不准确统计,实际上在招聘中很多企业虽然给出了大数据相关的岗位,但是并不代表它能提供给你合适的岗位。很多中小型企业招聘1个职位,实际上很多情况下它也不知道具体的岗位要求是什么,只能在网上搜罗一些关键词进行填写。可想而言,开出的薪资自然不尽如意。 另外,有些企业只是为了单纯的刷新存在感,发布一些招聘职位,而并不打算招聘,为了避免浪费时间,还需要擦亮眼睛。 排除了上述第1个外部原因,需要有这样需求和给得起前的企业的外因后,那么剩下的内因就是招聘人员自身的水平了。 首先,1家靠谱的企业总有完善的招聘流程,如果自己不是过硬的学历,比如985院校毕业。那么,要进入大数据行业真的会被拒之门外。另外,要想拿高薪,还需要具备过硬的心理素质和技术能力,而不是我对Hadoop及其生态系统有所了解,就可以轻松进入的。 在大数据行业中,加班加点是常饭,因为数据有时候真的很令人堪忧,自然是逃脱不了的事情。 当然,万事都不是绝对的。有些企业还是要转型的,会开设这样的研发部门,此时还是比较容易进去的。有必要进入大数据行业吗?大数据行业的工作,是1个考验综合能力的职位,绝不是网上一些公众号宣称的那么神奇和简单。 如果只是为了高薪而随意进入1个行业,是件挺危险的事情。如果在事先没有考虑妥当,完全是为了薪资而不是个人兴趣的话,你会很快发现就失去了前行的动力。 无论从事什么岗位,都要不定期的总结和归纳,从而形成自己的知识体系,并扩充自己的软技能。原文地址:http://blog.52sox.com/hadoop-…

January 5, 2019 · 1 min · jiezi

趣味集算:wordcount

WordCount 差不多是最常用的分布式系统练习程序了,Hadoop 就经常用这个当例子。我们来看用集算器怎么做 wordcount。先从单线程开始。例如,D:\files\novel 目录中,有一些小说文档,现在,需要统计这些小说中哪些单词最为常用:在集算器中,如果不嫌写得长,只要一句代码就可以搞定了: A1=directory@p(“D:/files/novel”).(file().read().words().groups(lower():Word;count():Count)).merge(Word).groups@o(Word;sum(Count):Count).sort@z(Count)怎么样,是不是超级简单?计算后,A1 中得到的结果如下:不过,这句确实有点长,为了便于理解,我们可以把它拆成多步来执行: ABC1=directory@p(“D:/files/novel”)[]=now()2for A1=file(A2).read().words() 3 =B2.groups(lower():Word;count():Count) 4 >B1=B1[B3] 5=B1.merge(Word)=A5.groups@o(Word;sum(Count):Count).sort@z(Count)=interval@ms(C1,now())在 A1 中,列出目录中的各个文件:第 24 行循环统计每个文件中的单词。B2 中读取文件中的文本并拆分成单词:B3 中统计出当前文档中每个单词出现的次数,统计时将单词转换为小写字母,以避免大小写变化的影响。结果将按照单词的字典顺序排列:在每个文档统计完成后,在 B4 中将结果记录到 B1 中,所有文档统计后,B1 中结果如下:在 A5 中,将这些结果按照每个单词归并起来,结果如下:B5 中,将归并后的统计结果按每个单词聚合计算,再将结果按 Count 降序排列,可以得到和前面单条语句时相同的结果:在 C1 和 C5 中,通过记录执行开始前后的时刻,估算出计算所需的毫秒数如下:可见,执行效率还是非常高的。搞完单线程,我们再来试试多线程的搞法。并行计算会不会麻烦很多啊?看看代码吧: ABC1=directory@p(“D:/files/novel”) =now()2fork A1=file(A2).read().words() 3 =B2.groups(lower():Word;count():Count) 4=A2.merge(Word)=A4.groups@o(Word;sum(Count):Count).sort@z(Count)=interval@ms(C1,now())嗯,好象差不多嘛,就是把 A2 的那个 for 换成了 fork,其它代码基本没什么变化。看看 C4 中的计时情况果然快了,并行真地起了作用(俺的笔记本只有双核,有这个性能提高也就差不多了)。这个 fork 语句就会自动把本来单线程串行执行的 for 循环变成多线程并行循环计算,程序员完全不用操心线程管理的事,是不是很简单?搞完多线程,现来搞集群。懒得真搞多个服务器来,就用一台机器启动多个进程模拟一下吧。在集算器安装目录的 esProc\bin 路径下,可以找到 esprocs.exe 文件,可以直接运行它来启动或配置服务器:在首次用 Start 按键启动服务器之前,可以先点击 Config 配置并行服务器的相关信息,如在 Unit 页面中配置本机中所要启动的服务器 ip 及端口:配置完成后,就可以回到服务器主窗口启动服务器。重复执行 esprocs.exe 可以再启动两个服务器,这 3 个服务器将依次使用配置中设置的 ip 和端口。这样单机上的服务器集群就准备完毕了。下面准备统计 4 个路径中所有文档的单词,由于这里使用单机模拟服务器集群的,所以每个服务器都是共用相同路径的,如果是远程服务器,设定时路径可能也会有所差异。 ABC1[192.168.10.229:4001,192.168.10.229:4004,192.168.10.229:4007][D:/files/novel1,D:/files/novel2, D:/files/novel3,D:/files/novel4] 2fork B1;A1=directory@p(A2) 3 fork B2=file(B3).read().words()4 =C3.groups(lower():Word;count():Count)5 return B3.merge(Word) 6=A2.merge(Word)=A6.groups@o(Word;sum(Count):Count).sort@z(Count) 在计算时,用 4 个文件路径作为参数,需要执行 4 个子任务分别计算某个路径中文件的单词数。只需要在 fork 后面加上各个服务器节点的地址,这些子任务就可以由集算器自动分派给服务器节点去计算并将结果汇总,程序员根本不用操心这些小问题。最后在 B6 中计算出结果如下:从各个服务器窗口中,可以看到集群计算任务的分配执行情况:怎么样?很简单吧,Hadoop 还没搭建起来的时间,咱已经把活干完了。 ...

December 28, 2018 · 1 min · jiezi

Python进阶:切片的误区与高级用法

众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢?切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。通常来说,切片的作用就是截取序列对象,然而,它还有一些使用误区与高级用法,都值得我们注意。所以,本文将主要跟大家一起来探讨这些内容,希望你能学有所获。事先声明,切片并非列表的专属操作,但因为列表最具有代表性,所以,本文仅以列表为例作探讨。1、切片的基础用法列表是 Python 中极为基础且重要的一种数据结构,我曾写过一篇汇总文章(链接见文末)较全面地学习过它。文中详细地总结了切片的基础用法,现在回顾一下:切片的书写形式:[i : i+n : m] ;其中,i 是切片的起始索引值,为列表首位时可省略;i+n 是切片的结束位置,为列表末位时可省略;m 可以不提供,默认值是1,不允许为0 ,当m为负数时,列表翻转。注意:这些值都可以大于列表长度,不会报越界。切片的基本含义是:从序列的第i位索引起,向右取到后n位元素为止,按m间隔过滤 。li = [1, 4, 5, 6, 7, 9, 11, 14, 16]# 以下写法都可以表示整个列表,其中 X >= len(li)li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]li[1:5] == [4,5,6,7] # 从1起,取5-1位元素li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤li[-1:] == [16] # 取倒数第一个元素li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素# 步长为负数时,列表先翻转,再截取li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤# 切片的步长不可以为0li[::0] # 报错(ValueError: slice step cannot be zero)上述的某些例子对于初学者(甚至很多老手)来说,可能还不好理解。我个人总结出两条经验:(1)牢牢记住公式[i : i+n : m] ,当出现缺省值时,通过想象把公式补全;(2)索引为负且步长为正时,按倒数计算索引位置;索引为负且步长为负时,先翻转列表,再按倒数计算索引位置。2、切片是伪独立对象切片操作的返回结果是一个新的独立的序列(PS:也有例外,参见《Python是否支持复制字符串呢?》)。以列表为例,列表切片后得到的还是一个列表,占用新的内存地址。当取出切片的结果时,它是一个独立对象,因此,可以将其用于赋值操作,也可以用于其它传递值的场景。但是,切片只是浅拷贝,它拷贝的是原列表中元素的引用,所以,当存在变长对象的元素时,新列表将受制于原列表。li = [1, 2, 3, 4]ls = li[::]li == ls # Trueid(li) == id(ls) # Falseli.append(li[2:4]) # [1, 2, 3, 4, [3, 4]]ls.extend(ls[2:4]) # [1, 2, 3, 4, 3, 4]# 下例等价于判断li长度是否大于8if(li[8:]): print(“not empty”)else: print(“empty”)# 切片列表受制于原列表lo = [1,[1,1],2,3]lp = lo[:2] # [1, [1, 1]]lo[1].append(1) # [1, [1, 1, 1], 2, 3]lp # [1, [1, 1, 1]]由于可见,将切片结果取出,它可以作为独立对象使用,但是也要注意,是否取出了变长对象的元素。3、切片可作为占位符切片既可以作为独立对象被“取出”原序列,也可以留在原序列,作为一种占位符使用。在写《详解Python拼接字符串的七种方式》的时候,我介绍了几种拼接字符串的方法,其中三种格式化类的拼接方法(即 %、format()、template)就是使用了占位符的思想。对于列表来说,使用切片作为占位符,同样能够实现拼接列表的效果。特别需要注意的是,给切片赋值的必须是可迭代对象。li = [1, 2, 3, 4]# 在头部拼接li[:0] = [0] # [0, 1, 2, 3, 4]# 在末尾拼接li[len(li):] = [5,7] # [0, 1, 2, 3, 4, 5, 7]# 在中部拼接li[6:6] = [6] # [0, 1, 2, 3, 4, 5, 6, 7]# 给切片赋值的必须是可迭代对象li[-1:-1] = 6 # (报错,TypeError: can only assign an iterable)li[:0] = (9,) # [9, 0, 1, 2, 3, 4, 5, 6, 7]li[:0] = range(3) # [0, 1, 2, 9, 0, 1, 2, 3, 4, 5, 6, 7]上述例子中,若将切片作为独立对象取出,那你会发现它们都是空列表,即 li[:0]==li[len(li):]==li[6:6]==[] ,我将这种占位符称为“纯占位符”,对纯占位符赋值,并不会破坏原有的元素,只会在特定的索引位置中拼接进新的元素。删除纯占位符时,也不会影响列表中的元素。与“纯占位符”相对应,“非纯占位符”的切片是非空列表,对它进行操作(赋值与删除),将会影响原始列表。如果说纯占位符可以实现列表的拼接,那么,非纯占位符可以实现列表的替换。li = [1, 2, 3, 4]# 不同位置的替换li[:3] = [7,8,9] # [7, 8, 9, 4]li[3:] = [5,6,7] # [7, 8, 9, 5, 6, 7]li[2:4] = [‘a’,‘b’] # [7, 8, ‘a’, ‘b’, 6, 7]# 非等长替换li[2:4] = [1,2,3,4] # [7, 8, 1, 2, 3, 4, 6, 7]li[2:6] = [‘a’] # [7, 8, ‘a’, 6, 7]# 删除元素del li[2:3] # [7, 8, 6, 7]切片占位符可以带步长,从而实现连续跨越性的替换或删除效果。需要注意的是,这种用法只支持等长替换。li = [1, 2, 3, 4, 5, 6]li[::2] = [‘a’,‘b’,‘c’] # [‘a’, 2, ‘b’, 4, ‘c’, 6]li[::2] = [0]*3 # [0, 2, 0, 4, 0, 6]li[::2] = [‘w’] # 报错,attempt to assign sequence of size 1 to extended slice of size 3del li[::2] # [2, 4, 6]4、更多思考其它编程语言是否有类似于 Python 的切片操作呢?有什么差异?我在交流群里问了这个问题,小伙伴们纷纷说 Java、Go、Ruby……在查看相关资料的时候,我发现 Go 语言的切片是挺奇怪的设计。首先,它是一种特殊类型,即对数组(array)做切片后,得到的竟然不是一个数组;其次,你可以创建和初始化一个切片,需要声明长度(len)和容量(cap);再者,它还存在超出底层数组的界限而需要进行扩容的动态机制,这倒是跟 Python 列表的超额分配机制有一定相似性……在我看来,无论是用意,还是写法和用法,都是 Python 的切片操作更明了与好用。所以,本文就不再进行跨编程语言的比较了(唔,好吧我承认,其实是我不怎么懂其它编程语言……)最后,还有一个问题:Python 的切片操作有什么底层原理呢? 我们是否可以自定义切片操作呢?限于篇幅,我将在下次推文中跟大家一起学习,敬请期待。延伸阅读 :超强汇总:学习Python列表,只需这篇文章就够了详解Python拼接字符串的七种方式Python是否支持复制字符串呢?PS:本公众号(Python猫)已开通读者交流群,详情请通过菜单栏中的“交流群”了解。—————–本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。 ...

December 23, 2018 · 2 min · jiezi

logstash通过webhdfs放入hdfs增加时间戳和host字段

1.问题描述logstash通过webhdfs插件把数据放入hdfs的时候,发现每行数据的签名都增加了一个时间戳和host字段2018-12-19T08:30:30.234Z %{host} “128.1.1.2” “GET"2.资料查找在网上找了很多资料,描述的都是webhdfs怎么使用,至于使用后的数据格式都没有说我去github的logstash-plugins下看了一下issues,看到了如下的文章,给出了解决办法https://github.com/logstash-plugins/logstash-output-webhdfs/issues/253.解决办法通过codec对输出数据进行format codec => line { format => “%{message}” }

December 19, 2018 · 1 min · jiezi

Data Lake Analytics + OSS数据文件格式处理大全

前言Data Lake Analytics是Serverless化的云上交互式查询分析服务。用户可以使用标准的SQL语句,对存储在OSS、TableStore上的数据无需移动,直接进行查询分析。目前该产品已经正式登陆阿里云,欢迎大家申请试用,体验更便捷的数据分析服务。请参考https://help.aliyun.com/document_detail/70386.html 进行产品开通服务申请。在上一篇教程中,我们介绍了如何分析CSV格式的TPC-H数据集。除了纯文本文件(例如,CSV,TSV等),用户存储在OSS上的其他格式的数据文件,也可以使用Data Lake Analytics进行查询分析,包括ORC, PARQUET, JSON, RCFILE, AVRO甚至ESRI规范的地理JSON数据,还可以用正则表达式匹配的文件等。本文详细介绍如何根据存储在OSS上的文件格式使用Data Lake Analytics (下文简称 DLA)进行分析。DLA内置了各种处理文件数据的SerDe(Serialize/Deserilize的简称,目的是用于序列化和反序列化)实现,用户无需自己编写程序,基本上能选用DLA中的一款或多款SerDe来匹配您OSS上的数据文件格式。如果还不能满足您特殊文件格式的处理需求,请联系我们,尽快为您实现。1. 存储格式与SerDe用户可以依据存储在OSS上的数据文件进行建表,通过STORED AS 指定数据文件的格式。例如,CREATE EXTERNAL TABLE nation ( N_NATIONKEY INT, N_NAME STRING, N_REGIONKEY INT, N_COMMENT STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’ STORED AS TEXTFILE LOCATION ‘oss://test-bucket-julian-1/tpch_100m/nation’;建表成功后可以使用SHOW CREATE TABLE语句查看原始建表语句。mysql> show create table nation;+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+| Result |+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+| CREATE EXTERNAL TABLE nation( n_nationkey int, n_name string, n_regionkey int, n_comment string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|‘STORED AS TEXTFILELOCATION ‘oss://test-bucket-julian-1/tpch_100m/nation’|+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+1 row in set (1.81 sec)下表中列出了目前DLA已经支持的文件格式,当针对下列格式的文件建表时,可以直接使用STORED AS,DLA会选择合适的SERDE/INPUTFORMAT/OUTPUTFORMAT。在指定了STORED AS 的同时,还可以根据具体文件的特点,指定SerDe (用于解析数据文件并映射到DLA表),特殊的列分隔符等。后面的部分会做进一步的讲解。2. 示例2.1 CSV文件CSV文件,本质上还是纯文本文件,可以使用STORED AS TEXTFILE。列与列之间以逗号分隔,可以通过ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ 表示。普通CSV文件例如,数据文件oss://bucket-for-testing/oss/text/cities/city.csv的内容为Beijing,China,010ShangHai,China,021Tianjin,China,022建表语句可以为CREATE EXTERNAL TABLE city ( city STRING, country STRING, code INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ STORED AS TEXTFILE LOCATION ‘oss://bucket-for-testing/oss/text/cities’;使用OpenCSVSerde__处理引号__引用的字段OpenCSVSerde在使用时需要注意以下几点:用户可以为行的字段指定字段分隔符、字段内容引用符号和转义字符,例如:WITH SERDEPROPERTIES (“separatorChar” = “,”, “quoteChar” = “`”, “escapeChar” = "" );不支持字段内嵌入的行分割符;所有字段定义STRING类型;其他数据类型的处理,可以在SQL中使用函数进行转换。例如,CREATE EXTERNAL TABLE test_csv_opencsvserde ( id STRING, name STRING, location STRING, create_date STRING, create_timestamp STRING, longitude STRING, latitude STRING) ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’with serdeproperties(“separatorChar”=",",“quoteChar”=""",“escapeChar”="\")STORED AS TEXTFILE LOCATION ‘oss://test-bucket-julian-1/test_csv_serde_1’;自定义分隔符需要自定义列分隔符(FIELDS TERMINATED BY),转义字符(ESCAPED BY),行结束符(LINES TERMINATED BY)。需要在建表语句中指定ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ ESCAPED BY ‘\’ LINES TERMINATED BY ‘\n’忽略CSV文件中的HEADER在csv文件中,有时会带有HEADER信息,需要在数据读取时忽略掉这些内容。这时需要在建表语句中定义skip.header.line.count。例如,数据文件oss://my-bucket/datasets/tpch/nation_csv/nation_header.tbl的内容如下:N_NATIONKEY|N_NAME|N_REGIONKEY|N_COMMENT0|ALGERIA|0| haggle. carefully final deposits detect slyly agai|1|ARGENTINA|1|al foxes promise slyly according to the regular accounts. bold requests alon|2|BRAZIL|1|y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special |3|CANADA|1|eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold|4|EGYPT|4|y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d|5|ETHIOPIA|0|ven packages wake quickly. regu|相应的建表语句为:CREATE EXTERNAL TABLE nation_header ( N_NATIONKEY INT, N_NAME STRING, N_REGIONKEY INT, N_COMMENT STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘|’ STORED AS TEXTFILE LOCATION ‘oss://my-bucket/datasets/tpch/nation_csv/nation_header.tbl’TBLPROPERTIES (“skip.header.line.count”=“1”);skip.header.line.count的取值x和数据文件的实际行数n有如下关系:当x<=0时,DLA在读取文件时,不会过滤掉任何信息,即全部读取;当0当x>=n时,DLA在读取文件时,会过滤掉所有的文件内容。2.2 TSV文件与CSV文件类似,TSV格式的文件也是纯文本文件,列与列之间的分隔符为Tab。例如,数据文件oss://bucket-for-testing/oss/text/cities/city.tsv的内容为Beijing China 010ShangHai China 021Tianjin China 022建表语句可以为CREATE EXTERNAL TABLE city ( city STRING, country STRING, code INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ STORED AS TEXTFILE LOCATION ‘oss://bucket-for-testing/oss/text/cities’;2.3 多字符数据字段分割符文件假设您的数据字段的分隔符包含多个字符,可采用如下示例建表语句,其中每行的数据字段分割符为“||”,可以替换为您具体的分割符字符串。ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe’with serdeproperties(“field.delim”="||")示例:CREATE EXTERNAL TABLE test_csv_multidelimit ( id STRING, name STRING, location STRING, create_date STRING, create_timestamp STRING, longitude STRING, latitude STRING) ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe’with serdeproperties(“field.delim”="||")STORED AS TEXTFILE LOCATION ‘oss://bucket-for-testing/oss/text/cities/’;2.4 JSON文件DLA可以处理的JSON文件通常以纯文本的格式存储,在建表时除了要指定STORED AS TEXTFILE, 还要定义SERDE。在JSON文件中,每行必须是一个完整的JSON对象。例如,下面的文件格式是不被接受的{“id”: 123, “name”: “jack”, “c3”: “2001-02-03 12:34:56”}{“id”: 456, “name”: “rose”, “c3”: “1906-04-18 05:12:00”}{“id”: 789, “name”: “tom”, “c3”: “2001-02-03 12:34:56”}{“id”: 234, “name”: “alice”, “c3”: “1906-04-18 05:12:00”}需要改写成:{“id”: 123, “name”: “jack”, “c3”: “2001-02-03 12:34:56”}{“id”: 456, “name”: “rose”, “c3”: “1906-04-18 05:12:00”}{“id”: 789, “name”: “tom”, “c3”: “2001-02-03 12:34:56”}{“id”: 234, “name”: “alice”, “c3”: “1906-04-18 05:12:00”}不含嵌套的JSON数据建表语句可以写CREATE EXTERNAL TABLE t1 (id int, name string, c3 timestamp)STORED AS JSONLOCATION ‘oss://path/to/t1/directory’;含有嵌套的JSON文件使用struct和array结构定义嵌套的JSON数据。例如,用户原始数据(注意:无论是否嵌套,一条完整的JSON数据都只能放在一行上,才能被Data Lake Analytics处理):{ “DocId”: “Alibaba”, “User_1”: { “Id”: 1234, “Username”: “bob1234”, “Name”: “Bob”, “ShippingAddress”: { “Address1”: “969 Wenyi West St.”, “Address2”: null, “City”: “Hangzhou”, “Province”: “Zhejiang” }, “Orders”: [{ “ItemId”: 6789, “OrderDate”: “11/11/2017” }, { “ItemId”: 4352, “OrderDate”: “12/12/2017” } ] } }使用在线JSON格式化工具格式化后,数据内容如下:{ “DocId”: “Alibaba”, “User_1”: { “Id”: 1234, “Username”: “bob1234”, “Name”: “Bob”, “ShippingAddress”: { “Address1”: “969 Wenyi West St.”, “Address2”: null, “City”: “Hangzhou”, “Province”: “Zhejiang” }, “Orders”: [ { “ItemId”: 6789, “OrderDate”: “11/11/2017” }, { “ItemId”: 4352, “OrderDate”: “12/12/2017” } ] }}则建表语句可以写成如下(注意:LOCATION中指定的路径必须是JSON数据文件所在的目录,该目录下的所有JSON文件都能被识别为该表的数据):CREATE EXTERNAL TABLE json_table_1 ( docid string, user_1 struct< id:INT, username:string, name:string, shippingaddress:struct< address1:string, address2:string, city:string, province:string >, orders:array< struct< itemid:INT, orderdate:string > > >)STORED AS JSONLOCATION ‘oss://xxx/test/json/hcatalog_serde/table_1/’;对该表进行查询:select * from json_table_1;+———+—————————————————————————————————————-+| docid | user_1 |+———+—————————————————————————————————————-+| Alibaba | [1234, bob1234, Bob, [969 Wenyi West St., null, Hangzhou, Zhejiang], [[6789, 11/11/2017], [4352, 12/12/2017]]] |+———+—————————————————————————————————————-+对于struct定义的嵌套结构,可以通过“.”进行层次对象引用,对于array定义的数组结构,可以通过“[数组下标]”(注意:数组下标从1开始)进行对象引用。select DocId, User_1.Id, User_1.ShippingAddress.Address1, User_1.Orders[1].ItemIdfrom json_table_1where User_1.Username = ‘bob1234’ and User_1.Orders[2].OrderDate = ‘12/12/2017’;+———+——+——————–+——-+| DocId | id | address1 | _col3 |+———+——+——————–+——-+| Alibaba | 1234 | 969 Wenyi West St. | 6789 |+———+——+——————–+——-+使用JSON函数处理数据例如,把“value_string”的嵌套JSON值作为字符串存储:{“data_key”:“com.taobao.vipserver.domains.meta.biz.alibaba.com”,“ts”:1524550275112,“value_string”:"{"appName":"","apps":[],"checksum":"50fa0540b430904ee78dff07c7350e1c","clusterMap":{"DEFAULT":{"defCkport":80,"defIPPort":80,"healthCheckTask":null,"healthChecker":{"checkCode":200,"curlHost":"","curlPath":"/status.taobao","type":"HTTP"},"name":"DEFAULT","nodegroup":"","sitegroup":"","submask":"0.0.0.0/0","syncConfig":{"appName":"trade-ma","nodegroup":"tradema","pubLevel":"publish","role":"","site":""},"useIPPort4Check":true}},"disabledSites":[],"enableArmoryUnit":false,"enableClientBeat":false,"enableHealthCheck":true,"enabled":true,"envAndSites":"","invalidThreshold":0.6,"ipDeleteTimeout":1800000,"lastModifiedMillis":1524550275107,"localSiteCall":true,"localSiteThreshold":0.8,"name":"biz.alibaba.com","nodegroup":"","owners":["junlan.zx","张三","李四","cui.yuanc"],"protectThreshold":0,"requireSameEnv":false,"resetWeight":false,"symmetricCallType":null,"symmetricType":"warehouse","tagName":"ipGroup","tenantId":"","tenants":[],"token":"1cf0ec0c771321bb4177182757a67fb0","useSpecifiedURL":false}"}使用在线JSON格式化工具格式化后,数据内容如下:{ “data_key”: “com.taobao.vipserver.domains.meta.biz.alibaba.com”, “ts”: 1524550275112, “value_string”: “{"appName":"","apps":[],"checksum":"50fa0540b430904ee78dff07c7350e1c","clusterMap":{"DEFAULT":{"defCkport":80,"defIPPort":80,"healthCheckTask":null,"healthChecker":{"checkCode":200,"curlHost":"","curlPath":"/status.taobao","type":"HTTP"},"name":"DEFAULT","nodegroup":"","sitegroup":"","submask":"0.0.0.0/0","syncConfig":{"appName":"trade-ma","nodegroup":"tradema","pubLevel":"publish","role":"","site":""},"useIPPort4Check":true}},"disabledSites":[],"enableArmoryUnit":false,"enableClientBeat":false,"enableHealthCheck":true,"enabled":true,"envAndSites":"","invalidThreshold":0.6,"ipDeleteTimeout":1800000,"lastModifiedMillis":1524550275107,"localSiteCall":true,"localSiteThreshold":0.8,"name":"biz.alibaba.com","nodegroup":"","owners":["junlan.zx","张三","李四","cui.yuanc"],"protectThreshold":0,"requireSameEnv":false,"resetWeight":false,"symmetricCallType":null,"symmetricType":"warehouse","tagName":"ipGroup","tenantId":"","tenants":[],"token":"1cf0ec0c771321bb4177182757a67fb0","useSpecifiedURL":false}"}建表语句为CREATE external TABLE json_table_2 ( data_key string, ts bigint, value_string string)STORED AS JSONLOCATION ‘oss://xxx/test/json/hcatalog_serde/table_2/’;表建好后,可进行查询:select * from json_table_2;+—————————————————+—————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+| data_key | ts | value_string |+—————————————————+—————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+| com.taobao.vipserver.domains.meta.biz.alibaba.com | 1524550275112 | {“appName”:”",“apps”:[],“checksum”:“50fa0540b430904ee78dff07c7350e1c”,“clusterMap”:{“DEFAULT”:{“defCkport”:80,“defIPPort”:80,“healthCheckTask”:null,“healthChecker”:{“checkCode”:200,“curlHost”:"",“curlPath”:"/status.taobao",“type”:“HTTP”},“name”:“DEFAULT”,“nodegroup”:"",“sitegroup”:"",“submask”:“0.0.0.0/0”,“syncConfig”:{“appName”:“trade-ma”,“nodegroup”:“tradema”,“pubLevel”:“publish”,“role”:"",“site”:""},“useIPPort4Check”:true}},“disabledSites”:[],“enableArmoryUnit”:false,“enableClientBeat”:false,“enableHealthCheck”:true,“enabled”:true,“envAndSites”:"",“invalidThreshold”:0.6,“ipDeleteTimeout”:1800000,“lastModifiedMillis”:1524550275107,“localSiteCall”:true,“localSiteThreshold”:0.8,“name”:“biz.alibaba.com”,“nodegroup”:"",“owners”:[“junlan.zx”,“张三”,“李四”,“cui.yuanc”],“protectThreshold”:0,“requireSameEnv”:false,“resetWeight”:false,“symmetricCallType”:null,“symmetricType”:“warehouse”,“tagName”:“ipGroup”,“tenantId”:"",“tenants”:[],“token”:“1cf0ec0c771321bb4177182757a67fb0”,“useSpecifiedURL”:false} |+—————————————————+—————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+下面SQL示例json_parse,json_extract_scalar,json_extract等常用JSON函数的使用方式:mysql> select json_extract_scalar(json_parse(value), ‘$.owners[1]’) from json_table_2;+——–+| _col0 |+——–+| 张三 |+——–+mysql> select json_extract_scalar(json_obj.json_col, ‘$.DEFAULT.submask’) from ( select json_extract(json_parse(value), ‘$.clusterMap’) as json_col from json_table_2) json_objwhere json_extract_scalar(json_obj.json_col, ‘$.DEFAULT.healthChecker.curlPath’) = ‘/status.taobao’;+———–+| _col0 |+———–+| 0.0.0.0/0 |+———–+mysql> with json_obj as (select json_extract(json_parse(value), ‘$.clusterMap’) as json_col from json_table_2)select json_extract_scalar(json_obj.json_col, ‘$.DEFAULT.submask’)from json_obj where json_extract_scalar(json_obj.json_col, ‘$.DEFAULT.healthChecker.curlPath’) = ‘/status.taobao’;+———–+| _col0 |+———–+| 0.0.0.0/0 |+———–+2.5 ORC文件Optimized Row Columnar(ORC)是Apache开源项目Hive支持的一种优化的列存储文件格式。与CSV文件相比,不仅可以节省存储空间,还可以得到更好的查询性能。对于ORC文件,只需要在建表时指定 STORED AS ORC。例如,CREATE EXTERNAL TABLE orders_orc_date ( O_ORDERKEY INT, O_CUSTKEY INT, O_ORDERSTATUS STRING, O_TOTALPRICE DOUBLE, O_ORDERDATE DATE, O_ORDERPRIORITY STRING, O_CLERK STRING, O_SHIPPRIORITY INT, O_COMMENT STRING) STORED AS ORC LOCATION ‘oss://bucket-for-testing/datasets/tpch/1x/orc_date/orders_orc’;2.6 PARQUET文件Parquet是Apache开源项目Hadoop支持的一种列存储的文件格式。使用DLA建表时,需要指定STORED AS PARQUET即可。例如,CREATE EXTERNAL TABLE orders_parquet_date ( O_ORDERKEY INT, O_CUSTKEY INT, O_ORDERSTATUS STRING, O_TOTALPRICE DOUBLE, O_ORDERDATE DATE, O_ORDERPRIORITY STRING, O_CLERK STRING, O_SHIPPRIORITY INT, O_COMMENT STRING) STORED AS PARQUET LOCATION ‘oss://bucket-for-testing/datasets/tpch/1x/parquet_date/orders_parquet’;2.7 RCFILE文件Record Columnar File (RCFile), 列存储文件,可以有效地将关系型表结构存储在分布式系统中,并且可以被高效地读取和处理。DLA在建表时,需要指定STORED AS RCFILE。例如,CREATE EXTERNAL TABLE lineitem_rcfile_date ( L_ORDERKEY INT, L_PARTKEY INT, L_SUPPKEY INT, L_LINENUMBER INT, L_QUANTITY DOUBLE, L_EXTENDEDPRICE DOUBLE, L_DISCOUNT DOUBLE, L_TAX DOUBLE, L_RETURNFLAG STRING, L_LINESTATUS STRING, L_SHIPDATE DATE, L_COMMITDATE DATE, L_RECEIPTDATE DATE, L_SHIPINSTRUCT STRING, L_SHIPMODE STRING, L_COMMENT STRING) STORED AS RCFILELOCATION ‘oss://bucke-for-testing/datasets/tpch/1x/rcfile_date/lineitem_rcfile'2.8 AVRO文件DLA针对AVRO文件建表时,需要指定STORED AS AVRO,并且定义的字段需要符合AVRO文件的schema。如果不确定可以通过使用Avro提供的工具,获得schema,并根据schema建表。在Apache Avro官网下载avro-tools-.jar到本地,执行下面的命令获得Avro文件的schema:java -jar avro-tools-1.8.2.jar getschema /path/to/your/doctors.avro{ “type” : “record”, “name” : “doctors”, “namespace” : “testing.hive.avro.serde”, “fields” : [ { “name” : “number”, “type” : “int”, “doc” : “Order of playing the role” }, { “name” : “first_name”, “type” : “string”, “doc” : “first name of actor playing role” }, { “name” : “last_name”, “type” : “string”, “doc” : “last name of actor playing role” } ]}建表语句如下,其中fields中的name对应表中的列名,type需要参考本文档中的表格转成hive支持的类型CREATE EXTERNAL TABLE doctors(number int,first_name string,last_name string)STORED AS AVROLOCATION ‘oss://mybucket-for-testing/directory/to/doctors’;大多数情况下,Avro的类型可以直接转换成Hive中对应的类型。如果该类型在Hive不支持,则会转换成接近的类型。具体请参照下表:2.9 可以用正则表达式匹配的文件通常此类型的文件是以纯文本格式存储在OSS上的,每一行代表表中的一条记录,并且每行可以用正则表达式匹配。例如,Apache WebServer日志文件就是这种类型的文件。某日志文件的内容为:127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] “GET /apache_pb.gif HTTP/1.0” 200 2326127.0.0.1 - - [26/May/2009:00:00:00 +0000] “GET /someurl/?track=Blabla(Main) HTTP/1.1” 200 5864 - “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19"每行文件可以用下面的正则表达式表示,列之间使用空格分隔:([^ ]) ([^ ]) ([^ ]) (-|\[[^\]]\]) ([^ "]|"[^"]") (-|[0-9]) (-|[0-9])(?: ([^ "]|"[^"]") ([^ "]|"[^"]"))?针对上面的文件格式,建表语句可以表示为:CREATE EXTERNAL TABLE serde_regex( host STRING, identity STRING, userName STRING, time STRING, request STRING, status STRING, size INT, referer STRING, agent STRING)ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.RegexSerDe’WITH SERDEPROPERTIES ( “input.regex” = “([^ ]) ([^ ]) ([^ ]) (-|\[[^\]]\]) ([^ "]|"[^"]") (-|[0-9]) (-|[0-9])(?: ([^ "]|"[^"]") ([^ "]|"[^"]"))?")STORED AS TEXTFILELOCATION ‘oss://bucket-for-testing/datasets/serde/regex’;查询结果mysql> select * from serde_regex;+———–+———-+——-+——————————+———————————————+——–+——+———+————————————————————————————————————————–+| host | identity | userName | time | request | status | size | referer | agent |+———–+———-+——-+——————————+———————————————+——–+——+———+————————————————————————————————————————–+| 127.0.0.1 | - | frank | [10/Oct/2000:13:55:36 -0700] | “GET /apache_pb.gif HTTP/1.0” | 200 | 2326 | NULL | NULL || 127.0.0.1 | - | - | [26/May/2009:00:00:00 +0000] | “GET /someurl/?track=Blabla(Main) HTTP/1.1” | 200 | 5864 | - | “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19” |+———–+———-+——-+——————————+———————————————+——–+——+———+————————————————————————————————————————–+2.10 Esri ArcGIS的地理JSON数据文件DLA支持Esri ArcGIS的地理JSON数据文件的SerDe处理,关于这种地理JSON数据格式说明,可以参考:https://github.com/Esri/spatial-framework-for-hadoop/wiki/JSON-Formats示例:CREATE EXTERNAL TABLE IF NOT EXISTS california_counties( Name string, BoundaryShape binary)ROW FORMAT SERDE ‘com.esri.hadoop.hive.serde.JsonSerde’STORED AS INPUTFORMAT ‘com.esri.json.hadoop.EnclosedJsonInputFormat’OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’LOCATION ‘oss://test_bucket/datasets/geospatial/california-counties/‘3. 总结通过以上例子可以看出,DLA可以支持大部分开源存储格式的文件。对于同一份数据,使用不同的存储格式,在OSS中存储文件的大小,DLA的查询分析速度上会有较大的差别。推荐使用ORC格式进行文件的存储和查询。为了获得更快的查询速度,DLA还在不断的优化中,后续也会支持更多的数据源,为用户带来更好的大数据分析体验。本文作者:金络阅读原文本文为云栖社区原创内容,未经允许不得转载。

November 23, 2018 · 5 min · jiezi

请读下面的这句绕口令:ResourceManager中的Resource Estimator框架介绍与算法剖析

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由宋超发表于云+社区专栏本文首先介绍了Hadoop中的ResourceManager中的estimator service的框架与运行流程,然后对其中用到的资源估算算法进行了原理剖析。一. Resource Estimator Service的出发点与目标 估计作业运行使用资源是大数据处理集群的一个重要且具有挑战性的问题。随着用户使用的集群资源越来越多,这一需求被逐渐放大。当前现有的解决方案一般是依赖于用户的经验来对作业资源需求进行估计,这样即繁琐又低效。根据对集群工作负载的分析,可以发现大部分工作(超过60%)是重复工作,这样我们便有机会根据作业历史资源使用情况来估计作业下一次的资源需求量。同时,在未来,希望能提出一种与框架无关的黑盒解决方案。这样,即使作业来自不同的计算框架,我们也能对重复性作业进行资源需求估算。二. Resource Estimator Service的框架结构 Hadoop-resource estimator主要由三个模块组成:Translator,SkylineStore和Estimator。下面分别介绍这三部分。1.ResourceSkyline用来表征作业在其生命周期中的资源利用率。它使用RLESparseResourceAllocation记录容器分配的信息。RecurrenceId用于标识重复pipeline的特定运行。pipeline可以包含多个作业,每个作业都有一个ResourceSkyline来表征其资源利用率。2.Translator用来解析作业日志,提取他们的ResourceSkylines并将它们存储到SkylineStore。SingleLineParser解析日志流中的一行并提取ResourceSkyline。3.SkylineStore充当Hadoop-resource estimator的存储层,由2部分组成。HistorySkylineStore存储由转换程序提取的ResourceSkylines。它支持四种操作:addHistory,deleteHistory,updateHistory和getHistory。addHistory将新的ResourceSkylines附加到定期pipeline,而updateHistory删除特定定期pipeline的所有ResourceSkyline,并重新插入新的ResourceSkylines。PredictionSkylineStore存储由Estimator生成的预测RLESparseResourceAllocation。它支持两个操作:addEstimation和getEstimation。4.Estimator根据历史记录运行预测重复出现的pipeline资源需求,将预测存储到SkylineStore并在YARN上进行资源预留。Solver读取特定定期pipeline的所有历史ResourceSkylines,并预测其包含在RLESparseResourceAllocation中的新资源需求。目前,Hadoop-resource estimator提供了一个LPSOLVER来进行预测(其中用到的算法模型会在后面进行讲解)。三.以示例demo演示其运行流程 Resource Estimator Service的URI是http://0.0.0.0,默认服务端口是9998(在$ ResourceEstimatorServiceHome/conf/resourceestimator-config.xml” 中配置)。 在$ ResourceEstimatorServiceHome/data中,有一个示例日志文件resourceEstimatorService.txt,其中包含2次运行的tpch_q12查询作业的日志。进行资源预测主要有以下几个步骤:1.解析作业日志:POST http://URI:port/resourceestimator/translator/LOG_FILE_DIRECTORY发送POST http://0.0.0.0:9998/resourceestimator/translator/data/resourceEstimatorService.txtunderlying estimator将从日志文件中提取ResourceSkylines并将它们存储在jobHistory SkylineStore中。2.查询作业的历史ResourceSkylines:GET http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}发送GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/underlying estimator将返回历史SkylineStore中的所有记录。在示例文件中能够看到两次运行tpch_q12的ResourceSkylines:tpch_q12_0和tpch_q12_1。3.预测作业的资源使用情况:GET http://URI:port/resourceestimator/estimator/{pipelineId}发送http://0.0.0.0:9998/resourceestimator/estimator/tpch_q12estimator将根据其历史ResourceSkylines预测新运行的作业资源需求,并将预测的资源需求存储到jobEstimation SkylineStore。4.查询作业的预测资源情况:GET http://URI:port/resourceestimator/skylinestore/estimate/{pipelineId}发送http://0.0.0.0:9998/resourceestimator/skylinestore/estimation/tpch_q12估算器将返回tpch_q12作业资源预测情况。5.删除作业的历史资源情况数据:DELETE http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}发送http://0.0.0.0:9998/resourceestimator/skylinestore/history/tpch_q12/tpch_q12_0underlying estimator将删除tpch_q12_0的ResourceSkyline记录。重新发送GET http://0.0.0.0:9998/resourceestimator/skylinestore/history//*underlying estimator只返回tpch_q12_1的ResourceSkyline。四.资源预测算法中用到的数据介绍 Hadoop-resource estimator的Translator组件会解析日志并将其按照一定规范的格式进行拼接,下面给出了示例中的资源历史使用数据和预测资源数据,可以看到作业的历史资源使用数据是同一个job的两次run,分别为tpch_q12_0和tpch_q12_1,其主要给出了随时间变化的memory和cpu的使用情况。其中第0时间单位表示的是container规格,为memory:1024,vcores:1,第25时间单位为作业结束时刻,memory和cpu皆为0。可以看到预测数据根据历史数据给出了1025时间单位的资源预测数据。历史资源使用数据:[[{“pipelineId”:“tpch_q12”,“runId”:“tpch_q12_0”},[{“jobId”:“tpch_q12_0”,“jobInputDataSize”:0.0,“jobSubmissionTime”:0,“jobFinishTime”:25,“containerSpec”:{“memory”:1024,“vcores”:1},“skylineList”:{“resourceAllocation”:{“0”:{“memory”:1024,“vcores”:1},“10”:{“memory”:1099776,“vcores”:1074},“15”:{“memory”:2598912,“vcores”:2538},“20”:{“memory”:2527232,“vcores”:2468},“25”:{“memory”:0,“vcores”:0}}}}]],[{“pipelineId”:“tpch_q12”,“runId”:“tpch_q12_1”},[{“jobId”:“tpch_q12_1”,“jobInputDataSize”:0.0,“jobSubmissionTime”:0,“jobFinishTime”:25,“containerSpec”:{“memory”:1024,“vcores”:1},“skylineList”:{“resourceAllocation”:{“0”:{“memory”:1024,“vcores”:1},“10”:{“memory”:813056,“vcores”:794},“15”:{“memory”:2577408,“vcores”:2517},“20”:{“memory”:2543616,“vcores”:2484},“25”:{“memory”:0,“vcores”:0}}}}]]]预测数据:{“resourceAllocation”:“10”:{“memory”:1083392,“vcores”:1058},“15”:{“memory”:2598912,“vcores”:2538},“20”:{“memory”:2543616,“vcores”:2484},“25”:{“memory”:0,“vcores”:0}}}五.Resource Estimator Service算法框架与原理 在本部分将重点介绍一下estimator中用到的资源预测算法原理。此算法由微软提出,其链接在文末参考资料中给出。下图是estimator的运行框架,可以看到其主要由三部分组成,下面分别介绍这三部分。imageAutomatic interence,提取出作业的运行时间和历史资源使用情况。 (a) Extractor of target,能提取出作业的运行开始与结束时间。 (b) Job resource model,能提取出作业的资源使用情况,例如作业资源随时间运行的变化情况和资源使用总量。Recurring Reservation,此部分包括有Job Resource Model,可以根据作业历史运行时间与作业历史资源使用情况给出下一任务的资源使用情况。 (a) 通过改变参数,可以控制estimator在分配资源的时候是侧重过分配还是侧重欠分配。 (b) 根据作业资源预测模型给出的预测值为作业在原来分配的资源的基础上添加资源添加agenda。此job下一个run就运行在此资源分配的基础上。Dynamic Reprovisioning,此部分根据前面给出的资源agenda,动态调整作业的每个运行阶段的资源分配。六.算法原理剖析 微软提出的此资源分配算法本质上是一种最优化算法,其优化的目标函数是由两部分组成的线性组合,下文中stage的概念是指每个job的运行期间按照一定规则划分成多个时间片,每个时间片称之为一个stage,下面分步骤阐述其算法原理。1.首先定义一个目标函数,也可以称之为损失函数,即我们优化的目标。在此算法中由过分配和欠分配组成的线性组合组成损失函数costfunction。目标就是minimize(cost=A0(s)+(1−)Au(s))。其中A0(s)表示在当前stage的资源过分配值,其是由当前stage的分配值减去此stage的历史资源使用均值然后取平均得到,其公式表示为A0(s)=1N∑Ni=1∑k(sk−si,k)+,sk即为当前的资源分配值,si,k即为第i次run的历史资源使用值;Au(s)表示当前stage的欠分配值,其是由上一stage的欠分配值加上当前stage的欠分配值得到,公式表示如下:Di,k(s1,…,sk)=(Di,k+si,k−sk)+,Au(s)=1N∑Ni=1Di,k(s),下图比较直观的显示了estimator在预测资源时的一种过分配与欠分配的情况。2.针对每个stage,此算法的策略就是选择可以使得costfunction最小的资源分配方式,即选择一个值使得costfunction最小,即得到Sk,即每一个stage上的资源分配值。 因为分配值是固定规格的倍数,所以在实现时可以通过简单的for循环或者一些最优化算法比如爬山法或者蚁群算法就可以快速得到最小值。3.总结:算法中的做法是针对一个job,根据其历史运行时间拿到其作业开始和结束时间,在这时间段内按照一定规则划分时间片,每一个时间片为一个stage,根据同一job多次run的历史资源使用情况来预测下一run的资源使用情况。其每次配置的策略是使得costfunction最小。costfunction是过分配与欠分配的一个线性组合。七.算法的测试效果 在本次测试中运行tpch_q12作业9次,并在每次运行中收集作业的资源skylines。然后,在Resource Estimator Service中运行日志解析器,从日志中提取ResourceSkylines并将它们存储在SkylineStore中。下面绘制了作业的ResourceSkylines以进行演示。 在Resource Estimator Service中运行估算器来预测新运行的资源需求,下面绘制了预测的资源需求数据。可以看到预测数据根据历史资源使用情况较好地表征了下一次运行的资源使用数据,有一定的参考意义。另外在实际场景业务上的测试效果还有待考证。八.参考1.Resourcemanager Estimator Service2.微软算法文章相关阅读简单聊聊py的高性能编程Prometheus 初体验IF函数——放松工作,享受生活! 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

October 13, 2018 · 1 min · jiezi

【云+社区极客说】新一代大数据技术:构建PB级云端数仓实践

本文来自腾讯云技术沙龙,本次沙龙主题为构建PB级云端数仓实践 在现代社会中,随着4G和光纤网络的普及、智能终端更清晰的摄像头和更灵敏的传感器、物联网设备入网等等而产生的数据,导致了PB级储存的需求加大。但数据保留下来并不代表它真的具有利用价值,曾经保存的几TB的日志,要么用来做做最简单的加减乘除统计,要么就在日后出现问题了,扒出日志堆找证据。你的影视库里面可以下载储存成千上万部影片,但不代表你真的能全部看完。如何将手里现有的数据变得更具有价值?一些营销云已经可以做到毫秒级响应做到精准投放广告,使用户的日志更有价值;人工智能逐渐参与辅助医疗,医学影像数据值得保存几十年了。无论是监管政策还是客户需求,随着技术进步价格降低,都在推动着数据总量越来越大。在这个大背景下,从公司战略到产业生态,从学术研究到生产实践,从城镇管理乃至国家治理,都将发生本质的变化。国家竞争力将部分体现为一国拥有数据的规模、活性以及解释、运用数据的能力。通过以Hadoop, Spark为代表的大数据技术来构建新型数据仓库,已经成为越来越多的企业应对数据挑战的方式。大数据最前沿的的技术与行业趋势如何?传统企业级数仓将面临怎样的挑战?而腾讯云大数据又是如何应对的?本期极客说将为您一一解答。本次云+社区极客说邀请了堵俊平(腾讯云大数据基础团队负责人,大数据技术专家)来为大家介绍大数据领域最近的技术趋势,包含介绍Hadoop与Spark技术的最新进展。并将通过一些实际的应用案例,来介绍腾讯大数据是如何在云上构建PB级的数据仓库,以及如何解决一些工程难题的。演讲嘉宾堵俊平腾讯云大数据基础团队负责人,大数据技术专家曾任EMC,VMware资深研发工程师Hortonworks美国YARN团队负责人深耕云计算,大数据方向10余年在多个社区均享有极高知名度,包括Apache Hadoop社区Committer & PMC领导hadoop 2.6、2.8等应用非常广泛的社区release曾领导开发多个Hadoop在云平台上优化与拓展的项目与产品目前在腾讯致力于领导腾讯云大数据及人工智能产品研发直播时间:10月18日 19:00内容简介:大数据新时代:大数据的技术与行业趋势Hadoop与Spark技术最近进展数仓技术发展:传统企业级数仓的挑战腾讯云构建大数据云数仓的实践与技术分享新的趋势:数据湖识别图中二维码即可免费报名预约直播哦!

October 11, 2018 · 1 min · jiezi

rabbitMq常用创建消息应用的maven demo项目(一)---路由routing

rabbitmq官网上提供了6个demo,分别从是hello world、工作队列、发布/订阅、路由、主题、rpc这六个demo。基本上看完这6哥demo之后,对rabbitmq应该就有了清晰的认识,并且可以达到基本数量应用的程度。下面我挑选最常用的路由和主题这两个demo,为大家翻译下。个人加谷歌翻译,有不合适的地方,欢迎大家批评指正。Routing—路由在之前的教程中,我们构建了一个简单的日志系统 我们能够将日志消息广播给许多接收者。在本教程中,我们将在他的基础上添加一个功能 - 只订阅一部分消息。例如,我们只将严重错误的消息导入日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。 ...

May 14, 2018 · 2 min · jiezi

apache storm demo示例

从国外网站上翻译的,主要业务是创建移动电话日志分析器。 场景 - 移动呼叫日志分析器 移动电话及其持续时间将作为Apache Storm的输入提供,Storm将处理并分组相同呼叫者和接收者之间的呼叫及其呼叫总数。 创建Spout Spout是用于数据生成的组件。基本上,spout将实现一个IRichSpout接口。“IRichSpout”界面有以下重要方法 - open - 为spout提供执行环境。执行者将运行此方法来初始化spout。 nextTuple - 通过收集器发出生成的数据。 close - spout将要关闭时调用此方法。 declareOutputFields - 声明元组的输出模式。 ack - 确认处理了特定的tuple fail - 指定一个特定的tuple不被处理并且不被重新处理。 open __open__方法的签名如下 - open(Map conf, TopologyContext context, SpoutOutputCollector collector) conf - 为此spout提供storm暴配置。 context - 提供关于topology中spout位置,其任务ID,输入和输出信息的完整信息。 collector - 使我们能够发出将由bolts处理的tuple。 nextTuple __nextTuple__方法的签名如下 - nextTuple() nextTuple()从与ack()和fail()方法相同的循环周期性地调用。当没有工作要做时,它必须释放对线程的控制,以便其他方法有机会被调用。所以nextTuple的第一行检查处理是否完成。如果是这样,它应该睡眠至少一毫秒,以在返回之前减少处理器上的负载。 ...

May 7, 2018 · 4 min · jiezi

Server IPC version 9 cannot communicate with client version 4 hadoop hdfs连接不上

commons-httpclient-3.1.jarcommons-io-2.4.jarcommons-lang-2.6.jarcommons-logging-1.1.3.jarcommons-net-3.1.jarguava-11.0.2.jarhadoop-common-2.6.2.jarhadoop-auth-2.6.2.jarslf4j-api-1.7.5.jarhadoop-hdfs-2.6.2.jarcommons-cli-1.2.jarprotobuf-java-2.5.0.jarhtrace-core-3.0.4.jar在pom.xml中添加这些commons-httpclient-3.1.jarcommons-io-2.4.jarcommons-lang-2.6.jarcommons-logging-1.1.3.jarcommons-net-3.1.jarguava-11.0.2.jarhadoop-common-2.6.2.jarhadoop-auth-2.6.2.jarslf4j-api-1.7.5.jarhadoop-hdfs-2.6.2.jarcommons-cli-1.2.jarprotobuf-java-2.5.0.jarhtrace-core-3.0.4.jar 以下为示例代码: /** * @Autohor: liyj * @Description: * @Date:Created in 2017/11/7 * @Modified by : */import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;public class HdfsFileReader { private static final String NAME_NODE = “hdfs://tj02:8020”;//nameNomeHost = localhost if you use hadoop in local mode public static void main(String[] args) throws URISyntaxException, IOException {// String fileInHdfs = “/user/hive/warehouse/t001011003”; Configuration configuration = new Configuration();// configuration.set(“fs.hdfs.impl”,// org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()// );// configuration.set(“fs.file.impl”,// org.apache.hadoop.fs.LocalFileSystem.class.getName()// ); FileSystem fs = FileSystem.get(URI.create(NAME_NODE), configuration);//// fs.createNewFile(new Path("/user/hive/warehouse/t001011003/0000sadasd"));// String fileContent = IOUtils.toString(fs.open(new Path(fileInHdfs)), “UTF-8”);// System.out.println(“File content - " + fileContent);// copyFile2Hdfs(); Path listf = new Path("/user/hive/warehouse/t001011003”); FileStatus stats[] = fs.listStatus(listf); for (int i = 0; i < stats.length; ++i) { System.out.println(stats[i].getPath().toString()); } fs.close(); } public static void copyFile2Hdfs() throws IOException { Configuration conf = new Configuration(); FileSystem hdfs = FileSystem.get(conf); //本地文件// Path src =new Path(“D:\HebutWinOS”); //HDFS为止 Path dst = new Path("/");// hdfs.copyFromLocalFile(src, dst); System.out.println(“Upload to” + conf.get(“fs.default.name”)); FileStatus files[] = hdfs.listStatus(dst); for (FileStatus file : files) { System.out.println(file.getPath()); } }} ...

November 8, 2017 · 1 min · jiezi