我想使用datax导数据每天定时抽取数据,其中表名是按照每天的日期来命名的,请问这样怎么配置job??

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
DataX_命令行使用说明.doc 30页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
DataX_命令行使用说明.doc
你可能关注的文档:
··········
··········
DataX 命令行
版本号 修改内容 修改日期 修改人
V0.2 修改生成xml方式
V0.3 根据新版重写
1 产品介绍 4
2. 软件的安装及卸载 5
2.1软件的运行环境 5
2.2 软件的安装 6
2.3软件卸载 6
3 有关DataX名词解释 8
4 DataX作业配置向导(以从Mysql导出数据到Oracle的作业配置为例) 9
5 DataX运行 12
5.1 DataX任务启动命令 12
5.2 DataX运行时添加参数定义 12
6 日志记录 13
6.1 日志路径 13
7 使用Tips 14
7.1 使用变量避免生成过多job配置文件 14
8 附加功能 16
8.1 Mysql数据库切换 16
9 技术支持 20
附一 DataX Job配置文件配置项清单 21
1 产品介绍
DataX是一个让你方便的在不同类型的数据库之间交换数据的工具。它与Dbsync共同组成了数据平台的数据移动解决方案。
目前成熟的数据导入导出工具比较多,但是一般都只能用于数据导入或者导出,且只能支持一个或者几个特定类型的数据库。这样带来的一个问题是,如果我们拥有很多不同类型的数据(Mysql/Oracle/Rac/Hive/Other…),并且经常需要在它们之间导入导出数据,那么我们可能需要开发/维护/学习使用一批这样的工具(jdbcdump/dbReader/multithread/getmerge+sqlReader/mysqldumper)。而且,此后每增加一种库类型,我们需要的工具数目将程几何级别增长。(当我们需要将mysql的数据导入oracle的时候,有没有过想从jdbcdump和dbReader上各掰下来一半拼在一起到冲动?) 这些工具有些使用文件中转数据,有些使用管道,不同程度的为数据中转带来额外开销,效率差别非常大。很多工具也无法满足ETL任务中常见的需求,比如日期格式转化,特性字符的转化,编码转换。另外,有些时候,我们希望在一个很短的时间窗口内,将一份数据从一个数据库同时导出到多个不同类型的数据库。
DataX正是为了解决这些问题而生。
2. 软件的安装及卸载
软件的运行环境
系统要求:
首先请确认安装DataX的机器能够连上yum源
DataX 主要由Java和python开发,请确保安装DataX的机器上Java >=1.6, python >= 2.6,如下图:
测试Java 版本
测试python版本
其他软件要求:
如果需要使用oraclewriter,请确保已经安装oracle客户端,可以使用sqlplus进行测试,如果能够正常启动sqlplus,并连接到目的数据库,表示Oracle客户端连接ok,如下图
如果使用的是HdfsReader/HdfsWriter,请确保安装DataX的机器已经安装上了Hdfs客户端,并能够正常访问Hdfs文件系统,例如使用命令行: hadoop fs -ls /
同时请确保在执行DataX的用户/home目录下,链接Hadoop config目录文件,例如在用户目录下执行
/home/$user/config
hadoop-configure-目录
2.2 软件的安装
下列步骤请确保已在系统上配置淘宝yum源,具体的配置请咨询相关的SA。
执行如下命令
sudo yum install t_dp_dw_datax_core_all -b current
该命令将安装最新DataX engine以及所有开发的DataX插件包。
2.3软件卸载
执行如下命令
sudo yum remove t_dp_dw_datax_core_all
该命令将删除DataX包,其上所有的依赖包(插件包)都将会删除。
3 有关DataX名词解释
DataX: DataX是一个让你方便的在不同类型的数据库之间交换数据的工具。它与Dbsync共同组成了数据平台的数据移动解决方案。
Job: DataX将每个数据导入导出任务称为一个Job,每个Job逻辑上都有一份XML文件用来描述该Job的参数信息
DataX将数据交换的工作分为Reader和Writer,其中Reader负责从来源数据库(或hdfs)读取数据,负责读取数据的线程称之为Reader
Writer: DataX将数据交换的工作分为Reader和Writer,其中Writer负责写入数据到目的数据库(或hd
正在加载中,请稍后...&p&Kafka目前没有特别完备的中文资料,不过还是搜集了一些,希望对楼主有用:&/p&&p&&b&英文部分&/b&&/p&&p&1. 官网: &a href=&//link.zhihu.com/?target=https%3A//kafka.apache.org/documentation/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Apache Kafka&/a&
自然是最重要的,其实把官网文档完全理解了已经算是掌握得非常好了&/p&&p&2. JIRA列表:&a href=&//link.zhihu.com/?target=https%3A//issues.apache.org/jira/browse/KAFKA/%3FselectedTab%3Dcom.atlassian.jira.jira-projects-plugin%3Asummary-panel& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kafka - ASF JIRA&/a& Kafka issue列表,使用关键字去搜索你碰到的实际问题&/p&&p&3. Kafka KIP: &a href=&//link.zhihu.com/?target=https%3A//cwiki.apache.org/confluence/display/KAFKA/Kafka%2BImprovement%2BProposals& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kafka Improvement Proposals&/a& 可以看到最新的Kafka新功能提议及其讨论&/p&&p&4. Kafka设计文档:&a href=&//link.zhihu.com/?target=https%3A//cwiki.apache.org/confluence/display/KAFKA/Index& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Index - Apache Kafka - Apache Software Foundation&/a& 几乎可以找到所有的Kafka设计文档,其中关于controller和新版client的文章非常值得一看&/p&&p&5. StackOverflow: &a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/questions/tagged/apache-kafka%3Fsort%3Dnewest%26pageSize%3D15& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Newest 'apache-kafka' Questions&/a& stackoverflow上的kafka问题区,里面多是小白问题,但有些问题也是很有深度的~~&/p&&p&6. IRC归档日志: &a href=&//link.zhihu.com/?target=https%3A//botbot.me/freenode/apache-kafka/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IRC Logs for #apache-kafka&/a& IRC频道中有很多有价值的问题,有时候不比stackoverflow差&/p&&p&7. Confluent Blog: &a href=&//link.zhihu.com/?target=https%3A//www.confluent.io/blog/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Confluent Blog: Apache Kafka Best Practices, Product Updates & More&/a&
Kafka开发团队维护的一个技术博客,里面很多极具技术深度的文章&/p&&p&&b&中文部分&/b&&/p&&p&1. 美团李志涛博客:&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/lizhitao/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&apache kafka技术分享系列(目录索引) - 李志涛的专栏 - 博客频道 - CSDN.NET&/a&
这是Kafka中国社区QQ群管理员李志涛的博客,里面的内容很详尽,虽然更新程度并不是很快&/p&&p&2. 我的博客(厚着脸皮推荐一下):&a href=&//link.zhihu.com/?target=https%3A//www.cnblogs.com/huxi2b/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&胡夕 - 博客园&/a&
我的博客没有像我们群主大大李志涛那样有清晰的目录结构,只是随性而为,想到什么就写什么了。有兴趣也可以看看&/p&&p&3. OrcHome: &a href=&//link.zhihu.com/?target=http%3A//orchome.com/kafka/index& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&kafka中文教程 - OrcHome&/a&
不知道这是国内的哪位大神维护的一个Kafka问答网站,里面的内容不输李志涛的博客,有兴趣也可以看看&/p&&p&4. Kafka中国社区QQ群(再厚着脸皮推荐一下。。。): , 国内最大的Kafka技术qq群,有兴趣可以加进来一起讨论&/p&&p&5. 还有就是一些散布在网上的其他文章了, 只是在阅读时一定注意发表时间。2015年或以前发表的多是老版本Kafka的一些特性,要注意与新版本的适配性。&/p&&br&&p&希望对你有多帮助~~~&/p&
Kafka目前没有特别完备的中文资料,不过还是搜集了一些,希望对楼主有用:英文部分1. 官网:
自然是最重要的,其实把官网文档完全理解了已经算是掌握得非常好了2. JIRA列表: Kafka issue列表,使用关键字去搜索你碰到的实际…
&p&从阿里的常规java技术面试角度说一说,一般都是由浅到深去问,思路是先考察基础是否过关,再通过深度考察是否有技术热情和深度,同时可能会通过提出一些质疑和挑战来考察候选人是如何与不同意见进行沟通&/p&&p&&b&考察内容和方式&/b&&/p&&ul&&li&基础知识:考察基础的时候一般都不会太深入地去问,主要目的是考察知识面,如果发现候选人很多都不知道可能就不会继续进入下一步的考察。
&/li&&ul&&li&JDK 集合、BIO/NIO、annotation 等&/li&&li&虚拟机 内存模型、类加载原理&/li&&li&数据库 索引、事务、死锁 等&/li&&li&并发 并发优缺点、内存可见性(volatile)、锁、同步、线程池框架&/li&&li&网络 TCP/HTTP &/li&&li&常见设计模式&/li&&/ul&&li&深入考察:深入考察的时候不会像考察基础一样面面俱到,而是会在某个点上深入去聊,这个点的选择可能是让候选人自己选一个点,也可能是面试官根据简历内容去选,主要目的是考察候选人对某个技术点的深入掌握程度,技术是相通的,如果一个人能在某个技术点上达到很深入的程度,其他点上通常也不会有太大问题;相反如果某个人在他声称很了解的点上都支支吾吾、一知半解多半可以判断此人要么技术能力有限、要么遇到问题不愿深入考察、浅尝辄止。
&/li&&ul&&li&JDK ConcurrentHashMap如何提高并发度、NIO的原理(零拷贝、堆外内存),优缺点&/li&&li&虚拟机 包冲突,类冲突的形成原理及解决办法(可能会引申JDK9的模块化设计)、TCCL的存在价值&/li&&li&分布式 一致性哈希、RPC原理和设计(通信协议、序列化方式、超时机制等)、负载均衡、分布式缓存架构设计、分布式消息、分布式事务、paxos(这个可能只有在技术专业型很强的职位上会去问)&/li&&li&数据库 数据库性能优化(慢sql、索引优化、大事务、内核参数调优),也可能会把一些工作中碰到的诡异场景抛出来问&/li&&li&并发 非阻塞锁(CAS)、并发对编译器优化的影响、线程池调优、也肯会把工作中碰到的并发问题抛出来问&/li&&li&技术趋势、docker、微服务等新技术发展历史、带来的福利&/li&&/ul&&/ul&&p&&b&如何准备&/b&&/p&&p&首先要声明的是,最好的“准备”方式一定是平时多积累、遇到问题不要逃避或者讨巧、深入去思考并解决,在解决一个个问题的过程中积累解决问题的能力,形成自己的知识体系。所以这里说的如何准备不是说临时抱佛脚,而是如何能通过提前准备把自己平时的积累展现出来,不因为临场的表现影响面试官对你的判断。&/p&&ol&&li&针对以上列的知识点思考答案甚至扩展,如果能知道大部分,深入一部分就很好,这个过程主要是整理自己的知识体系&/li&&li&回忆整理简历和过往项目中的”难点“、”亮点“,因为这些是用来区分候选人很重要的点,合格的面试官一定会问类似于”你在项目中经历的最大的技术难点是什么?“,整理一下思路,不至于在面试时候因为时间久远而回忆不起来细节影响面试效果。&/li&&li&沟通过程中做到有理有据,不要过于自大,也无需刻意迎合面试官。沟通的本质是信息透明化,工作中也许我们无法做到完全客观公正,但是在技术问题上坚持自己的客观和原则是我认为技术人应该坚持的品格,我这里说的坚持不是一根筋的固执已见,而是根据共同认可的事实进行逻辑推断得出的观点。长远来看这种品格会带给你足够的技术影响力和回报。&/li&&/ol&
从阿里的常规java技术面试角度说一说,一般都是由浅到深去问,思路是先考察基础是否过关,再通过深度考察是否有技术热情和深度,同时可能会通过提出一些质疑和挑战来考察候选人是如何与不同意见进行沟通考察内容和方式基础知识:考察基础的时候一般都不会太…
&figure&&img src=&https://pic2.zhimg.com/v2-d06e3471dbf92a2ce38dba_b.jpg& data-rawwidth=&1343& data-rawheight=&871& class=&origin_image zh-lightbox-thumb& width=&1343& data-original=&https://pic2.zhimg.com/v2-d06e3471dbf92a2ce38dba_r.jpg&&&/figure&&h2&&b&项目背景&/b&
&/h2&&p&目前企业大多数的数据分析场景的解决方案底层都是围绕 Hadoop 大数据生态展开的,常见的如 HDFS + Hive + Spark + Presto + Kylin,在易果集团,我们初期也是采取这种思路,但是随着业务规模的快速增长和需求的不断变化,一些实时或者准实时的需求变得越来越多,这类业务除了有实时的 OLTP 需求,还伴随着一些有一定复杂度的 OLAP 的需求,单纯地使用 Hadoop 已经无法满足需求。&/p&&p&现有的准实时系统运行在 SQL Server 之上,通过开发人员编写和维护相应的存储过程来实现。由于数据量不大,SQL Server
能够满足需求,但是随着业务的发展,数据量随之增长,SQL Server
越来越不能满足需求,当数据量到达一定的阶段,性能便会出现拐点。这个时候,这套方案已完全无法支撑业务,不得不重新设计新的方案。&/p&&p&&br&&/p&&h2&选型评估&/h2&&p&&br&&/p&&p&在评估初期,Greenplum、Kudu、TiDB 都进入了我们的视野,对于新的实时系统,我们有主要考虑点:&/p&&ul&&li&首先,系统既要满足 OLAP 还要满足 OLTP 的基本需求;&/li&&li&其次,新系统要尽量降低业务的使用要求;&/li&&li&最后,新系统最好能够与现有的 Hadoop 体系相结合。&/li&&/ul&&p&Greenplum 是一套基于 PostgreSQL 分析为主的 MPP 引擎,大多用在并发度不高的离线分析场景,但在 OLTP 方面,我们的初步测试发现其对比 TiDB 的性能差很多。&/p&&p&再说说 Kudu。Kudu 是 CDH 2015年发布的一套介于 Hbase 和 HDFS 中间的一套存储系统,目前在国内主要是小米公司应用的较多,在测试中,我们发现其在 OLTP 表现大致与 TiDB 相当,但是一些中等数据量下,其分析性能相比 TiDB 有一定差距。另外我们的查询目前主要以 Presto 为主,Presto 对接 Kudu 和 PostgreSQL 都是需要考虑兼容性的问题,而 TiDB 兼容 MySQL 协议,在应用初期可以直接使用 Presto-MySQL 进行统一查询,下一步再考虑专门开发 Presto-TiDB。&/p&&p&另外,我们希望未来的实时系统和离线系统能够通用,一套代码在两个系统中都能够完全兼容,目前 Tispark 和 SparkSQL 已经很大程度上实现了这点,这支持我们在以后离线上的小时级任务可以直接切换到 TiDB上,在 TiDB 上实现实时业务的同时,如果有 T+1 的需求也能够直接指 HDFS 即可,不用二次开发,这是 Kudu 和 GP 暂时实现不了的。
&/p&&p&最后,TiSpark 是建立在 Spark 引擎之上,Spark 在机器学习领域里有诸如 Mllib 等诸多成熟的项目,对比 GP 和 Kudu,算法工程师们使用 TiSpark 去操作 TiDB 的门槛非常低,同时也会大大提升算法工程师们的效率。&/p&&p&经过综合的考虑,我们最终决定使用 TiDB 作为新的实时系统。同时,目前 TiDB 的社区活跃度非常好,这也是我们考虑的一个很重要的方面。&/p&&p&&br&&/p&&h2&TiDB 简介&/h2&&p&&br&&/p&&p&在这里介绍一下 TiDB 的相关特性:TiDB 是基于 Google Spanner/F1 论文启发开源的一套 NewSQL 数据库&i&(&a href=&https://link.zhihu.com/?target=https%3A//github.com/pingcap/tidb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/pingcap/tidb&/span&&span class=&invisible&&&/span&&/a&)&/i&,它具备如下 NewSQL 核心特性:&/p&&ul&&li&SQL支持 (TiDB 是 MySQL 兼容的)&/li&&li&水平线性弹性扩展&/li&&li&分布式事务&/li&&li&数据强一致性保证&/li&&li&故障自恢复的高可用&/li&&/ul&&p&同时,TiDB 还有一套丰富的生态工具,例如:快速部署的 TiDB-Ansible、无缝迁移 MySQL 的 Syncer、异构数据迁移工具 Wormhole、以及 TiDB-Binlog、Backup & Recovery 等。&/p&&p&&br&&/p&&h2&SQL Server 迁移到 TiDB&/h2&&p&&br&&/p&&p&由于我们公司的架构是 .NET + SQL Server 架构,所以我们无法像大多数公司一样去使用 MySQL Binlog 去做数据同步,当然也就无法使用 TiDB 官方提供的 Syncer 工具了。因此我们采用了 Flume + Kafka 的架构,我们自己开发了基于 Flume 的 SQL Server Source 去实时监控 SQL Server 数据变化,进行捕捉并写入 Kafka 中,同时,我们使用 Spark Streaming 去读取 Kafka 中的数据并写入 TiDB,同时我们将之前 SQL Server 的存储过程改造成定时调度的 MySQL 脚本。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6688eadad5fcd6ca7281e66bbb40c488_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1004& data-rawheight=&100& class=&origin_image zh-lightbox-thumb& width=&1004& data-original=&https://pic4.zhimg.com/v2-6688eadad5fcd6ca7281e66bbb40c488_r.jpg&&&/figure&&p&图:SQL Server 数据迁移到 TiDB&/p&&p&&br&&/p&&h2&TiDB 前期测试&/h2&&p&&br&&/p&&p&在测试初期,我们采用 TiDB 的版本为 RC4,在测试过程中曾经在同时对一张表进行读写时,出现 Region is stale 的错误,在 GitHub 上提出 Issue 后,TiDB 官方很快在 Pre-GA 版本中进行了修复。在测试环境,我们是手动通过二进制包的形式来部署 TiDB ,虽然比较简单,但是当 TiDB 发布 GA 版本之后,版本升级却是一个比较大的问题,由于早期没有使用 TiDB-ansible 安装,官方制作的升级脚本无法使用,而手动进行滚动升级等操作非常麻烦。由于当时是测试环境,在听取了 TiDB 官方的建议之后,我们重新利用 TiDB 官方提供的 TiDB-ansible 部署了 TiDB 的 GA 版本。只需要下载官方提供的包,修改相应的配置,就能完成安装和部署。官方也提供了升级脚本,能够在相邻的 TiDB 版本之前完成无缝滚动升级。同时 TiDB-ansible 默认会提供 Prometheus + Grafana 的监控安装,官方提供了非常丰富完善的 Grafana 模板,省去了运维很多监控配置的工作量,借着 TiDB 部署监控的契机,我们也完成了诸如 Redis,RabbitMQ,Elasticsearch 等很多应用程序的监控由 Zabbix 往 Prometheus 的迁移。这里需要注意的是,如果是用官方提供的部署工具部署 Prometheus 和 Grafana,在执行官方的停止脚本时切记跳过相应的组件,以免干扰其他程序的监控。&/p&&p&&br&&/p&&h2&TiDB 上线过程&/h2&&p&&br&&/p&&p&在10月中旬,随着新机器的采购到位,我们正式将 TiDB 部署到生产环境进行测试,整个架构为 3 台机器,3TiKV+3PD+2TiDB 的架构。在生产环境中的大数据量场景下,遇到了一些新的问题。&/p&&p&首先遇到的问题是 OLTP 方面,Spark Streaming 程序设置的 5 秒一个窗口,当 5 秒之内不能处理完当前批次的数据,就会产生延迟,同时 Streaming 在这个批次结束后会马上启动下一个批次,但是随着时间的积累,延迟的数据就会越来越多,最后甚至延迟了 8 小时之久;另一方面,由于我们使用的是机械硬盘,因此写入的效率十分不稳定,这也是造成写入延迟的一个很主要的因素。&/p&&p&出现问题之后我们立即与 TiDB 官方取得联系,确认 TiDB 整体架构主要基于 SSD 存储性能之上进行设计的。我们将 3 台机器的硬盘都换成了 SSD;与此同时,我们的工程师也开发了相应的同步程序来替代 Spark Streaming,随着硬件的更新以及程序的替换,写入方面逐渐稳定,程序运行的方式也和 Streaming 程序类似,多程序同时指定一个 Kafka 的 Group ID,同时连接不同机器的 TiDB 以达到写入效率最大化,同时也实现了 HA,保证了即使一个进程挂掉也不影响整体数据的写入。&/p&&p&在 OLTP 优化结束之后,随之而来的是分析方面的需求。由于我们对 TiDB 的定位是实时数据仓库,这样就会像 Hadoop 一样存在很多 ETL 的流程,在 Hadoop 的流程中,以 T+1 为主的任务占据了绝大多数,而这些任务普遍在凌晨启动执行,因此只能用于对时间延迟比较大的场景,对实时性要求比较高的场景则不适合,而 TiDB 则能很好的满足实时或者准实时的需求,在我们的业务场景下,很多任务以 5-10 分钟为执行周期,因此,必须确保任务的执行时长在间隔周期内完成。&/p&&p&我们取了两个在 SQL Server 上跑的比较慢的重要脚本做了迁移,相比于 SQL Server/MySQL 迁移至 Hadoop,从 SQL Server 迁移至 TiDB 的改动非常小,SQL Server 的 Merge 操作在 TiDB 里也通过 replace into 能够完成,其余一些 SQL Server 的特性,也能够通过 TiDB 的多行事务得以实现,在这一方面,TiDB 的 GA 版本已经做的非常完善,高度兼容 MySQL,因此迁移的成本非常小,从而使我们能够将大部分精力放在了调优方面。&/p&&p&在脚本迁移完毕之后,一些简单的脚本能够在秒级完成达到了我们的预期。但是一些复杂的脚本的表现在初期并没表现出优势,一些脚本与 SQL Server 持平甚至更慢,其中最大的脚本 SQL 代码量一共 1000 多行,涉及将近 20 张中间表。在之前的 SQL Server 上,随着数据量慢慢增大,每天的执行时长逐渐由 1-2 分钟增长到 5-6 分钟甚至更久,在双11当天凌晨,随着单量的涌入和其他任务的干扰延迟到 20 分钟甚至以上。在迁移至 TiDB 初期,在半天的数据量下 TiDB 的执行时长大致为 15 分钟左右,与 SQL Server 大致相同,但是并不能满足我们的预期。我们参考了 TiDB 的相关文档对查询参数做了一些调优,几个重要参数为:tidb_distsql_scan_concurrency,tidb_index_serial_scan_concurrency,tidb_index_join_batch_size(TiDB 提供了很好的并行计算能力)。经过验证,调整参数后,一些 SQL 能够缩短一倍的执行时间,但这里依旧不能完全满足我们的需求。&/p&&p&&br&&/p&&h2&引入 TiSpark&/h2&&p&&br&&/p&&p&随后,我们把目光转向了 TiDB 的一个子项目 TiSpark&i&(&a href=&https://link.zhihu.com/?target=https%3A//github.com/pingcap/tispark& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/pingcap/tisp&/span&&span class=&invisible&&ark&/span&&span class=&ellipsis&&&/span&&/a&)&/i&,用官网的介绍来讲 TiSpark 就是借助 Spark 平台,同时融合 TiKV 分布式集群的优势,和 TiDB 一起解决 HTAP 的需求。TiDB-ansible 中也带有 TiSpark 的配置,由于我们已经拥有了 Spark 集群,所以直接在现有的 Spark 集群中集成了 TiSpark。虽然该项目开发不久,但是经过测试,收益非常明显。&/p&&p&TiSpark 的配置非常简单,只需要把 TiSprak 相关的 jar 包放入 Spark 集群中的 jars 文件夹中就能引入 TiSpark,同时官方也提供了 3 个脚本,其中两个是启动和停止 TiSpark 的 Thrift Server,另一个是提供的 TiSpark 的 cli 客户端,这样我们就能像使用 Hive 一样使用 TiSpark 去做查询。&/p&&p&在初步使用之后,我们发现一些诸如 select count(*) from table 等 SQL 相比于 TiDB 有非常明显的提升,一些简单的 OLAP 的查询基本上都能够在 5 秒之内返回结果。经过初步测试,大致在 OLAP 的结论如下:一些简单的查询 SQL,在数据量百万级左右,TiDB 的执行效率可能会比 TiSpark 更好,在数据量增多之后 TiSpark 的执行效率会超过 TiDB,当然这也看 TiKV 的配置、表结构等。在 TiSpark 的使用过程中,我们发现 TiSpark 的查询结果在百万级时,执行时间都非常稳定,而 TiDB 的查询时间则会随着数据量的增长而增长(经过与 TiDB 官方沟通,这个情况主要是因为没有比较好的索引进行数据筛选)。针对我们的订单表做测试,在数据量为近百万级时,TiDB 的执行时间为 2 秒左右,TiSpark 的执行时间为 7 秒;当数据量增长为近千万级时,TiDB 的执行时间大致为 12 秒(不考虑缓存),TiSpark 依旧为 7 秒,非常稳定。&/p&&p&因此,我们决定将一些复杂的 ETL 脚本用 TiSpark 来实现,对上述的复杂脚本进行分析后,我们发现,大多数脚本中间表很多,在 SQL Server 中是通过 SQL Server 内存表实现,而迁移至 TiDB,每张中间表都要删除和插入落地,这些开销大大增加了执行时长(据官方答复 TiDB 很快也会支持 View、内存表)。在有了 TiSpark 之后,我们便利用 TiSpark 将中间表缓存为 Spark 的内存表,只需要将最后的数据落地回 TiDB,再执行 Merge 操作即可,这样省掉了很多中间数据的落地,大大节省了很多脚本执行的时间。&/p&&p&在查询速度解决之后,我们发现脚本中会有很多针对中间表 update 和 delete 的语句。目前 TiSpark 暂时不支持 update 和 delete 的操作(和 TiSpark 作者沟通,后续会考虑支持这两个操作),我们便尝试了两种方案,一部分执行类似于 Hive,采用 insert into 一张新表的方式来解决;另外一部分,我们引入了 Spark 中的 Snappydata 作为一部分内存表存储,在 Snappydata 中进行 update 和 delete,以达到想要的目的。因为都是 Spark 的项目,因此在融合两个项目的时候还是比较轻松的。&/p&&p&最后,关于实时的调度工具,目前我们是和离线调度一起进行调度,这也带来了一些问题,每次脚本都会初始化一些 Spark 参数等,这也相当耗时。在未来,我们打算采用 Spark Streaming 作为调度工具,每次执行完成之后记录时间戳,Spark Streaming 只需监控时间戳变化即可,能够避免多次初始化的耗时,通过 Spark 监控,我们也能够清楚的看到任务的延迟和一些状态,这一部分将在未来进行测试。&/p&&p&&br&&/p&&h2&TiDB 官方支持&/h2&&p&&br&&/p&&p&在迁移过程中,我们得到了 TiDB 官方很好的支持,其中也包括 TiSpark 相关的技术负责人,一些 TiSpark 的 Corner Case 及使用问题,我们都会在群里抛出,TiDB 的官方人员会非常及时的帮助我们解决问题,在官方支持下,我们迁移至 TiSpark 的过程很顺利,没有受到什么太大的技术阻碍。&/p&&p&&br&&/p&&h2&实时数仓 TiDB / TiSpark&/h2&&p&&br&&/p&&p&在迁移完成之后,其中一条复杂的 SQL,一共 Join 了 12 张表(最大表数量亿级,部分表百万级),在平时小批量的情况下,执行时间会在 5 分钟左右,我们也拿了双11全量的数据进行了测试,执行时间在 9 分钟以上,而采用了 TiSpark 的方式去执行,双11全量的数据也仅仅花了 1 分钟,性能提升了 9 倍。整个大脚本在 SQL Server 上运行双11的全量数据以前至少要消耗 30 分钟,利用 TiDB 去执行大致需要 20 分钟左右,利用 TiSpark 只需要 8 分钟左右,相对 SQL Server 性能提升 4 倍,也就是说,每年数据量最高峰的处理能力达到了分钟级,很好的满足了我们的需求。&/p&&p&最后,不管是用 TiDB 还是用 TiSpark 都会有一部分中间表以及与原表进行 Merge 的操作,这里由于 TiDB 对事务进行的限制,我们也采用以万条为单批次进行批量的插入和 Merge,既避免了超过事务的报错又符合 TiDB 的设计理念,能够达到最佳实践。&/p&&p&有了 TiSpark 这个项目,TiDB 与 Hadoop 的生态体系得到进一步的融合,在没有 TiSpark 之前,我们的系统设计如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bae2d123baabcd877cf9becf4b9619ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1004& data-rawheight=&552& class=&origin_image zh-lightbox-thumb& width=&1004& data-original=&https://pic2.zhimg.com/v2-bae2d123baabcd877cf9becf4b9619ed_r.jpg&&&/figure&&p&图:多套数仓并存&/p&&p&可以发现,实时数仓与 T+1 异步数仓是两个相对独立的系统,并没有任何交集,我们需要进行数据实时的同步,同时也会在夜晚做一次异步同步,不管是 Datax 还是 Sqoop 读取关系型数据库的效率都远远达不到 TiSpark 的速度,而在有了 TiSpark 之后,我们可以对 T+1 异步数仓进行整合,于是我们的架构进化为如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ac192de4b0dc0b15d4af370b914c22e0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1004& data-rawheight=&554& class=&origin_image zh-lightbox-thumb& width=&1004& data-original=&https://pic1.zhimg.com/v2-ac192de4b0dc0b15d4af370b914c22e0_r.jpg&&&/figure&&p&图:TiDB / TiSpark 实时数仓平台&/p&&p&这样就能够利用 TiSpark 将 TiDB 和 Hadoop 很好的串联起来,互为补充,TiDB 的功能也由单纯的实时数仓变成能够提供如下几个功能混合数据库:&/p&&p&1.
实时数仓,上游 OLTP 的数据通过 TiDB 实时写入,下游 OLAP 的业务通过 TiDB / TiSpark 实时分析。&/p&&p&2.
T+1 的抽取能够从 TiDB 中利用 TiSpark 进行抽取。&/p&&ul&&li&TiSpark 速度远远超过 Datax 和 Sqoop 读取关系型数据库的速度;&/li&&li&抽取工具也不用维护多个系统库,只需要维护一个 TiDB 即可,大大方便了业务的统一使用,还节省了多次维护成本。&/li&&li&TiDB 天然分布式的设计也保证了系统的稳定、高可用。&/li&&/ul&&p&3.
TiDB 分布式特性可以很好的平衡热点数据,可以用它作为业务库热点数据的一个备份库,或者直接迁入 TiDB 。&/p&&p&上面这三点也是我们今后去努力的方向,由此可见,TiSpark 不仅对于 ETL 脚本起到了很重要的作用,在我们今后的架构中也起到了举足轻重的作用,为我们创建一个实时的统一的混合数据库提供了可能。&/p&&p&与此同时,我们也得到 TiDB 官方人员的确认,TiDB 将于近期支持视图、分区表,并会持续增强 SQL 优化器,同时也会提供一款名为 TiDB Wormhole 的异构平台数据实时迁移工具来便捷的支持用户的多元化迁移需求。我们也计划将更多的产品线逐步迁入 TiDB。&/p&&p&&br&&/p&&h2&总结&/h2&&p&&br&&/p&&p&同时解决 OLAP 和 OLTP 是一件相当困难的事情,TiDB 和 TiSpark 虽然推出不久,但是已经满足很多应用场景,同时在易用性和技术支持上也非常值得称赞,相信 TiDB 一定能够在越来越多的企业中得到广泛应用。&/p&&p&&br&&/p&&p&&b&? 作者简介:罗瑞星,曾就职于前程无忧,参加过 Elasticsearch 官方文档中文翻译工作,现就职于易果集团,担任资深大数据工程师,负责易果集团数据分析架构设计等工作。&/b&&/p&
项目背景 目前企业大多数的数据分析场景的解决方案底层都是围绕 Hadoop 大数据生态展开的,常见的如 HDFS + Hive + Spark + Presto + Kylin,在易果集团,我们初期也是采取这种思路,但是随着业务规模的快速增长和需求的不断变化,一些实时或者准实时的需求…
&figure&&img src=&https://pic4.zhimg.com/50/v2-7fea49e19b5c5afe545e174_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/50/v2-7fea49e19b5c5afe545e174_r.jpg&&&/figure&&p&
zookeeper不是为高可用性设计的&/p&&p&
由于要跨机房容灾,很多系统实际上是需要跨机房部署的。出于性价比的考虑我们通常会让多个机房同时工作,而不会搭建N倍的冗余。也就是说单个机房肯定撑不住全流量(你能设想谷歌在全球只剩下一个机房在干活吗)。由于zookeeper集群只能有一个master,因此一旦机房之间连接出现故障,zookeeper master就只能照顾一个机房,其他机房运行的业务模块由于没有master都只能停掉。于是所有流量集中到有master的那个机房,于是系统crash。&/p&&p&
即使是在同一个机房里面,由于网段的不同,在调整机房交换机的时候偶尔也会发生网段隔离的情况。实际上机房每个月基本上都会发生短暂的网络隔离之类的子网段调整。在那个时刻zookeeper将处于不可用状态。如果整个业务系统基于zookeeper(比如要求每个业务请求都先去zookeeper获取业务系统的master地址),则系统的可用性将非常脆弱。&/p&&p&
由于zookeeper对于网络隔离的极度敏感,导致zookeeper对于网络的任何风吹草动都会做出激烈反应。这使得zookeeper的‘不可用’时间比较多,我们不能让zookeeper的‘不可用’,变成系统的不可用。&/p&&p&
zookeeper的选举过程速度很慢&/p&&p&
这是一个很难从理论分析上看到的弱点,但是你一旦遇到就会痛不欲生。前面我们已经说过,网络实际上常常是会出现隔离等不完整状态的,而zookeeper对那种情况非常敏感。一旦出现网络隔离,zookeeper就要发起选举流程。zookeeper的选举流程通常耗时30到120秒,期间zookeeper由于没有master,都是不可用的。对于网络里面偶尔出现的,比如半秒一秒的网络隔离,zookeeper会由于选举过程,而把不可用时间放大几十倍。&/p&&p&
zookeeper的性能是有限的&/p&&p&
典型的zookeeper的tps大概是一万多,无法覆盖系统内部每天动辄几十亿次的调用。因此每次请求都去zookeeper获取业务系统master信息是不可能的。因此zookeeper的client必须自己缓存业务系统的master地址。因此zookeeper提供的‘强一致性’实际上是不可用的。如果我们需要强一致性,还需要其他机制来进行保障:比如用自动化脚本把业务系统的old master给kill掉,但是那会有很多陷阱(这里先不展开这个议题,读者可以自己想想会有哪些陷阱)。&/p&&p&
zookeeper无法进行有效的权限控制&/p&&p&
zookeeper的权限控制非常薄弱&/p&&p&
在大型的复杂系统里面,使用zookeeper必须自己再额外的开发一套权限控制系统,通过那套权限控制系统再访问zookeeper额外的权限控制系统不但增加了系统复杂性和维护成本,而且降低了系统的总体性能即使有了zookeeper也很难避免业务系统的数据不一致前面已经讨论过了,由于zookeeper的性能限制,我们无法让每次系统内部调用都走zookeeper,因此总有某些时刻,业务系统会存在两个master(业务系统client那边缓存的业务系统master信息是定时从zookeeper更新的,因此会有更新不同步的问题)。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-1efbf700643cde3faf66_b.jpg& data-rawwidth=&591& data-rawheight=&341& class=&origin_image zh-lightbox-thumb& width=&591& data-original=&https://pic1.zhimg.com/50/v2-1efbf700643cde3faf66_r.jpg&&&/figure&&p&&br&&/p&&p&
如果要在业务系统client的master信息不一直的情况下,仍要保持系统的数据一致性,唯一的方法是“先kill掉老master,再在zookeeper上更新master信息”。但是在是否要kill current master这个问题上,程序是无法完全自动决定的(因为网络隔离的时候zookeeper已经不可用了,自动脚本没有全局信息,不管怎么做都可能是错的,什么都不做也可能是错的。当网络故障的时候,只有运维人员才有全局信息,程序是无法接电话得知其他机房的情况的)。因此系统无法自动的保障数据一致性,必须要人工介入。而人工介入的典型时间是半个小时以上,我们不能让系统这么长时间不可用。因此我们必须在某个方向上进行妥协,最常见的妥协方式是放弃‘强一致性’,而接受‘最终一致性’。如果我们需要人工介入才能保证‘可靠的强一致性’,那么zookeeper的价值就大打折扣。&/p&&p&&/p&&p&&/p&&p&&/p&
zookeeper不是为高可用性设计的 由于要跨机房容灾,很多系统实际上是需要跨机房部署的。出于性价比的考虑我们通常会让多个机房同时工作,而不会搭建N倍的冗余。也就是说单个机房肯定撑不住全流量(你能设想谷歌在全球只剩下一个机房在干活吗)。由于zookeep…
本人一直从事服务器端开发工作,基础语言是Java。&br&&br&服务器端开发在我的理解里是一个广义的定义,无论是Web开发,中间件开发,数据处理,数据分析,架构,并发,存储,分布式,负载,缓存等等内容都属于广义的服务器开发。&br&&br&题主应该兴奋起来,因为你还有很多事情可以做,比如下面我列出来的:&br&&figure&&img src=&https://pic1.zhimg.com/50/5faf71ec0acfcd4f43c1_b.jpg& data-rawwidth=&1845& data-rawheight=&916& class=&origin_image zh-lightbox-thumb& width=&1845& data-original=&https://pic1.zhimg.com/50/5faf71ec0acfcd4f43c1_r.jpg&&&/figure&
本人一直从事服务器端开发工作,基础语言是Java。 服务器端开发在我的理解里是一个广义的定义,无论是Web开发,中间件开发,数据处理,数据分析,架构,并发,存储,分布式,负载,缓存等等内容都属于广义的服务器开发。 题主应该兴奋起来,因为你还有很多…
&b&Hadoop&/b&&br&首先看一下Hadoop解决了什么问题,Hadoop就是解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)的可靠存储和处理。&br&&ul&&li&HDFS,在由普通PC组成的集群上提供高可靠的文件存储,通过将块保存多个副本的办法解决服务器或硬盘坏掉的问题。&/li&&li&MapReduce,通过简单的Mapper和Reducer的抽象提供一个编程模型,可以在一个由几十台上百台的PC组成的不可靠集群上并发地,分布式地处理大量的数据集,而把并发、分布式(如机器间通信)和故障恢复等计算细节隐藏起来。而Mapper和Reducer的抽象,又是各种各样的复杂数据处理都可以分解为的基本元素。这样,复杂的数据处理可以分解为由多个Job(包含一个Mapper和一个Reducer)组成的有向无环图(DAG),然后每个Mapper和Reducer放到Hadoop集群上执行,就可以得出结果。&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/50/adb253dbce2cbc_b.jpg& data-rawwidth=&627& data-rawheight=&195& class=&origin_image zh-lightbox-thumb& width=&627& data-original=&https://pic1.zhimg.com/50/adb253dbce2cbc_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=http%3A//www.slideshare.net/davidengfer/intro-to-the-hadoop-stack-javamug& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&slideshare.net/davideng&/span&&span class=&invisible&&fer/intro-to-the-hadoop-stack-javamug&/span&&span class=&ellipsis&&&/span&&/a&)&br&&br&用MapReduce统计一个文本文件中单词出现的频率的示例WordCount请参见:&a href=&//link.zhihu.com/?target=http%3A//wiki.apache.org/hadoop/WordCount& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WordCount - Hadoop Wiki&/a&,如果对MapReduce不恨熟悉,通过该示例对MapReduce进行一些了解对理解下文有帮助。&br&&br&在MapReduce中,Shuffle是一个非常重要的过程,正是有了看不见的Shuffle过程,才可以使在MapReduce之上写数据处理的开发者完全感知不到分布式和并发的存在。&br&&figure&&img src=&https://pic4.zhimg.com/50/57b942a32d5b035a7f1d_b.jpg& data-rawwidth=&774& data-rawheight=&367& class=&origin_image zh-lightbox-thumb& width=&774& data-original=&https://pic4.zhimg.com/50/57b942a32d5b035a7f1d_r.jpg&&&/figure&(图片来源: Hadoop Definitive Guide By Tom White)&br&广义的Shuffle是指图中在Map和Reuce之间的一系列过程。&br&&br&&b&Hadoop的局限和不足&/b&&br&但是,MapRecue存在以下局限,使用起来比较困难。&br&&ul&&li&抽象层次低,需要手工编写代码来完成,使用上难以上手。&/li&&li&只提供两个操作,Map和Reduce,表达力欠缺。&/li&&li&一个Job只有Map和Reduce两个阶段(Phase),复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的。&/li&&li&处理逻辑隐藏在代码细节中,没有整体逻辑&/li&&li&中间结果也放在HDFS文件系统中&/li&&li&ReduceTask需要等待所有MapTask都完成后才可以开始&/li&&li&时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够&/li&&li&对于迭代式数据处理性能比较差&/li&&/ul&&br&比如说,用MapReduce实现两个表的Join都是一个很有技巧性的过程,如下图所示:&br&&figure&&img src=&https://pic2.zhimg.com/50/886cdc16b356e016d3ce_b.jpg& data-rawwidth=&713& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&713& data-original=&https://pic2.zhimg.com/50/886cdc16b356e016d3ce_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=http%3A//blog.matthewrathbone.com//real-world-hadoop-implementing-a-left-outer-join-in-hadoop-map-reduce.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Real World Hadoop&/a&)&br&&br&因此,在Hadoop推出之后,出现了很多相关的技术对其中的局限进行改进,如Pig,Cascading,JAQL,OOzie,Tez,Spark等。&br&&br&&b&Apache Pig&/b&&br&Apache Pig也是Hadoop框架中的一部分,Pig提供类SQL语言(Pig Latin)通过MapReduce来处理大规模半结构化数据。而Pig Latin是更高级的过程语言,通过将MapReduce中的设计模式抽象为操作,如Filter,GroupBy,Join,OrderBy,由这些操作组成&b&有向无环图(DAG)&/b&。例如如下程序:&br&&div class=&highlight&&&pre&&code class=&language-bash&&&span class=&nv&&visits&/span&
&span class=&o&&=&/span& load ‘/data/visits’ as &span class=&o&&(&/span&user, url, &span class=&nb&&time&/span&&span class=&o&&)&/span&&span class=&p&&;&/span&
&span class=&nv&&gVisits&/span&
&span class=&o&&=&/span& group visits by url&span class=&p&&;&/span&
&span class=&nv&&visitCounts&/span&
&span class=&o&&=&/span& foreach gVisits generate url, count&span class=&o&&(&/span&visits&span class=&o&&)&/span&&span class=&p&&;&/span&
&span class=&nv&&urlInfo&/span&
&span class=&o&&=&/span& load ‘/data/urlInfo’ as &span class=&o&&(&/span&url, category, pRank&span class=&o&&)&/span&&span class=&p&&;&/span&
&span class=&nv&&visitCounts&/span&
&span class=&o&&=&/span& join visitCounts by url, urlInfo by url&span class=&p&&;&/span&
&span class=&nv&&gCategories&/span& &span class=&o&&=&/span& group visitCounts by category&span class=&p&&;&/span&
&span class=&nv&&topUrls&/span& &span class=&o&&=&/span& foreach gCategories generate top&span class=&o&&(&/span&visitCounts,10&span class=&o&&)&/span&&span class=&p&&;&/span&
store topUrls into ‘/data/topUrls’&span class=&p&&;&/span&
&/code&&/pre&&/div&描述了数据处理的整个过程。&br&&br&而Pig Latin又是通过编译为MapReduce,在Hadoop集群上执行的。上述程序被编译成MapReduce时,会产生如下图所示的Map和Reduce:&br&&figure&&img src=&https://pic1.zhimg.com/50/27f938d43e54be4eba91c7899daa3bca_b.jpg& data-rawwidth=&692& data-rawheight=&455& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic1.zhimg.com/50/27f938d43e54be4eba91c7899daa3bca_r.jpg&&&/figure&&br&(图片来源:&a href=&//link.zhihu.com/?target=http%3A//cs.nyu.edu/courses/Fall12/CSCI-GA./sigmod08-pig-latin.ppt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cs.nyu.edu/courses/Fall&/span&&span class=&invisible&&12/CSCI-GA./sigmod08-pig-latin.ppt&/span&&span class=&ellipsis&&&/span&&/a&)&br&&br&Apache Pig解决了MapReduce存在的大量手写代码,语义隐藏,提供操作种类少的问题。类似的项目还有Cascading,JAQL等。&br&&br&&b&Apache Tez&/b&&br&Apache Tez,Tez是HortonWorks的Stinger Initiative的的一部分。作为执行引擎,Tez也提供了&b&有向无环图(DAG)&/b&,DAG由顶点(Vertex)和边(Edge)组成,Edge是对数据的移动的抽象,提供了One-To-One,BroadCast,和Scatter-Gather三种类型,只有Scatter-Gather才需要进行Shuffle。&br&&br&以如下SQL为例:&br&&div class=&highlight&&&pre&&code class=&language-sql&&&span class=&k&&SELECT&/span& &span class=&n&&a&/span&&span class=&p&&.&/span&&span class=&k&&state&/span&&span class=&p&&,&/span& &span class=&k&&COUNT&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&p&&),&/span&
&span class=&n&&AVERAGE&/span&&span class=&p&&(&/span&&span class=&k&&c&/span&&span class=&p&&.&/span&&span class=&n&&price&/span&&span class=&p&&)&/span&
&span class=&k&&FROM&/span& &span class=&n&&a&/span&
&span class=&k&&JOIN&/span& &span class=&n&&b&/span& &span class=&k&&ON&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&.&/span&&span class=&n&&id&/span& &span class=&o&&=&/span& &span class=&n&&b&/span&&span class=&p&&.&/span&&span class=&n&&id&/span&&span class=&p&&)&/span&
&span class=&k&&JOIN&/span& &span class=&k&&c&/span& &span class=&k&&ON&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&.&/span&&span class=&n&&itemId&/span& &span class=&o&&=&/span& &span class=&k&&c&/span&&span class=&p&&.&/span&&span class=&n&&itemId&/span&&span class=&p&&)&/span&
&span class=&k&&GROUP&/span& &span class=&k&&BY&/span& &span class=&n&&a&/span&&span class=&p&&.&/span&&span class=&k&&state&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/50/666f395a113ccc523a32_b.jpg& data-rawwidth=&864& data-rawheight=&431& class=&origin_image zh-lightbox-thumb& width=&864& data-original=&https://pic2.zhimg.com/50/666f395a113ccc523a32_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=http%3A//www.slideshare.net/hortonworks/apache-tez-accelerating-hadoop-query-processing& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&slideshare.net/hortonwo&/span&&span class=&invisible&&rks/apache-tez-accelerating-hadoop-query-processing&/span&&span class=&ellipsis&&&/span&&/a&)&br&途中蓝色方块表示Map,绿色方块表示Reduce,云状表示写屏障(write barrier,一种内核机制,可以理解为持久的写),Tez的优化主要体现在:&br&&ol&&li&去除了连续两个作业之间的写屏障&/li&&li&去除了每个工作流中多余的Map阶段(Stage)&/li&&/ol&通过提供DAG语义和操作,提供了整体的逻辑,通过减少不必要的操作,Tez提升了数据处理的执行性能。&br&&br&&b&Apache Spark&/b&&br&Apache Spark是一个新兴的大数据处理的引擎,主要特点是提供了一个集群的分布式内存抽象,以支持需要工作集的应用。&br&&br&这个抽象就是RDD(Resilient Distributed Dataset),RDD就是一个不可变的带分区的记录集合,RDD也是Spark中的编程模型。Spark提供了RDD上的两类操作,转换和动作。转换是用来定义一个新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, cogroup, ReduceByKey, cros, sortByKey, mapValues等,动作是返回一个结果,包括collect, reduce, count, save, lookupKey。&br&&br&Spark的API非常简单易用,Spark的WordCount的示例如下所示:&br&&div class=&highlight&&&pre&&code class=&language-scala&&&span class=&k&&val&/span& &span class=&n&&spark&/span& &span class=&k&&=&/span& &span class=&k&&new&/span& &span class=&nc&&SparkContext&/span&&span class=&o&&(&/span&&span class=&n&&master&/span&&span class=&o&&,&/span& &span class=&n&&appName&/span&&span class=&o&&,&/span& &span class=&o&&[&/span&&span class=&kt&&sparkHome&/span&&span class=&o&&],&/span& &span class=&o&&[&/span&&span class=&kt&&jars&/span&&span class=&o&&])&/span&
&span class=&k&&val&/span& &span class=&n&&file&/span& &span class=&k&&=&/span& &span class=&n&&spark&/span&&span class=&o&&.&/span&&span class=&n&&textFile&/span&&span class=&o&&(&/span&&span class=&s&&&hdfs://...&&/span&&span class=&o&&)&/span&
&span class=&k&&val&/span& &span class=&n&&counts&/span& &span class=&k&&=&/span& &span class=&n&&file&/span&&span class=&o&&.&/span&&span class=&n&&flatMap&/span&&span class=&o&&(&/span&&span class=&n&&line&/span& &span class=&k&&=&&/span& &span class=&n&&line&/span&&span class=&o&&.&/span&&span class=&n&&split&/span&&span class=&o&&(&/span&&span class=&s&&& &&/span&&span class=&o&&))&/span&
&span class=&o&&.&/span&&span class=&n&&map&/span&&span class=&o&&(&/span&&span class=&n&&word&/span& &span class=&k&&=&&/span& &span class=&o&&(&/span&&span class=&n&&word&/span&&span class=&o&&,&/span& &span class=&mi&&1&/span&&span class=&o&&))&/span&
&span class=&o&&.&/span&&span class=&n&&reduceByKey&/span&&span class=&o&&(&/span&&span class=&k&&_&/span& &span class=&o&&+&/span& &span class=&k&&_&/span&&span class=&o&&)&/span&
&span class=&n&&counts&/span&&span class=&o&&.&/span&&span class=&n&&saveAsTextFile&/span&&span class=&o&&(&/span&&span class=&s&&&hdfs://...&&/span&&span class=&o&&)&/span&
&/code&&/pre&&/div&其中的file是根据HDFS上的文件创建的RDD,后面的flatMap,map,reduceByKe都创建出一个新的RDD,一个简短的程序就能够执行很多个转换和动作。&br&&br&在Spark中,所有RDD的转换都是是&b&惰性求值&/b&的。RDD的转换操作会生成新的RDD,新的RDD的数据依赖于原来的RDD的数据,每个RDD又包含多个分区。那么一段程序实际上就构造了一个由相互依赖的多个RDD组成的&b&有向无环图(DAG)。&/b&并通过在RDD上执行动作将这个有向无环图作为一个Job提交给Spark执行。&br&&br&例如,上面的WordCount程序就会生成如下的DAG&br&&div class=&highlight&&&pre&&code class=&language-scala&&&span class=&n&&scala&/span&&span class=&o&&&&/span& &span class=&n&&counts&/span&&span class=&o&&.&/span&&span class=&n&&toDebugString&/span&
&span class=&n&&res0&/span&&span class=&k&&:&/span& &span class=&kt&&String&/span& &span class=&o&&=&/span&
&span class=&nc&&MapPartitionsRDD&/span&&span class=&o&&[&/span&&span class=&err&&7&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&reduceByKey&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&14&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&ShuffledRDD&/span&&span class=&o&&[&/span&&span class=&err&&6&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&reduceByKey&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&14&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&MapPartitionsRDD&/span&&span class=&o&&[&/span&&span class=&err&&5&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&reduceByKey&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&14&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&MappedRDD&/span&&span class=&o&&[&/span&&span class=&err&&4&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&map&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&14&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&FlatMappedRDD&/span&&span class=&o&&[&/span&&span class=&err&&3&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&flatMap&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&14&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&MappedRDD&/span&&span class=&o&&[&/span&&span class=&err&&1&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&textFile&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&12&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&span class=&nc&&HadoopRDD&/span&&span class=&o&&[&/span&&span class=&err&&0&/span&&span class=&o&&]&/span& &span class=&n&&at&/span& &span class=&n&&textFile&/span& &span class=&n&&at&/span& &span class=&o&&&&/span&&span class=&n&&console&/span&&span class=&k&&&:&/span&&span class=&mi&&12&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&n&&partitions&/span&&span class=&o&&)&/span&
&/code&&/pre&&/div&&br&&br&Spark对于有向无环图Job进行调度,确定&b&阶段(Stage)&/b&,&b&分区(Partition)&/b&,&b&流水线(Pipeline)&/b&,&b&任务(Task)&/b&和&b&缓存(Cache)&/b&,进行优化,并在Spark集群上运行Job。RDD之间的依赖分为&b&宽依赖&/b&(依赖多个分区)和&b&窄依赖&/b&(只依赖一个分区),在确定阶段时,需要根据宽依赖划分阶段。根据分区划分任务。&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/d9a22d31fe35d66f8d02_b.jpg& data-rawwidth=&602& data-rawheight=&439& class=&origin_image zh-lightbox-thumb& width=&602& data-original=&https://pic2.zhimg.com/50/d9a22d31fe35d66f8d02_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=https%3A//databricks-training.s3.amazonaws.com/slides/advanced-spark-training.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&databricks-training.s3.amazonaws.com&/span&&span class=&invisible&&/slides/advanced-spark-training.pdf&/span&&span class=&ellipsis&&&/span&&/a&)&br&&br&Spark支持故障恢复的方式也不同,提供两种方式,&b&Linage&/b&,通过数据的血缘关系,再执行一遍前面的处理,&b&Checkpoint&/b&,将数据集存储到持久存储中。&br&&br&Spark为&b&迭代式数据处理&/b&提供更好的支持。每次迭代的数据可以保存在内存中,而不是写入文件。&br&&br&Spark的性能相比Hadoop有很大提升,2014年10月,Spark完成了一个Daytona Gray类别的Sort Benchmark测试,排序完全是在磁盘上进行的,与Hadoop之前的测试的对比结果如表格所示:&br&&figure&&img src=&https://pic4.zhimg.com/50/029ab6e670fa8fab5fb3a59_b.jpg& data-rawwidth=&696& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&696& data-original=&https://pic4.zhimg.com/50/029ab6e670fa8fab5fb3a59_r.jpg&&&/figure&(表格来源: &a href=&//link.zhihu.com/?target=http%3A//databricks.com/blog//spark-officially-sets-a-new-record-in-large-scale-sorting.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spark officially sets a new record in large-scale sorting&/a&)&br&从表格中可以看出排序100TB的数据(1万亿条数据),&b&Spark只用了Hadoop所用1/10的计算资源,耗时只有Hadoop的1/3&/b&。&br&&br&&br&Spark的优势不仅体现在性能提升上的,Spark框架为批处理(Spark Core),交互式(Spark SQL),流式(Spark Streaming),机器学习(MLlib),图计算(GraphX)提供一个统一的数据处理平台,这相对于使用Hadoop有很大优势。&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/c9c37ed908b6d7c6a1d98787efd649f7_b.jpg& data-rawwidth=&916& data-rawheight=&385& class=&origin_image zh-lightbox-thumb& width=&916& data-original=&https://pic3.zhimg.com/50/c9c37ed908b6d7c6a1d98787efd649f7_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=https%3A//gigaom.com//4-reasons-why-spark-could-jolt-hadoop-into-hyperdrive/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&gigaom.com//4&/span&&span class=&invisible&&-reasons-why-spark-could-jolt-hadoop-into-hyperdrive/&/span&&span class=&ellipsis&&&/span&&/a&)&br&&br&按照Databricks的连城的说法是&b&One Stack To Rule Them All&/b&&br&&br&特别是在有些情况下,你需要进行一些ETL工作,然后训练一个机器学习的模型,最后进行一些查询,如果是使用Spark,你可以在一段程序中将这三部分的逻辑完成形成一个大的&b&有向无环图(DAG)&/b&,而且Spark会对大的有向无环图进行整体优化。&br&&br&例如下面的程序:&br&&div class=&highlight&&&pre&&code class=&language-text&&val points = sqlContext.sql(
“SELECT latitude, longitude FROM historic_tweets”)
val model = KMeans.train(points, 10)
sc.twitterStream(...)
.map(t =& (model.closestCenter(t.location), 1))
.reduceByWindow(“5s”, _ + _)
&/code&&/pre&&/div&(示例来源:&a href=&//link.zhihu.com/?target=http%3A//www.slideshare.net/Hadoop_Summit/building-a-unified-data-pipeline-in-apache-spark& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&slideshare.net/Hadoop_S&/span&&span class=&invisible&&ummit/building-a-unified-data-pipeline-in-apache-spark&/span&&span class=&ellipsis&&&/span&&/a&)&br&这段程序的第一行是用Spark SQL 查寻出了一些点,第二行是用MLlib中的K-means算法使用这些点训练了一个模型,第三行是用Spark Streaming处理流中的消息,使用了训练好的模型。&br&&br&&b&Lambda Architecture&/b&&br&Lambda Architecture是一个大数据处理平台的参考模型,如下图所示:&br&&figure&&img src=&https://pic1.zhimg.com/50/2a4e99ec84da2c367f883af2313c16dd_b.jpg& data-rawwidth=&800& data-rawheight=&453& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/50/2a4e99ec84da2c367f883af2313c16dd_r.jpg&&&/figure&(图片来源: &a href=&//link.zhihu.com/?target=https%3A//www.mapr.com/developercentral/lambda-architecture& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Lambda Architecture&/a&)&br&其中包含3层,Batch Layer,Speed Layer和Serving Layer,由于Batch Layer和Speed Layer的数据处理逻辑是一致的,如果用Hadoop作为Batch Layer,而用Storm作为Speed Layer,你需要维护两份使用不同技术的代码。&br&&br&而Spark可以作为Lambda Architecture一体化的解决方案,大致如下:&br&&ul&&li&Batch Layer,HDFS+Spark Core,将实时的增量数据追加到HDFS中,使用Spark Core批量处理全量数据,生成全量数据的视图。,&/li&&li&Speed Layer,Spark Streaming来处理实时的增量数据,以较低的时延生成实时数据的视图。&/li&&li&Serving Layer,HDFS+Spark SQL(也许还有BlinkDB),存储Batch Layer和Speed Layer输出的视图,提供低时延的即席查询功能,将批量数据的视图与实时数据的视图合并。&/li&&/ul&&b&总结&/b&&br&如果说,MapReduce是公认的分布式数据处理的低层次抽象,类似逻辑门电路中的与门,或门和非门,那么Spark的RDD就是分布式大数据处理的高层次抽象,类似逻辑电路中的编码器或译码器等。&br&&br&RDD就是一个分布式的数据集合(Collection),对这个集合的任何操作都可以像函数式编程中操作内存中的集合一样直观、简便,但集合操作的实现确是在后台分解成一系列Task发送到几十台上百台服务器组成的集群上完成的。最近新推出的大数据处理框架Apache Flink也使用数据集(Data Set)和其上的操作作为编程模型的。&br&&br&由RDD组成的有向无环图(DAG)的执行是调度程序将其生成物理计划并进行优化,然后在Spark集群上执行的。Spark还提供了一个类似于MapReduce的执行引擎,该引擎更多地使用内存,而不是磁盘,得到了更好的执行性能。&br&&br&那么Spark解决了Hadoop的哪些问题呢?&br&&ul&&li&抽象层次低,需要手工编写代码来完成,使用上难以上手。&/li&&ul&&li&=&基于RDD的抽象,实数据处理逻辑的代码非常简短。。&/li&&/ul&&li&只提供两个操作,Map和Reduce,表达力欠缺。&/li&&ul&&li&=&提供很多转换和动作,很多基本操作如Join,GroupBy已经在RDD转换和动作中实现。&/li&&/ul&&li&一个Job只有Map和Reduce两个阶段(Phase),复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的。&/li&&ul&&li&=&一个Job可以包含RDD的多个转换操作,在调度时可以生成多个阶段(Stage),而且如果多个map操作的RDD的分区不变,是可以放在同一个Task中进行。&/li&&/ul&&li&处理逻辑隐藏在代码细节中,没有整体逻辑&/li&&ul&&li&=&在Scala中,通过匿名函数和高阶函数,RDD的转换支持流式API,可以提供处理逻辑的整体视图。代码不包含具体操作的实现细节,逻辑更清晰。&/li&&/ul&&li&中间结果也放在HDFS文件系统中&/li&&ul&&li&=&中间结果放在内存中,内存放不下了会写入本地磁盘,而不是HDFS。&/li&&/ul&&li&ReduceTask需要等待所有MapTask都完成后才可以开始&/li&&ul&&li&=& 分区相同的转换构成流水线放在一个Task中运行,分区不同的转换需要Shuffle,被划分到不同的Stage中,需要等待前面的Stage完成后才可以开始。&/li&&/ul&&li&时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够&/li&&ul&&li&=&通过将流拆成小的batch提供Discretized Stream处理流数据。&/li&&/ul&&li&对于迭代式数据处理性能比较差&/li&&ul&&li&=&通过在内存中缓存数据,提高迭代式计算的性能。&/li&&/ul&&/ul&&br&因此,Hadoop MapReduce会被新一代的大数据处理平台替代是技术发展的趋势,而在新一代的大数据处理平台中,Spark目前得到了最广泛的认可和支持,从参加Spark Summit 2014的厂商的各种基于Spark平台进行的开发就可以看出一二。
Hadoop 首先看一下Hadoop解决了什么问题,Hadoop就是解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)的可靠存储和处理。 HDFS,在由普通PC组成的集群上提供高可靠的文件存储,通过将块保存多个副本的办法解决服务器或硬…
谢谢 &a data-hash=&683e9ecdddef011f2884& href=&//www.zhihu.com/people/683e9ecdddef011f2884& class=&member_mention& data-editable=&true& data-title=&@上班狗& data-hovercard=&p$b$683e9ecdddef011f2884&&@上班狗&/a&&a data-hash=&5c6dbfc3dbbf3& href=&//www.zhihu.com/people/5c6dbfc3dbbf3& class=&member_mention& data-editable=&true& data-title=&@Ryan Fan& data-hovercard=&p$b$5c6dbfc3dbbf3&&@Ryan Fan&/a& 邀请&br&&br&最近忙成狗,就不详述实现过程了,仅仅对比一下。&br&&br&1. 从逻辑角度来讲,Shuffle 过程就是一个 GroupByKey 的过程,两者没有本质区别。&br&只是 MapReduce 为了方便 GroupBy 存在于不同 partition 中的 key/value records,就提前对 key 进行排序。Spark 认为很多应用不需要对 key 排序,就默认没有在 GroupBy 的过程中对 key 排序。&br&&br&2. 从数据流角度讲,两者有差别。&br&MapReduce 只能从一个 Map Stage shuffle 数据,Spark 可以从多个 Map Stages shuffle 数据(这是 DAG 型数据流的优势,可以表达复杂的数据流操作,参见 CoGroup(), join() 等操作的数据流图 &a href=&//link.zhihu.com/?target=https%3A//github.com/JerryLead/SparkInternals/blob/master/markdown/4-shuffleDetails.md& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SparkInternals/4-shuffleDetails.md at master · JerryLead/SparkInternals · GitHub&/a&)。&br&&br&3. Shuffle write/read 实现上有一些区别。&br&以前对 shuffle write/read 的分类是 sort-based 和 hash-based。MapReduce 可以说是 sort-based,shuffle write 和 shuffle read 过程都是基于key sorting 的 (buffering records + in-memory sort + on-disk external sorting)。早期的 Spark 是 hash-based,shuffle write 和 shuffle read 都使用 HashMap-like 的数据结构进行 aggregate (without key sorting)。但目前的 Spark 是两者的结合体,shuffle write 可以是 sort-based (only sort partition id, without key sorting),shuffle read 阶段可以是 hash-based。因此,目前 sort-based 和 hash-based 已经“你中有我,我中有你”,界限已经不那么清晰。&br&&br&4. 从数据 fetch 与数据计算的重叠粒度来讲,两者有细微区别。&br&MapReduce 是粗粒度,reducer fetch 到的 records 先被放到 shuffle buffer 中休息,当 shuffle buffer 快满时,才对它们进行 combine()。而 Spark 是细粒度,可以即时将 fetch 到的 record 与 HashMap 中相同 key 的 record 进行 aggregate。&br&&br&5. 从性能优化角度来讲,Spark考虑的更全面。&br&MapReduce 的 shuffle 方式单一。Spark 针对不同类型的操作、不同类型的参数,会使用不同的 shuffle write 方式。比如 Shuffle write 有三种实现方式:&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/v2-3e6e5aadef0e07b03c8518e_b.jpg& data-rawwidth=&712& data-rawheight=&379& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&https://pic2.zhimg.com/50/v2-3e6e5aadef0e07b03c8518e_r.jpg&&&/figure&&br&其中 Serialized sorting 方式既可以使用堆内内存,也可以使用堆外内存。更多的细节就不详述了,感兴趣可以看相关的实现类。&br&&br&继续干活!
邀请 最近忙成狗,就不详述实现过程了,仅仅对比一下。 1. 从逻辑角度来讲,Shuffle 过程就是一个 GroupByKey 的过程,两者没有本质区别。 只是 MapReduce 为了方便 GroupBy 存在于不同 partition 中的 key/value records,就提前对 …
&p&我们团队写了一个cpp 实现的 raft 的一致性协议库. &a href=&//link.zhihu.com/?target=https%3A//github.com/PikaLabs/floyd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PikaLabs/floyd&/a& floyd 也已经通过jepsen 的测试.&/p&&p&目前已经用在团队中的分布式存储 &a href=&//link.zhihu.com/?target=https%3A//github.com/Qihoo360/zeppelin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Qihoo360/zeppelin&/a&用于存储Meta 信息, 目前在公司内部线上有200+ 的机器, 2000+ 节点运行. 在 &a href=&//link.zhihu.com/?target=https%3A//github.com/Qihoo360/pika& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Qihoo360/pika&/a&
的Pika_hub 模块用于进行leader 的选主. &/p&&p&最大的方便在于是一个库, 而不是一个服务, 减少了对 zookeeper 的依赖.&/p&
我们团队写了一个cpp 实现的 raft 的一致性协议库.
floyd 也已经通过jepsen 的测试.目前已经用在团队中的分布式存储 用于存储Meta 信息, 目前在公司内部线上有200+ 的机器, 2000+ 节点运行. 在
的Pika_hub …
&figure&&img src=&https://pic3.zhimg.com/v2-fec4c9a02fe4cf95387c6cef17303bee_b.jpg& data-rawwidth=&720& data-rawheight=&346& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/v2-fec4c9a02fe4cf95387c6cef17303bee_r.jpg&&&/figure&&p&&b&申明:&/b&&/p&&p&本文旨在为普通程序员(Java程序员最佳)提供一个入门级别的大数据技术学习路径,不适用于大数据工程师的进阶学习,也不适用于零编程基础的同学。&/p&&hr&&p&&b&前言:&/b&&/p&&ul&&li&一、背景介绍&/li&&li&二、大数据介绍&/li&&/ul&&p&&b&正文:&/b&&/p&&ul&&li&一、大数据相关的工作介绍&/li&&li&二、大数据工程师的技能要求&/li&&li&三、大数据学习规划&/li&&li&四、持续学习资源推荐(书籍,博客,网站)&/li&&li&五、项目案例分析(批处理+实时处理)&/li&&/ul&&hr&&h2&前言&/h2&&h2&一、背景介绍&/h2&&p&本人目前是一名大数据工程师,项目数据50T,日均数据增长20G左右,个人是从Java后端开发,经过3个月的业余自学成功转型大数据工程师。&/p&&h2&二、大数据介绍&/h2&&p&大数据本质也是数据,但是又有了新的特征,包括&b&数据来源广&/b&、&b&数据格式多样化&/b&(结构化数据、非结构化数据、Excel文件、文本文件等)、&b&数据量大&/b&(最少也是TB级别的、甚至可能是PB级别)、&b&数据增长速度快&/b&等。&/p&&p&针对以上主要的4个特征我们需要考虑以下问题:&/p&&ol&&li&数据来源广,该如何采集汇总?,对应出现了Sqoop,Cammel,Datax等工具。&/li&&li&数据采集之后,该如何存储?,对应出现了GFS,HDFS,TFS等分布式文件存储系统。&/li&&li&由于数据增长速度快,数据存储就必须可以水平扩展。&/li&&li&数据存储之后,该如何通过运算快速转化成一致的格式,该如何快速运算出自己想要的结果?&/li&&/ol&&p&对应的MapReduce这样的分布式运算框架解决了这个问题;但是写MapReduce需要Java代码量很大,所以出现了Hive,Pig等将SQL转化成MapReduce的解析引擎;&/p&&p&普通的MapReduce处理数据只能一批一批地处理,时间延迟太长,为了实现每输入一条数据就能得到结果,于是出现了Storm/JStorm这样的低时延的流式计算框架;&/p&&p&但是如果同时需要&b&批处理&/b&和&b&流处理&/b&,按照如上就得搭两个集群,Hadoop集群(包括HDFS+MapReduce+Yarn)和Storm集群,不易于管理,所以出现了Spark这样的一站式的计算框架,既可以进行批处理,又可以进行流处理(实质上是微批处理)。&/p&&ol&&li&而后Lambda架构,Kappa架构的出现,又提供了一种业务处理的通用架构。&/li&&li&为了提高工作效率,加快运速度,出现了一些辅助工具:&/li&&/ol&&ul&&li&Ozzie,azkaban:定时任务调度的工具。&/li&&li&Hue,Zepplin:图形化任务执行管理,结果查看工具。&/li&&li&Scala语言:编写Spark程序的最佳语言,当然也可以选择用Python。&/li&&li&Python语言:编写一些脚本时会用到。&/li&&li&Allluxio,Kylin等:通过对存储的数据进行预处理,加快运算速度的工具。&/li&&/ul&&p&以上大致就把整个大数据生态里面用到的工具所解决的问题列举了一遍,知道了他们为什么而出现或者说出现是为了解决什么问题,进行学习的时候就有的放矢了。&/p&&h2&正文&/h2&&h2&一、大数据相关工作介绍&/h2&&p&大数据方向的工作目前主要分为三个主要方向:&/p&&ol&&li&大数据工程师&/li&&li&数据分析师&/li&&li&大数据科学家&/li&&li&其他(数据挖掘等)&/li&&/ol&&h2&二、大数据工程师的技能要求&/h2&&p&附上大数据工程师技能图:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bcf09fb3a8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&800& data-rawheight=&528& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-bcf09fb3a8_r.jpg&&&/figure&&p&&br&&/p&&p&&b&必须掌握的技能11条&/b&&/p&&ol&&li&Java高级(虚拟机、并发)&/li&&li&Linux 基本操作&/li&&li&Hadoop(HDFS+MapReduce+Yarn )&/li&&li&HBase(JavaAPI操作+Phoenix )&/li&&li&Hive(Hql基本操作和原理理解)&/li&&li&Kafka&/li&&li&Storm/JStorm&/li&&li&Scala&/li&&li&Python&/li&&li&Spark (Core+sparksql+Spark streaming )&/li&&li&辅助小工具(Sqoop/Flume/Oozie/Hue等)&/li&&/ol&&p&&b&高阶技能6条&/b&&/p&&ol&&li&机器学习算法以及mahout库加MLlib&/li&&li&R语言&/li&&li&Lambda 架构&/li&&li&Kappa架构&/li&&li&Kylin&/li&&li&Alluxio&/li&&/ol&&h2&三、学习路径&/h2&&p&假设每天可以抽出3个小时的有效学习时间,加上周末每天保证10个小时的有效学习时间;&/p&&p&3个月会有(21&i&3+4&/i&2&i&10)&/i&3=&b&423&/b&小时的学习时间。&/p&&p&&b&第一阶段(基础阶段)&/b&&/p&&p&1)Linux学习(跟鸟哥学就ok了)-----20小时&/p&&ol&&li&Linux操作系统介绍与安装。&/li&&li&Linux常用命令。&/li&&li&Linux常用软件安装。&/li&&li&Linux网络。&/li&&li&防火墙。&/li&&li&Shell编程等。&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=https%3A//www.centos.org/download/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&centos.org/download/&/span&&span class=&invisible&&&/span&&/a&&br&中文社区:&a href=&http://link.zhihu.com/?target=http%3A//www.linuxidc.com/Linux/919.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&linuxidc.com/Linux/2017&/span&&span class=&invisible&&-09/146919.htm&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&2)Java 高级学习(《深入理解Java虚拟机》、《Java高并发实战》)---30小时&/p&&ol&&li&掌握多线程。&/li&&li&掌握并发包下的队列。&/li&&li&了解JMS。&/li&&li&掌握JVM技术。&/li&&li&掌握反射和动态代理。&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=https%3A//www.java.com/zh_CN/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&java.com/zh_CN/&/span&&span class=&invisible&&&/span&&/a&&br&中文社区:&a href=&http://link.zhihu.com/?target=http%3A//www.java-cn.com/index.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&java-cn.com/index.html&/span&&span class=&invisible&&&/span&&/a&&/p&&p&3)Zookeeper学习(可以参照这篇博客进行学习:&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/wuxl360/p/5817471.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&cnblogs.com/wuxl360/p/5&/span&&span class=&invisible&&817471.html&/span&&span class=&ellipsis&&&/span&&/a&)&/p&&ol&&li&Zookeeper分布式协调服务介绍。&/li&&li&Zookeeper集群的安装部署。&/li&&li&Zookeeper数据结构、命令。&/li&&li&Zookeeper的原理以及选举机制。&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=http%3A//zookeeper.apache.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&zookeeper.apache.org/&/span&&span class=&invisible&&&/span&&/a&&br&中文社区:&a href=&http://link.zhihu.com/?target=http%3A//www.aboutyun.com/forum-149-1.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&aboutyun.com/forum-149-&/span&&span class=&invisible&&1.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&b&第二阶段(攻坚阶段)&/b&&/p&&p&4)Hadoop (《Hadoop 权威指南》)---80小时&/p&&ol&&li&HDFS&/li&&/ol&&ul&&li&HDFS的概念和特性。&/li&&li&HDFS的shell操作。&/li&&li&HDFS的工作机制。&/li&&li&HDFS的Java应用开发。&/li&&/ul&&ol&&li&MapReduce&/li&&/ol&&ul&&li&运行WordCount示例程序。&/li&&li&了解MapReduce内部的运行机制。&/li&&ul&&li&MapReduce程序运行流程解析。&/li&&li&MapTask并发数的决定机制。&/li&&li&MapReduce中的combiner组件应用。&/li&&li&MapReduce中的序列化框架及应用。&/li&&li&MapReduce中的排序。&/li&&li&MapReduce中的自定义分区实现。&/li&&li&MapReduce的shuffle机制。&/li&&li&MapReduce利用数据压缩进行优化。&/li&&li&MapReduce程序与YARN之间的关系。&/li&&li&MapReduce参数优化。&/li&&/ul&&/ul&&p&&br&&/p&&p&&br&&/p&&ol&&li&MapReduce的Java应用开发&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=http%3A//hadoop.apache.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&hadoop.apache.org/&/span&&span class=&invisible&&&/span&&/a&&br&中文文档:&a href=&http://link.zhihu.com/?target=http%3A//hadoop.apache.org/docs/r1.0.4/cn/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&hadoop.apache.org/docs/&/span&&span class=&invisible&&r1.0.4/cn/&/span&&span class=&ellipsis&&&/span&&/a&&br&中文社区:&a href=&http://link.zhihu.com/?target=http%3A//www.aboutyun.com/forum-143-1.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&aboutyun.com/forum-143-&/span&&span class=&invisible&&1.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&5)Hive(《Hive开发指南》)--20小时&/p&&ol&&li&Hive 基本概念&/li&&/ol&&ul&&li&Hive 应用场景。&/li&&li&Hive 与hadoop的关系。&/li&&li&Hive 与传统数据库对比。&/li&&li&Hive 的数据存储机制。&/li&&/ul&&p&&br&&/p&&ol&&li&Hive 基本操作&/li&&/ol&&ul&&li&Hive 中的DDL操作。&/li&&li&在Hive 中如何实现高效的JOIN查询。&/li&&li&Hive 的内置函数应用。&/li&&li&Hive shell的高级使用方式。&/li&&li&Hive 常用参数配置。&/li&&li&Hive 自定义函数和Transform的使用技巧。&/li&&li&Hive UDF/UDAF开发实例。&/li&&/ul&&p&&br&&/p&&ol&&li&Hive 执行过程分析及优化策略&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=https%3A//hive.apache.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&hive.apache.org/&/span&&span class=&invisible&&&/span&&/a&&br&中文入门文档:&a href=&http://link.zhihu.com/?target=http%3A//www.aboutyun.com/thread-.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&aboutyun.com/thread-118&/span&&span class=&invisible&&73-1-1.html&/span&&span class=&ellipsis&&&/span&&/a&&br&中文社区:&a href=&http://link.zhihu.com/?target=http%3A//www.aboutyun.com/thread-.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&aboutyun.com/thread-759&/span&&span class=&invisible&&8-1-1.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&6)HBase(《HBase权威指南》)---20小时&/p&&ol&&li&hbase简介。&/li&&li&habse安装。&/li&&li&hbase数据模型。&/li&&li&hbase命令。&/li&&li&hbase开发。&/li&&li&hbase原理。&/li&&/ol&&p&官网:&a href=&http://link.zhihu.com/?target=http%3A//hbase.apache.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&hbase.apache.org/&/span&&span class=&invisible&&&/span&&/a&&br&中文文档:&a href=&http://link.zhihu.com/?target=http%3A//abloz.com/hbase/book.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invis}

我要回帖

更多关于 datax 数据丢失怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信