首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Spark SQL概念学习系列之如何使用 Spark SQL(六)

al sqlContext = new org.apache.spark.sql.SQLContext(sc) // 在这里引入 sqlContext 下所有的方法就可以直接用 sql 方法进行查询 import sqlContext._ case class Person(name: String, age: Int) // 下面的 people 是含有 case 类型数据的 RDD,会默认由 Scala 的 implicit 机制将 RDD 转换为 SchemaRDD, SchemaRDD 是 SparkSQL 中的核心 RDD val people = sc.textFile("examples/src/main/resources/people.txt").map(_. split(",")).map(p => Person(p(0), p(1).trim.toInt)) // 在内存的元数据中注册表信息,这样一个 Spark SQL 表就创建完成了 people.registerAsTable("people") // sql 语句就会触发上面分析的 Spark SQL 的执行过程,读者可以参考上面的图示 val teenagers = sql("SELECT name FROM people WHERE age >= 13 AND age <= 19") // 最后生成 teenagers 也是一个 RDD teenagers.map(t =>"Name: " + t(0)).collect().foreach(println) 通过之前的介绍,读者对支撑结构化数据分析任务的 Spark SQL 的原理与使用有了一定的了解。在生产环境中,有一类数据分析任务对响应延迟要求高,需要实时处理流数据,在 BDAS 中, Spark Streaming 用于支撑大规模流式处理分析任务。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725106.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop概念学习系列之Hadoop的文件系统(十六)

Hadoop整合了众多文件系统,它首先提供了一个高层的文件系统抽象类org.apache.hadoop.fs.FileSystem,这个抽象类展示了一个分布式文件系统,并有几个具体实现。 如下表所示。 Hadovp提供了许多文件系统的接口,用户可使用URI方案选取合适的文件系统来实现交互。比如,可以使用文件系统命令行接口来进行Hadoop文件系统的操作。如果想列出本地文件系统的目录,那么执行以下shell命令即可: hadoop fs -lsfile:/// (1)接口 Hadoop是使用Java编写的,而Hadoop中不同文件系统之间的交互是由Java API进行调解的。事实上,前面使用的文件系统的shell就是一个Java应用,它使用Java文件系统类来提供文件系统操作。即使其他文件系统比如FTP, S3都有自己的访问工具,这些接口在HDFS中还是被广泛使用,主要用来进行Hadoop文件系统之间的协作。 (2)Thrift 上面提到可以通过Java API与Hadoop的文件系统进行交互,而对于其他非Java应用访问Hadaop文件系统则比较麻烦。Thriftfs分类单元中的Thrift API可通过将Hadaop文件系统展示为一个Apache Thrift服务来填补这个不足,让任何有Thrift绑定的语言都能轻松地与Hadoop文件系统进行交互。Thrift是由Facebook公司开发的一种可伸缩的跨语言服务的发展软件框架。Thrift解决了各系统间大数据量的传输通信,以及系统之间因语言环境不同而需要跨平台的问题。在多种不同的语言之间通信时,Thrift可以作为二进制的高性能的通信中间件,它支持数据(对象)序列化和多种类型 的RPC服务。 下面来看如何使用Thrift API。要使用Thrift API,首先要运行提供Thrill服务的Java服务器,并以代理的方式访问Hadoop文件系统。Thrill API包含很多其他语言生成的stub,包括C++、Perl、PHP、 Python等。Thrift支持不同的版本,因此可以从同一个客户代码中访问不同版本的Hadoop文件系统,但要运行针对不同版本的代理。 (3)C语言库 Hadoop提供了映射Java文件系统接口的C语言库—libhdfs。libhdfs可以编写为一个访问HDFS的C语言库,实际上,它可以访问任意的Haduap文件系统,它也可以使用JNI(Java Native Interface)来调用Java文件系统的客户端。 这里的C语言的接口和Java的使用非常相似,只是稍滞后于Java,目前还不支持一些新特性。相关资料可参见libhdfs/docs/api目录中关丁Hadoop分布的C API文档。 (4) FUSE FUSE(Filesystem in Userspace)允许将文件系统整合为一个Unix文件系统并在用户空间中执行。通过使用Hadoop Fuse-DFS的contirb模块来支持任意的Hadoop文件系统作为一个标准的文件系统挂载,便可以使用Unix的工具(像1s, cat)和文件系统进行交互,还可以通过任意一种编程语言使用POSIX库来访问文件系统。 Fuse-DFS是用C语言实现的,可使用libhdfs作为与HDFS的接口,关于如何编译和运行Fuse-DFS,可以参见src/contrib../fuse-dfs中的相关文档。 (5) WebDAV WebDAV是一系列支持编辑和更新文件的HTTP的扩展,在大部分操作系统中,WeDAV共享都可以作为文件系统进行挂载,因此,可通过WebDAV来对外提供HDFS或其他Nadoop文件系统,可以将HDFS作为一个标淮的文件系统进行访问。 (6)其他HDFS接口 HDFS接口还提供了以下其他两种特定的接口。 HTTP。 HDFS定义了一个只读接口,用来在HTTP上检索目录列表和数据。NameNode的嵌入式Web服务器运行在50070端口上,以XML格式提供服务,文件数据由DataNode通过它们的Web服务器50075端日向NameNode提供。这个协议并不拘泥于某个HDFS版本,所以用户可以自己编写使用HTTP从运行不同版本的Hadoop的NDFS中读取数据。HftpFileSystem就是其中的一种实现,它是一个通过HTTP和HDFS交流的Hadoop文件系统,是HTTPS的变体。 FTP。Hadoop接口中还有一个HDFS的FTP接口,它允许使用FTP协议和HDFS交互,即使用FTP客户端和HDFS进行交互。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5089369.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop HDFS概念学习系列之HDFS源代码结构(十四)

了解了HDFS体系结构中的名字节点、数据节点和客户端以后,我们来分析HDFS实现的源代码结构。HDFS源代码都在org.apache.hadoop.hdfs包下,其结构如图6-3所示。 HDFS的源代码分布在I6个目录下,它们可以分为如下四类1.基础包 包括工具和安全包。其中,hdfs.util包含了一些HDFS实现需要的辅助数据结构:hdfs.security.token.hlock和hdfs.security.token.delegation结合Hadaop的安全框架,提供了安全访问HDFS的机制。该安全特性最先是由Yahoo开发的,集成了企业广泛应用的Kerberos标准,使得用户可以在一个集群管理各类商业敏感数据。 2.HDFS实体实现包 这是代码分析的重点,包含7个包: hdfs.server.common包含了一些名字节点和数据节点共享的功能,如系统升级、存储空间信息等。hdfs.protocol包提供了HDFS各个实体间通过IPC交互的接口。hdfs.server.datanode和hdfs分别包含了名字节点、数据节点和客户端的实现。上述代码是HDFS代码分析的重点。hdfs.server.namennde.metrics包和hdfs.server.datanode.metrics包实现了名字节点和数据节点上度量数据的收集功能。度量数据包括名字节点进程和数据节点进程上事件的计数,例如数据节点上就可以收集到写入字节数、被复制的块的数量等信息。 3.应用包 包括hdfs.tools包和hdfs.server.balancer包,这两个包提供查询HDFS状态信息工具dfsadmin、文件系统检查工具fsck和HDFS均衡器balancer(通过start-balancer. sh启动)的实现。 4. WebHDFS相关包 包括hdfs.web.resources包,hdfs.server.namenode.web.resourees包,hdfs.server.datanode.web.resources包和hdfs.web包共4个包。 WebHDFS是HDFS 1.0中引入的新功能,它提供了一个完整的、通过HTTP访问HDFS的机制。对比只读的hftp文件系统,WebHDFS提供了HTTP上读写HDFS的能力,并在此基础上实现了访问 HDFS的C客户端和用户空间文件系统〔FUSE)。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5089745.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop概念学习系列之重温Hadoop基本知识(十一)

Hadoop是一个由Apache基金会开发的分布式编程框架,允许在集群服务器上使用简单的编程模型(MapReduce)对大数据集进行分布式处理。 Hadoop框架的核心的是HDFS、MapReduce和Yarn。 其中HDFS提供海量数据的存储, MapReduce提供数据计算, Yarn是集群资源管理和调度平台。 掌握了这三部分,也就掌握了Hadoop最核心的东西。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5080008.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop MapReduce概念学习系列之新旧 MapReduce API 比较(四)

从 0.20.0 版本开始,Hadoop 同时提供了新旧两套 MapReduce API。新 API 在旧 API 基础上进行了封装,使得其在扩展性和易用性方面更好。新旧版 MapReduce API 的主要区 别如下。 (1)存放位置 旧版 API 放在 org.apache.hadoop.mapred 包中,而新版 API 则放在 org.apache.hadoop. mapreduce 包及其子包中。 (2)接口变为抽象类 接口通常作为一种严格的“协议约束”。它只有方法声明而没有方法实现,且要求所有实 现类(不包括抽象类)必须实现接口中的每一个方法。接口的最大优点是允许一个类实现多 个接口,进而实现类似 C++ 中的“多重继承”。抽象类则是一种较宽松的“约束协议”,它可 为某些方法提供默认实现。而继承类则可选择是否重新实现这些方法。正是因为这一点,抽 象类在类衍化方面更有优势,也就是说,抽象类具有良好的向后兼容性,当需要为抽象类添 加新的方法时,只要新添加的方法提供了默认实现,用户之前的代码就不必修改了。 考虑到抽象类在API衍化方面的优势,新API在InputFormat、OutputFormat、Mapper、Reducer和Partitioner由接口变成抽象类。 (3)上下文封装 新版 API 将变量和函数封装成各种上下文(Context)类,使得 API 具有更好的易用性 和扩展性。首先,函数参数列表经封装后变短,使得函数更容易使用 ;其次,当需要修改 或添加某些变量或函数时,只需修改封装后的上下文类即可,用户代码无须修改,这样保 证了向后兼容性,具有良好的扩展性。 上图展示了新版API中树形的Context 类继承关系。这些Context 各自封装了一种实体的基本信息及对应的操作(setter和getter 函数),如JobContext、TaskAttemptContext 分 别封装了Job和Task的基本信息,TaskInputOutputContext 封装了Task的各种输入输出操作,MapContext 和ReduceContext分别封装了Mapper和Reducer对外的公共接口。 除了以上三点不同之外,新旧API 在很多其他细节方面也存在小的差别。由于新版和旧版API 在类层次结构、编程接口名称及对应的参数列表等方面存在较大差别,所以两种 API 不能兼容。但考虑到应用程序的向后兼容性,短时间内不会将旧API从MapReduce 中去掉。即使在完全采用新 API 的0.21.0/0.22.X 版本系列中,也仅仅将旧 API 标注为过期(deprecated),用户仍然可以使用。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5058689.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发学习:向模拟器的sdcard中添加文件

向模拟器的sdcard中添加文件有两种方法: 1.在eclipse的DDMS视图中操作 启动eclipse---打开DDMS视图---选择File Explorer,出现下面的窗口 选中sdcard文件夹---点击,选择你需要添加的文件就可以了 2.运用adb命令操作 先将要添加的文件放到platform-tools(我的platform-tools路径 D:\Android\android-sdk-windows\platform-tools)文件夹下,之后在命令行窗口进入 D:\Android\android-sdk-windows\platform-tools,输入adb命令添加文件,如下图所示: 这时,文件music.mp3就被添加到sdcard/Android目录下面 之后可以在模拟器中打开dev tools,运行Media Scanner,在音乐中播放添加的音乐 还可以在命令行运行adb shell来查看sdcard中的文件,如下图所示: 向模拟器的sdcard中添加文件常见的错误: 1.Failed to push items null 解决的方法:首先重启eclipse,如果重启之后再出现这个问题,那就要修改超时数,依次展开eclipse---windwos---Preferences---Android---DDMS---ADB connection time out (ms),将参数改得大一些,如下图所示: 2.Failed to push selection: Invalid argument 原因:android不支持中文名称的文件 3.Failed to push XXXXX.txt(添加的文件) on emulator- : Read-only file system 解决的方法:在启动模拟器的时候带着的参数中,模拟器镜像路径需是绝对路径:-sdcard E:\android\android-sdk-windows\tools\sdcard.img注意这个绝对路径里面不能带空格(如Program Files)注意:(卷标、标签)必须是sdcard。如mksdcard -l sdcard128Me:\haogood.image(而不能是mksdcard -l haogood128Me:\haogood.image) 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/673776

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 51)——扩展构造函数

扩展类型的时候,也可以添加新的构造函数。值类型与引用类型扩展有所区别。值类型包括了除类以外的其他类型,主要是枚举类型和结构体类型。 值类型扩展构造函数 扩展结构体类型中定义构造函数的示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 structRectangle{ varwidth:Double varheight:Double init(width:Double,height:Double){ self.width=width self.height=height } } extensionRectangle{ //定义了Rectangle的扩展类型 init(length:Double){ self.init(width:length,height:length) } } varrect=Rectangle(width: 320.0 ,height: 480.0 ) //调用两个参数的构造函数,这个构造函数是原始类型提供,Rectangle类型已经是扩展类型 print( "长方形:\(rect.width)x\(rect.height)" ) varsquare=Rectangle(length: 500.0 ) //调用一个参数的构造函数,这个构造函数是扩展类型提供的 print( "正方形:\(square.width)x\(square.height)" ) self.init是调用了原始类型的两个参数的构造函数。 引用类型扩展构造函数 扩展类中定义构造函数的示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Person{ varname:String varage:Int funcdescription()->String{ return "\(name)年龄是:\(age)" } init(name:String,age:Int){ self.name=name self.age=age } } extensionPerson{ //定义Person类的扩展类型 convenienceinit(name:String){ //便利构造函数 self.init(name:name,age: 8 ) } } letp1=Person(name: "Mary" ) //调用两个参数的构造函数,这个构造函数是原始类型提供,这时候的Person类型已经是扩展类型。 print( "Person1:\(p1.description())" ) letp2=Person(name: "Tony" ,age: 28 ) //调用一个参数的构造函数创建Person实例,这个构造函数是扩展类型提供的。 print( "Person2:\(p2.description())" ) 代码self.init(name :name, age : 8)调用指定构造函数代理部分构造任务。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748298,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 23)——尾随闭包

闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。 下面我们来看一个示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 funccalculate(opr:String,funN:(Int,Int)->Int){ //最后一个参数funN是(Int,Int)->Int函数类型,funN可以接收闭包表达式 switch (opr){ case "+" : print( "10+5=\(funN(10,5))" ) default : print( "10-5=\(funN(10,5))" ) } } calculate( "+" ,funN:{(a:Int,b:Int)->Intin return a+b}) //调用 calculate( "+" ){(a:Int,b:Int)->Intin return a+b} //调用,这种形式就是尾随闭包 calculate( "+" ){$ 0 +$ 1 } //调用,这种形式就是尾随闭包 需要注意的是,闭包必须是参数列表的最后一个参数,如果calculate函数采用如下形式定义: func calculate(funN:(Int,Int)->Int,opr:String) { ... } 由于闭包表达式不是最后一个参数,那么调用calculate函数就不能使用尾随闭包写法的。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746417,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop HDFS概念学习系列之HDFS Master/Slave架构(十)

相比于基于P2P模型的分布式文件系统架构,HDFS采用的是基于Master/Slave主从架构的分布式文件系统,一个HDFS集群包含一个单独的Master节点和多个Slave节点服务器,这里的一个单独的Master节点的含义是HDFS系统中只存在一个逻辑上的Master组件。一个逻辑的Master节点可以包括两台物理主机,即两台Master服务器、多台Slave服务器。一台Master服务器组成单NameNode集群,两台Master服务器组成双NameNode集群,并且同时被多个客户端访问.所有的这此机器通常都是普通的Linux机器,运行着用户级别(user-level)的服务进程。HDFS架构设计图如下: 上图展示了HDFS的NameNode、 DataNode以及客户端之间的存取访问关系,单一节点的NameNode大大简化了系统架构。NameNode负责保存和管理所有的HDFS元数据,因而用户数据就不需要通过NameNode,也就是说文件数据的读写是直接在DataNode上进行的。HDFS存储的文件都被分割成固定大小的Block,在创建Block的时候,NameNode服务器会给每个Block分配一个唯一不变的Block标识。DataNode服务器把Block以Linux文件的形式保存在本地硬盘上,并且根据指定的Block标识和字节范围来读写块数据。出于可靠性的考虑,每个块都会复制到多个DataNode服务器上。在默认情况下,HDFS使用三个冗余备份,当然用户可以为不同的文件命名空间设定不同的复制因子数。NameNode管理所有的文件系统元数据。这些元数据包括名称空间、访问控制信息、文件和Block的映射信息,以及当前Block的位置信息。NameNode还管理着系统范围内的活动,比如,Block租用管理、孤立Block的I回收,以及Block 在 DataNode服务器之间的迁移。NameNode使信息周期性地和每个DataNode服务器通信,发送指令到各个DataNode服务器并接收DataNode中Block的状态信息。 HDFS客户端代码以库的形式被链接到客户程序中。在客户端代码中需要实现HDFS文件系统的API 接口函数,应用程序与NameNode和DataNode服务器通信,以及对数据进行读写操作。客户端和NameNode的通信只获取元数据,所有的数据操作都是由客户端直接和DataNode服务器进行交互的。HDFS不提供POSIX标准的API功能,因此,HDFS API调用不需要深入到Linux vnode级别。无论是客户端还是DataNode服务器都不需要缓存文件数据。客户端缓存数据几乎没有什么用处,因为大部分程序要么以流的方式读取一个巨大的文件,要么工作集太大根本无法被缓存。因此,无须考虑与缓存相关的问题,同时也简化了客户端及整个系统的设计和实现。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5081550.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

[BigData]关于Hadoop学习笔记第三天(PPT总结)(一)

课程安排 MapReduce原理*** MapReduce执行过程** 数据类型与格式*** Writable接口与序列化机制*** ---------------------------加深拓展---------------------- MapReduce的执行过程源码分析 问题:怎样解决海量数据的计算? MapReduce概述 lMapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. lMR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。 l这两个函数的形参是key、value对,表示函数的输入信息。 思考:自己设计一个MapReduce框架 Mapreduce原理 ◆执行步骤: 1. map任务处理 1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。 1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。 2.reduce任务处理 2.1写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。 2.2把reduce的输出保存到文件中。 map、reduce键值对格式 WordCountApp的驱动代码 Configuration conf = new Configuration(); //加载配置文件 Job job = new Job(conf); //创建一个job,供JobTracker使用 job.setJarByClass(WordCountApp.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.1.10:9000/input")); FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.1.10:9000/output")); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.waitForCompletion(true); } MR流程 l代码编写 l作业配置 l提交作业 l初始化作业 l分配任务 l执行任务 l更新任务和状态 l完成作业 MR过程各个角色的作用 ljobClient:提交作业 lJobTracker:初始化作业,分配作业,TaskTracker与其进行通信,协调监控整个作业 lTaskTracker:定期与JobTracker通信,执行Map和Reduce任务 lHDFS:保存作业的数据、配置、jar包、结果 作业提交 l提交作业之前,需要对作业进行配置 •编写自己的MR程序 •配置作业,包括输入输出路径等等 l提交作业 •配置完成后,通过JobClient提交 l具体功能 •与JobTracker通信得到一个jar的存储路径和JobId •输入输出路径检查 •将jobj ar拷贝到的HDFS •计算输入分片,将分片信息写入到job.split中 •写job.xml •真正提交作业 作业初始化 l客户端提交作业后,JobTracker会将作业加入到队列,然后进行调度,默认是FIFO方式 l具体功能 •作业初始化主要是指JobInProgress中完成的 •读取分片信息 •创建task包括Map和Reduce任创建task包括Map和Reduce任务 •创建TaskInProgress执行task,包括map任务和reduce任务 任务分配 lTaskTracker与JobTracker之间的通信和任务分配是通过心跳机制实现的 lTaskTracker会主动定期向JobTracker发送心态信息,询问是否有任务要做,如果有,就会申请到任务。 任务执行 l如果TaskTracker拿到任务,会将所有的信息拷贝到本地,包括代码、配置、分片信息等 lTaskTracker中的localizeJob()方法会被调用进行本地化,拷贝job.jar,jobconf,job.xml到本地 lTaskTracker调用launchTaskForJob()方法加载启动任务 lMapTaskRunner和ReduceTaskRunner分别启动java child进程来执行相应的任务 状态更新 lTask会定期向TaskTraker汇报执行情况 lTaskTracker会定期收集所在集群上的所有Task的信息,并向JobTracker汇报 lJobTracker会根据所有TaskTracker汇报上来的信息进行汇总 作业完成 lJobTracker是在接收到最后一个任务完成后,才将任务标记为成功 l将数结果据写入到HDFS中 错误处理 lJobTracker失败 •存在单点故障,hadoop2.0解决了这个问题 lTraskTracker失败 •TraskTracker崩溃了会停止向JobTracker发送心跳信息。 •JobTracker会将TraskTracker从等待的任务池中移除,并将该任务转移到其他的地方执行 •JobTracker将TaskTracker加入到黑名单中 lTask失败 •任务失败,会向TraskTracker抛出异常 •任务挂起 JobTracker l负责接收用户提交的作业,负责启动、跟踪任务执行。 lJobSubmissionProtocol是JobClient与JobTracker通信的接口。 lInterTrackerProtocol是TaskTracker与JobTracker通信的接口。 TaskTracker l负责执行任务。 JobClient l是用户作业与JobTracker交互的主要接口。 l负责提交作业的,负责启动、跟踪任务执行、访问任务状态和日志等。 序列化概念 l序列化(Serialization)是指把结构化对象转化为字节流。 l反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。 lJava序列化(java.io.Serializable) Hadoop序列化的特点 l序列化格式特点: 1.紧凑:高效使用存储空间。 2.快速:读写数据的额外开销小 3.可扩展:可透明地读取老格式的数据 4.互操作:支持多语言的交互 Hadoop的序列化格式:Writable Java序列化的不足: 1.不精简。附加信息多。不大适合随机访问。 2.存储空间大。递归地输出类的超类描述直到不再有超类。序列化图对象,反序列化时为每个对象新建一个实例。相反。Writable对象可以重用。 3.扩展性差。而Writable方便用户自定义 Hadoop序列化的作用 l序列化在分布式环境的两大作用:进程间通信,永久存储。 lHadoop节点间通信。 Writable接口 lWritable接口, 是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象. lMR的任意Key和Value必须实现Writable接口. •MR的任意key必须实现WritableComparable接口 常用的Writable实现类 Text一般认为它等价于java.lang.String的Writable。针对UTF-8序列。 例: Text test = new Text("test"); IntWritable one = new IntWritable(1); 自定义Writable类 Writable ①write 是把每个对象序列化到输出流 ②readFields是把输入流字节反序列化 ①实现WritableComparable. ②Java值对象的比较:一般需要重写toString(),hashCode(),equals()方法 自定义WritableKpi 1.电信例子 2.把上面例子里的Mapper的value改写为自定义Writable类型。修改原MapReduce程序,并成功执行。结果跟原来一致。 MapReduce输入的处理类 lFileInputFormat: FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。 InputFormat InputFormat 负责处理MR的输入部分. 有三个作用: v验证作业的输入是否规范. v把输入文件切分成InputSplit. v提供RecordReader 的实现类,把InputSplit读到Mapper中进行处理. InputSplit ◆ 在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。 ◆ FileInputFormat只划分比HDFS block大的文件,所以FileInputFormat划分的结果是这个文件或者是这个文件中的一部分. ◆ 如果一个文件的大小比block小,将不会被划分,这也是Hadoop处理大文件的效率要比处理很多小文件的效率高的原因。 ◆ 当Hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致效率底下。 例如:一个1G的文件,会被划分成16个64MB的split,并分配16个map任务处理,而10000个100kb的文件会被10000个map任务处理。 TextInputFormat ◆ TextInputformat是默认的处理类,处理普通文本文件。 ◆ 文件中每一行作为一个记录,他将每一行在文件中的起始偏移量作为key,每一行的内容作为value。 ◆ 默认以\n或回车键作为一行记录。 ◆ TextInputFormat继承了FileInputFormat。 InputFormat类的层次结构 其他输入类 ◆ CombineFileInputFormat 相对于大量的小文件来说,hadoop更合适处理少量的大文件。 CombineFileInputFormat可以缓解这个问题,它是针对小文件而设计的。 ◆ KeyValueTextInputFormat 当输入数据的每一行是两列,并用tab分离的形式的时候,KeyValueTextInputformat处理这种格式的文件非常适合。 ◆ NLineInputformat NLineInputformat可以控制在每个split中数据的行数。 ◆ SequenceFileInputformat 当输入文件格式是sequencefile的时候,要使用SequenceFileInputformat作为输入。 自定义输入格式 1)继承FileInputFormat基类。 2)重写里面的getSplits(JobContext context)方法。 3)重写createRecordReader(InputSplit split,TaskAttemptContext context)方法。 (讲解源代码) Hadoop的输出 ◆ TextOutputformat 默认的输出格式,key和value中间值用tab隔开的。 ◆ SequenceFileOutputformat 将key和value以sequencefile格式输出。 ◆ SequenceFileAsOutputFormat 将key和value以原始二进制的格式输出。 ◆ MapFileOutputFormat 将key和value写入MapFile中。由于MapFile中的key是有序的,所以写入的时候必须保证记录是按key值顺序写入的。 ◆ MultipleOutputFormat 默认情况下一个reducer会产生一个输出,但是有些时候我们想一个reducer产生多个输出,MultipleOutputFormat和MultipleOutputs可以实现这个功能。 思考题 1.MapReduce框架的结构是什么 2.Map在整个MR框架中作用是什么 3.Reduce在整个MR框架中作用是什么 本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4572339.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop MapReduce概念学习系列之MapReduce 资源组织方式(六)

MapReduce计算框架并没有直接调用CPU和内存等多维度资源,它把多维度资源抽象为“slot”,用“slot” 来描述资源的数量。管理员可以在每个节点上单独配置slot个数。slot可以分为map slot和reduce slot。从一定程度上,slot可以看做“任务运行并行度”。如果某个节点配置了5个map slot,那么这个节点最多运行5个Map Task;如果某个节点配置了3个reduce slot,那么该节点最多运行3个Reduce Task。下面我们分别介绍 Map slot和Reduce slot。 1、Map slot 1)Map slot 可用于运行Map Task 的资源,而且只能运行Map Task。 2)每个Map Task通常使用一个map slot。而比如像容量调度器,它可以有比较大的MapTask。这样的MapTask使用内存比较多,那么它可能使用多个map slot。 2、Reduce slot 1)Reduce slot 可用于运行ReduceTask,而且只能运行ReduceTask。 2)每个ReduceTask通常使用一个reduce slot。而比如像容量调度器,它可以有比较大的 ReduceTask。这样的ReduceTask使用内存比较多,那么它可能使用多个reduce slot。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5058725.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Hadoop Hive概念学习系列之hive里的视图(十二)

可以先,从MySQL里的视图概念理解入手 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表。在数据库中,存放的只是视图的定义,而不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。 视图可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见。 视图的作用有: 首先,可以简化数据查询语句 其次,可以使用用户能从多角度看待同一数据 然后,通过引入视图可以提高数据的安全性 最后,视图提提供了一定程度的逻辑独立性等。 引入视图机制带来的好处: 通过引入视图机制,用户可以将注意力集中在其关心的数据上(而非全部数据),这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,并且搜索条件又比较复杂时,需要编写的查询语句就会比较烦琐,此时定义视图就可以使数据的查询语句变得简单可行。 定义视图可以将表与表之间的复杂的操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,故增加了数据的安全性,但不能提高查询效率。 Hive视图是一种无关底层存储的逻辑对象。视图中的数据是SELECT查询返回的结果。在视图选定后才会开始执行SELECT查询。 需要注意的是,视图是只读的,不能向视图中插入或是加载数据。 下面是一个创建并使用视图的例子: create viewgroup_by_year_vw as select year,count(*) as video_ct from videos group by year; select * from group_by_year_vw; 视图通常被用作将数据发布给外部客户端的抽象层。视图可以使用稳定的公开的列名和数据类型来创建。 视图可以允许在不影响下游数据消费者的情况下修改内部的表结构。 一定要理解,创建视图,是基于表来创建得到视图的。 步骤一:创建一个测试表 create table test(id int,name string); desc test; 结果是 id int name string 步骤二:基于表 test 创建一个 test_view 视图 CREATEVIEWtest_view( id, name_length )ASSELECTid,length(name)FROMtest; 步骤三:查看 test_view 视图属性 DESC test_view; 步骤四:查看视图结果 SELECT * FROM test_view; 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105243.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之Spark SQL 优化策略(五)

查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟。除了查询优化,Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略。(1)内存列式存储与内存缓存表 Spark SQL 可以通过 cacheTable 将数据存储转换为列式存储,同时将数据加载到内存进行缓存。 cacheTable 相当于在分布式集群的内存物化视图,将数据进行缓存,这样迭代的或者交互式的查询不用再从 HDFS 读数据,直接从内存读取数据大大减少了 I/O 开销。列式存储的优势在于 Spark SQL 只需要读出用户需要的列,而不需要像行存储那样需要每次将所有列读出,从而大大减少内存缓存数据 量,更高效地利用内存数据缓存,同时减少网络传输和 I/O 开销。数据按照列式存储,由于是数据类型相同的数据连续存储,能够利用序列化和压缩减少内存空间的占用。 (2)列存储压缩 为了减少内存和硬盘空间占用, Spark SQL 采用了一些压缩策略对内存列存储数据 进 行 压 缩。 Spark SQL 的 压 缩 方 式 要 比 Shark 丰 富 很 多, 例 如 它 支 持 PassThrough,RunLengthEncoding, DictionaryEncoding, BooleanBitSet, IntDelta, LongDelta 等多种压缩方式。这样能够大幅度减少内存空间占用和网络传输开销和 I/O 开销。(3)逻辑查询优化 Spark SQL 在逻辑查询优化(如图 1 所示)上支持列剪枝、谓词下压、属性合并等逻辑查询优化方法。列剪枝为了减少读取不必要的属性列,减少数据传输和计算开销,在查询优化器进行转换的过程中会进行列剪枝的优化。 图 1 逻辑查询优化 下面介绍一个逻辑优化例子: SELECT Class FROM (SELECT ID,Name,Class FROM STUDENT ) S WHERE S.ID=1 Catalyst 将原有查询通过谓词下压,将选择操作 ID=1 优先执行,这样过滤大部分数据,通过属性合并将最后的投影只做一次最终保留 Class 属性列。 (4) Join 优化 Spark SQL 深度借鉴传统数据库查询优化技术的精髓,同时也在分布式环境下进行特定的优化策略调整和创新。 Spark SQL 对 Join 进行了优化支持多种连接算法,现 在的连接算法已经比 Shark 丰富,而且很多原来 Shark 的元素也逐步迁移过来。例如:BroadcastHashJoin、 BroadcastNestedLoopJoin、 HashJoin、 LeftSemiJoin,等等。 下面介绍一个其中的 BroadcastHashJoin 算法思想。BroadcastHashJoin 将小表转化为广播变量进行广播,这样避免 Shuff le 开销,最后在分区内做 Hash 连接。这里用的就是 Hive 中 Map Side Join 的思想。同时用了 DBMS中的 Hash 连接算法做连接。 随着 Spark SQL 的发展,未来会有更多的查询优化策略加入进来。同时后续 SparkSQL 会 支 持 像 Shark Server 一 样 的 服 务 端、 JDBC 接 口, 兼 容 更 多 的 持 久 化 层 例 如NoSQL,传统的 DBMS 等。一个强有力的结构化大数据查询引擎正在崛起。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725097.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之SQL on Spark的简介(三)

AMPLab 将大数据分析负载分为三大类型:批量数据处理、交互式查询、实时流处理。而其中很重要的一环便是交互式查询。 大数据分析栈中需要满足用户 ad-hoc、reporting、 iterative 等类型的查询需求,也需要提供 SQL 接口来兼容原有数据库用户的使用习惯,同时也需要 SQL 能够进行关系模式的重组。完成这些重要的 SQL 任务的便是Spark SQL 和 Shark这两个开源分布式大数据查询引擎,它们可以理解为轻量级 HiveSQL 在 Spark 上的实现,业界将该类技术统称为 SQL on Hadoop。 在 Spark 峰 会 2014 上, Databricks 宣 布 不 再 支 持 Shark 的 开 发, 全 力 以 赴 开 发Shark 的下一代技术 Spark SQL,同时 Hive 社区也启动了 Hive on Spark 项目, 将 Spark作为 Hive(除 MapReduce 和 Tez 之外的)新执行引擎。根据伯克利的 Big Data Benchmark测试对比数据,Shark 的 In Memory 性能 可 以 达 到 Hive 的 100 倍, 即 使 是On Disk 也能达到 10 倍的性能提升,是 Hive 强有力的替代解决方案。而作为Shark 的进化版本的 Spark SQL,在 AMPLab 最新的测试中的性能已经超过 Shark。图 1 展示了 Spark SQL和 Hive on Spark 是新的发展方向。 图 1 Spark SQL 和 Hive on Spark 是新的发展方向 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725020.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册