首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

云服务器从入门到使用教程合集

您在使用云服务器 ECS 的时候,可能会遇到各种问题,例如远程连接、更换操作系统、扩容、升降配、使用快照和镜像等。本文介绍了以下资源的最常用操作,方便您参考,包括: 实例 磁盘 快照 自动快照策略 镜像 安全组 2 分钟视频,了解常用操作。 使用须知 使用 ECS 的注意事项,请参考 ECS 使用须知。 实例 远程连接 在 ECS 管理控制台直接连接 ECS 实例。 使用用户名和密码登录 Linux 实例。 使用 SSH 密钥对登录 Linux 实例。 登录 Windows 实例。 在移动设备上连接实例。 如果您忘记了实例的登录密码(不是管理终端的密码),请 重置密码。 更换操作系统 发现操作系统用不习惯,想更换操作系统,如: 从 Windows 换成 Linux,或相反。 从某个版本改成另外一个版本(比如从 Windows Server 2008 切换到 Windows

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

SQL Server 2012入门安装篇:(1)评估安装环境

当我们需要安装SQL server 2012的时候,我们需要评估一下我们现有的软件和硬件环境是否支持SQL Server 2012,或者说我们要根据实际的业务需求选择合适的SQL SERVER版本,毕竟不同版本价格不一样; (1)操作系统评估,见下图: (2)处理器和内存的评估: Version Ram Processor 64Bit Enterprise/Business Intelligence/Standard/Developer/Web 最少1G,推荐4G以上 处理速度最低1.4G,推荐2.0G以上; 适合的架构AMD Opteron,AMD Athlon,IntelXeon with EM64T Support,或者Intel Pentium IV with EM64T Support; Express/Express with Tools/Express with Advanced Services 最少512MB,推荐1G以上 32Bit Enterprise/Business Intelligence/Standard/Developer/Web 最少1G,推荐4G以上 处理速度最低1.0G,推荐2.0G以上; 适合的架构Pentium-III以上 Express/Express with Tools/Express with Advanced Services 最少512MB,推荐1G以上 (3)硬盘评估,见下图: (4)应用程序评估: .NET 3.5 SP1-->在安装Database Engine/Reporting Services/Replication Master Data Services/Data Quality Services/SQL Server Management Studio这些组件必需的;需要手动安装 .NET 4.0-->SQL SERVER 安装程序会自动安装;EXPRESS版本的除外; Windows Powershell 2.0-->windows server会自带,但是sql server安装后使用此功能需要手动激活; IE7.0以上-->安装SQL Server data tools/Report Designer feature of Reporting Serives/HTML Help必需的; (5)虚拟化评估: 当基于Hyper-V的虚拟机以下两个版本的操作系统时时支持SQL SERVER 2012 Windows Server 2008 SP2(Standard/Entrerprise/Datacenter)以上 Windows Server 2008 R2 SP1(Standard/Entrerprise/Datacenter)以上 本文转自 bannerpei 51CTO博客,原文链接:http://blog.51cto.com/281816327/1322577,如需转载请自行联系原作者

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

Hadoop MapReduce编程 API入门系列之FOF(Fund of Fund)

代码 package zhouls.bigdata.myMapReduce.friend; import org.apache.hadoop.io.Text; public class Fof extends Text{//自定义Fof,表示f1和f2关系 public Fof(){//无参构造 super(); } public Fof(String a,String b){//有参构造 super(getFof(a, b)); } public static String getFof(String a,String b){ int r =a.compareTo(b); if(r<0){ return a+"\t"+b; }else{ return b+"\t"+a; } } } package zhouls.bigdata.myMapReduce.friend; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.WritableComparable; public class User implements WritableComparable<User>{ //WritableComparable,实现这个方法,要多很多 //readFields是读入,write是写出 private String uname; private int friendsCount; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public int getFriendsCount() { return friendsCount; } public void setFriendsCount(int friendsCount) { this.friendsCount = friendsCount; }//这一大段的get和set,可以右键,source,产生get和set,自动生成。 public User() {//无参构造 } public User(String uname,int friendsCount){//有参构造 this.uname=uname; this.friendsCount=friendsCount; } public void write(DataOutput out) throws IOException { //序列化 out.writeUTF(uname); out.writeInt(friendsCount); } public void readFields(DataInput in) throws IOException {//反序列化 this.uname=in.readUTF(); this.friendsCount=in.readInt(); } public int compareTo(User o) {//核心 int result = this.uname.compareTo(o.getUname()); if(result==0){ return Integer.compare(this.friendsCount, o.getFriendsCount()); } return result; } } package zhouls.bigdata.myMapReduce.friend; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.io.WritableComparator; public class FoFSort extends WritableComparator{ public FoFSort() {//把自定义的User,传进了 super(User.class,true); } public int compare(WritableComparable a, WritableComparable b) {//排序核心 User u1 =(User) a; User u2=(User) b; int result =u1.getUname().compareTo(u2.getUname()); if(result==0){ return -Integer.compare(u1.getFriendsCount(), u2.getFriendsCount()); } return result; } } package zhouls.bigdata.myMapReduce.friend; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.io.WritableComparator; public class FoFGroup extends WritableComparator{ public FoFGroup() {//把自定义的User,传进了 super(User.class,true); } public int compare(WritableComparable a, WritableComparable b) {//分组核心 User u1 =(User) a; User u2=(User) b; return u1.getUname().compareTo(u2.getUname()); } } package zhouls.bigdata.myMapReduce.friend; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.DoubleWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.StringUtils; public class RunJob { // 小明 老王 如花 林志玲 // 老王 小明 凤姐 排序在FoFSort.java // 如花 小明 李刚 凤姐 // 林志玲 小明 李刚 凤姐 郭美美 分组在FoFGroup.java // 李刚 如花 凤姐 林志玲 // 郭美美 凤姐 林志玲 // 凤姐 如花 老王 林志玲 郭美美 public static void main(String[] args) { Configuration config =new Configuration(); // config.set("fs.defaultFS", "hdfs://HadoopMaster:9000"); // config.set("yarn.resourcemanager.hostname", "HadoopMaster"); // config.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar"); // config.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ",");//默认分隔符是制表符"\t",这里自定义,如"," if(run1(config)){ run2(config);//设置两个run,即两个mr。 } } public static void run2(Configuration config) { try { FileSystem fs =FileSystem.get(config); Job job =Job.getInstance(config); job.setJarByClass(RunJob.class); job.setJobName("fof2"); job.setMapperClass(SortMapper.class); job.setReducerClass(SortReducer.class); job.setSortComparatorClass(FoFSort.class); job.setGroupingComparatorClass(FoFGroup.class); job.setMapOutputKeyClass(User.class); job.setMapOutputValueClass(User.class); job.setInputFormatClass(KeyValueTextInputFormat.class); // //设置MR执行的输入文件 // FileInputFormat.addInputPath(job, new Path("hdfs://HadoopMaster:9000/f1")); // // //该目录表示MR执行之后的结果数据所在目录,必须不能存在 // Path outputPath=new Path("hdfs://HadoopMaster:9000/out/f2"); //设置MR执行的输入文件 FileInputFormat.addInputPath(job, new Path("./out/f1")); //该目录表示MR执行之后的结果数据所在目录,必须不能存在 Path outputPath=new Path("./out/f2"); if(fs.exists(outputPath)){ fs.delete(outputPath, true); } FileOutputFormat.setOutputPath(job, outputPath); boolean f =job.waitForCompletion(true); if(f){ System.out.println("job 成功执行"); } } catch (Exception e) { e.printStackTrace(); } } public static boolean run1(Configuration config) { try { FileSystem fs =FileSystem.get(config); Job job =Job.getInstance(config); job.setJarByClass(RunJob.class); job.setJobName("friend"); job.setMapperClass(FofMapper.class); job.setReducerClass(FofReducer.class); job.setMapOutputKeyClass(Fof.class); job.setMapOutputValueClass(IntWritable.class); job.setInputFormatClass(KeyValueTextInputFormat.class); // FileInputFormat.addInputPath(job, new Path("hdfs://HadoopMaster:9000/friend/friend.txt"));//下有friend.txt // // Path outpath =new Path("hdfs://HadoopMaster:9000/out/f1"); FileInputFormat.addInputPath(job, new Path("./data/friend/friend.txt"));//下有friend.txt Path outpath =new Path("./out/f1"); if(fs.exists(outpath)){ fs.delete(outpath, true); } FileOutputFormat.setOutputPath(job, outpath); boolean f= job.waitForCompletion(true); return f; } catch (Exception e) { e.printStackTrace(); } return false; } static class FofMapper extends Mapper<Text, Text, Fof, IntWritable>{ protected void map(Text key, Text value, Context context) throws IOException, InterruptedException { String user =key.toString(); String[] friends =StringUtils.split(value.toString(), '\t'); for (int i = 0; i < friends.length; i++) { String f1 = friends[i]; Fof ofof =new Fof(user, f1); context.write(ofof, new IntWritable(0)); for (int j = i+1; j < friends.length; j++) { String f2 = friends[j]; Fof fof =new Fof(f1, f2); context.write(fof, new IntWritable(1)); } } } } static class FofReducer extends Reducer<Fof, IntWritable, Fof, IntWritable>{ protected void reduce(Fof arg0, Iterable<IntWritable> arg1, Context arg2) throws IOException, InterruptedException { int sum =0; boolean f =true; for(IntWritable i: arg1){ if(i.get()==0){ f=false; break; }else{ sum=sum+i.get(); } } if(f){ arg2.write(arg0, new IntWritable(sum)); } } } static class SortMapper extends Mapper<Text, Text, User, User>{ protected void map(Text key, Text value, Context context) throws IOException, InterruptedException { String[] args=StringUtils.split(value.toString(),'\t'); String other=args[0]; int friendsCount =Integer.parseInt(args[1]); context.write(new User(key.toString(),friendsCount), new User(other,friendsCount)); context.write(new User(other,friendsCount), new User(key.toString(),friendsCount)); } } static class SortReducer extends Reducer<User, User, Text, Text>{ protected void reduce(User arg0, Iterable<User> arg1, Context arg2) throws IOException, InterruptedException { String user =arg0.getUname(); StringBuffer sb =new StringBuffer(); for(User u: arg1 ){ sb.append(u.getUname()+":"+u.getFriendsCount()); sb.append(","); } arg2.write(new Text(user), new Text(sb.toString())); } } 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6166095.html,如需转载请自行联系原作者

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

Hadoop入门扫盲:hadoop发行版介绍与选择

一、hadoop发行版介绍 目前Hadoop发行版非常多,有Intel发行版,华为发行版、Cloudera发行版(CDH)、Hortonworks版本等,所有这些发行版均是基于Apache Hadoop衍生出来的,之所以有这么多的版本,是由于Apache Hadoop的开源协议决定的:任何人可以对其进行修改,并作为开源或商业产品发布/销售。 目前而言,不收费的Hadoop版本主要有三个,都是国外厂商,分别是: Apache(最原始的版本,所有发行版均基于这个版本进行改进) Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称CDH) Hortonworks版本(Hortonworks Data Platform,简称“HDP”) 对于国内用户而言,绝大多数选择CDH版本,Cloudera的CDH和Apache的Hadoop的区别如下: (1) CDH对Hadoop版本的划分非常清晰,截止目前为止,CDH共有5个版本,其中,前三个已经不再更新,最近的两个,分别是CDH4和CDH5,CDH4基于Hadoop2.0,CDH5基于hadoop2.2/2.3/2.5/2.6.相比而言,Apache版本则混乱得多;同时,CDH发行版比Apache hadoop在兼容性,安全性,稳定性上有很大增强。 (2)CDH3是CDH第三个版本,基于Apache hadoop0.20.2改进而来,并融入了最新的patch,CDH4版本是基于Apache hadoop2.0.0改进的,CDH总是并应用了最新Bug修复或者Feature的Patch,并比Apache hadoop同功能版本提早发布,更新速度比Apache官方快。 (3)CDH支持Kerberos安全认证,apache hadoop则使用简陋的用户名匹配认证. (4)CDH文档完善清晰,很多采用Apache版本的用户都会阅读CDH提供的文档,包括安装文档、升级文档等。 (5)CDH支持yum/apt包,RPM包,tar包,Cloudera Manager三种方式安装,Apache hadoop只支持Tar包安装。 二、CDH发行版本介绍 CDH首先是100%开源,基于Apache协议。基于Apache Hadoop和相关projiect开发。可以做批量处理,交互式sql查询和及时查询,基于角色的权限控制。在企业中使用最广的Hadoop分发版本。 Cloudera完善了CDH的版本,并提供了对hadoop的发布、配置和管理,监控,诊断工具,在官网提供了多种集成发行版。如下图所示: 1、单纯CDH版本下载,目前最新版本为CDH5.8.2,可自由下载并免费无限制使用。 2、Cloudera Express,可免费下载使用,包含了CDH,以及Cloudera Manager(简称CM),CM提供了对集群的管理功能,比如自动化部署,中心化管理,监控,诊断功能等。CM属于非开源产品,Cloudera提供有限功能使用,之前对管理的数据节点限制为50个,目前已经取消了此限制,可无限增加数据节点。 3、Cloudera Enterprise是官方的收费产品,可免费试用60天全功能版本,过期后需要注册码才能继续使用,否则将变为Cloudera Express版本,包含CDH,以及Cloudera Manager。Cloudera Enterprise在发布、配置和管理,监控,诊断,集成四个部分的功能是相同的。只有在高级管理功能中有区别,Cloudera Enterprise拥有这些功能,而Cloudera Express则没有。 三、CDH发行版下载地址 可到官方网站下载页面:http://www.cloudera.com/downloads.html, 也可以知道到下面地址下载不同版本: http://archive.cloudera.com/cdh/ http://archive.cloudera.com/cdh4/ http://archive.cloudera.com/cdh5/ 四、CDH与操作系统的依赖 CDH发行版本与操作系统的关系如下: 经验推荐: hadoop-2.3.0-cdh5.1.5以及之前的版本,推荐linux操作系统版本为Centos6.x以上 hadoop-2.5.0-cdh5.2.0以及之后的版本,推荐linux操作系统版本为Centos7.x(Centos7.1/7.2,7.0不支持)以上。 本文转自南非蚂蚁51CTO博客,原文链接:http://blog.51cto.com/ixdba/1869043,如需转载请自行联系原作者

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

Java新手入门的30个基本概念

Java 概述 : 目前 Java 主要应用于中间件的开发 (middleware)--- 处理客户机于服务器之间的通信技术 , 早期的实践证明 ,Java 不适合 pc 应用程序的开发 , 其发展逐渐变成在开发手持设备 , 互联网信息站 , 及车载计算机的开发 .Java 于其他语言所不同的是程序运行时提供了平台的独立性 , 称许可以在 windows,solaris,linux 其他操作系统上使用完全相同的代码 .Java 的语法与 C++ 语法类似 ,C++/C 程序员很容易掌握 , 而且 Java 是完全的彻底的面向对象的 , 其中提出了很好的 GC(Garbage Collector) 垃圾处理机制 , 防止内存溢出。 Java 的白皮书为我们提出了 Java 语言的 11 个关键特性。 (1)Easy:Java 的语法比 C++ 的相对简单 , 另一个方面就是 Java 能使软件在很小的机器上运行 , 基础解释其和类库的支持的大小约为 40kb, 增加基本的标准库和线程支持的内存需要增加 125kb 。 (2) 分布式 :Java 带有很强大的 TCP/IP 协议宓睦 ? 炭 ?Java 应用程序能够通过 URL 来穿过网络来访问远程对象 , 由于 servlet 机制的出现 , 使 Java 编程非常的高效 , 现在许多的大的 web server 都支持 servlet 。 (3)OO: 面向对象设计是把重点放在对象及对象的接口上的一个编程技术 . 其面向对象和 C++ 有很多不同 , 在与多重继承的处理及 Java 的原类模型。 (4) 健壮特性 :Java 采取了一个安全指针模型 , 能减小重写内存和数据崩溃的可能型。 (5) 安全 :Java 用来设计网路和分布系统 , 这带来了新的安全问题 ,Java 可以用来构建防病毒和防攻击的 System. 事实证明 Java 在防毒这一方面做的比较好。 (6) 中立体系结构 :Java 编译其生成体系结构中立的目标文件格式可以在很多处理器上执行 , 编译器产生的指令字节码 (Javabytecode) 实现此特性 , 此字节码可以在任何机器上解释执行。 (7) 可移植性 :Java 中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好。 (8) 多线程 :Java 处理多线程的过程很简单 ,Java 把多线程实现交给底下操作系统或线程程序完成 . 所以多线程是 Java 作为服务器端开发语言的流行原因之一。 (9)Applet 和 servlet: 能够在网页上执行的程序叫 Applet, 需要支持 Java 的浏览器很多 , 而 applet 支持动态的网页 , 这是很多其他语言所不能做到的。 基本概念 : 1.OOP 中唯一关系的是对象的接口是什么 , 就像计算机的销售商她不管电源内部结构是怎样的 , 他只关系能否给你提供电就行了 , 也就是只要知道 can or not 而不是 how and why. 所有的程序是由一定的属性和行为对象组成的 , 不同的对象的访问通过函数调用来完成 , 对象间所有的交流都是通过方法调用 , 通过对封装对象数据 , 很大限度上提高复用率。 2.OOP 中最重要的思想是类 , 类是模板是蓝图 , 从类中构造一个对象 , 即创建了这个类的一个实例 (instance) 。 3. 封装 : 就是把数据和行为结合起在一个包中 ) 并对对象使用者隐藏数据的实现过程 , 一个对象中的数据叫他的实例字段 (instance field) 。 4. 通过扩展一个类来获得一个新类叫继承 (inheritance), 而所有的类都是由 Object 根超类扩展而得 , 根超类下文会做介绍。 5. 对象的 3 个主要特性 behavior--- 说明这个对象能做什么 . state--- 当对象施加方法时对象的反映 . identity--- 与其他相似行为对象的区分标志 . 每个对象有唯一的 indentity 而这 3 者之间相互影响 . 6. 类之间的关系 : use-a : 依赖关系 has-a : 聚合关系 is-a : 继承关系 -- 例 :A 类继承了 B 类 , 此时 A 类不仅有了 B 类的方法 , 还有其自己的方法 .( 个性存在于共性中 ) 7. 构造对象使用构造器 : 构造器的提出 , 构造器是一种特殊的方法 , 构造对象并对其初始化。 例 :Data 类的构造器叫 Data new Data()--- 构造一个新对象 , 且初始化当前时间 . Data happyday=new Data()--- 把一个对象赋值给一个变量 happyday, 从而使该对象能够多次使用 , 此处要声明的使变量与对象变量二者是不同的 .new 返回的值是一个引用。 构造器特点 : 构造器可以有 0 个 , 一个或多个参数 构造器和类有相同的名字 一个类可以有多个构造器 构造器没有返回值 构造器总是和 new 运算符一起使用 . 8. 重载 : 当多个方法具有相同的名字而含有不同的参数时 , 便发生重载 . 编译器必须挑选出调用哪个方法。 9. 包 (package)Java 允许把一个或多个类收集在一起成为一组 , 称作包 , 以便于组织任务 , 标准 Java 库分为许多包 .java.lang java.util java,net 等 , 包是分层次的所有的 java 包都在 java 和 javax 包层次内。 10. 继承思想 : 允许在已经存在的类的基础上构建新的类 , 当你继承一个已经存在的类时 , 那么你就复用了这个类的方法和字段 , 同时你可以在新类中添加新的方法和字段。 11. 扩展类 : 扩展类充分体现了 is-a 的继承关系 . 形式为 :class ( 子类 ) extends ( 基类 ) 。 12. 多态 : 在 java 中 , 对象变量是多态的 . 而 java 中不支持多重继承 13. 动态绑定 : 调用对象方法的机制。 (1) 编译器检查对象声明的类型和方法名。 (2) 编译器检查方法调用的参数类型。 (3) 静态绑定 : 若方法类型为 priavte static final 编译器会准确知道该调用哪个方法。 (4) 当程序运行并且使用动态绑定来调用一个方法时 , 那么虚拟机必须调用 x 所指向的对象的实际类型相匹配的方法版本。 (5) 动态绑定 : 是很重要的特性 , 它能使程序变得可扩展而不需要重编译已存代码。 14.final 类 : 为防止他人从你的类上派生新类 , 此类是不可扩展的。 15. 动态调用比静态调用花费的时间要长。 16. 抽象类 : 规定一个或多个抽象方法的类本身必须定义为 abstract 。 例 : public abstract string getDescripition 17.Java 中的每一个类都是从 Object 类扩展而来的。 18.object 类中的 equal 和 toString 方法。 equal 用于测试一个对象是否同另一个对象相等。 toString 返回一个代表该对象的字符串 , 几乎每一个类都会重载该方法 , 以便返回当前状态的正确表示 . (toString 方法是一个很重要的方法 ) 19. 通用编程 : 任何类类型的所有值都可以同 object 类性的变量来代替。 20. 数组列表 :ArrayList 动态数组列表 , 是一个类库 , 定义在 java.uitl 包中 , 可自动调节数组的大小。 21.class 类 object 类中的 getclass 方法返回 ckass 类型的一个实例 , 程序启动时包含在 main 方法的类会被加载 , 虚拟机要加载他需要的所有类 , 每一个加载的类都要加载它需要的类。 22.class 类为编写可动态操纵 java 代码的程序提供了强大的功能反射 , 这项功能为 JavaBeans 特别有用 , 使用反射 Java 能支持 VB 程序员习惯使用的工具。 能够分析类能力的程序叫反射器 ,Java 中提供此功能的包叫 Java.lang.reflect 反射机制十分强大 . 1. 在运行时分析类的能力。 2. 在运行时探察类的对象。 3. 实现通用数组操纵代码。 4. 提供方法对象。 而此机制主要针对是工具者而不是应用及程序。 反射机制中的最重要的部分是允许你检查类的结构 . 用到的 API 有 : java.lang.reflect.Field 返回字段 . java.reflect.Method 返回方法 . java.lang.reflect.Constructor 返回参数 . 方法指针 :java 没有方法指针 , 把一个方法的地址传给另一个方法 , 可以在后面调用它 , 而接口是更好的解决方案。 23. 接口 (Interface) 说明类该做什么而不指定如何去做 , 一个类可以实现一个或多个 interface 。 24. 接口不是一个类 , 而是对符合接口要求的类的一套规范。 若实现一个接口需要 2 个步骤 : 1. 声明类需要实现的指定接口。 2. 提供接口中的所有方法的定义。 声明一个类实现一个接口需要使用 implements 关键字 class actionB implements Comparable 其 actionb 需要提供 CompareTo 方法 , 接口不是类 , 不能用 new 实例化一个接口 . 25. 一个类只有一个超类 , 但一个类能实现多个接口。 Java 中的一个重要接口: Cloneable 26. 接口和回调 . 编程一个常用的模式是回调模式 , 在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。 例 :ActionListener 接口监听 . 类似的 API 有 :java.swing.JOptionPane java.swing.Timer java.awt.Tookit 27. 对象 clone:clone 方法是 object 一个保护方法 , 这意味着你的代码不能简单的调用它。 28. 内部类 : 一个内部类的定义是定义在另一个内部的类。 原因是 : 1. 一个内部类的对象能够访问创建它的对象的实现 , 包括私有数据。 2. 对于同一个包中的其他类来说 , 内部类能够隐藏起来。 3. 匿名内部类可以很方便的定义回调。 4. 使用内部类可以非常方便的编写事件驱动程序。 29. 代理类 (proxy): 1. 指定接口要求所有代码 2.object 类定义的所有的方法 (toString equals) 30. 数据类型 :Java 是强调类型的语言 , 每个变量都必须先申明它都类型 ,java 中总共有 8 个基本类型 .4 种是整型 ,2 种是浮点型 , 一种是字符型 , 被用于 Unicode 编码中的字符 , 布尔型 博客网版权所有 本文转自starger51CTO博客,原文链接:http://blog.51cto.com/starger/17505 ,如需转载请自行联系原作者

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

Android JNI入门第一篇——HelloWord

publicclassPrintf_Jni{ static{ System.loadLibrary("com_nedu_jni_helloword_printf-jni"); } publicnativevoidprintHello(); } 第二步:使用javah命令生成.h头文件,如图: 这个要回到src目录下,不知道什么原因,如果在上面的javac路径下会报错,如图: 使用javah命令生成的头文件如下: /*DONOTEDITTHISFILE-itismachinegenerated*/ #include<jni.h> /*Headerforclasscom_nedu_jni_helloword_Printf_Jni*/ #ifndef_Included_com_nedu_jni_helloword_Printf_Jni #define_Included_com_nedu_jni_helloword_Printf_Jni #ifdef__cplusplus extern"C"{ #endif /* *Class:com_nedu_jni_helloword_Printf_Jni *Method:printHello *Signature:()V */ JNIEXPORTvoidJNICALLJava_com_nedu_jni_helloword_Printf_1Jni_printHello (JNIEnv*,jobject); #ifdef__cplusplus } #endif #endif 第三步:编写c文件,代码如下: #include<stdio.h> #include<stdlib.h> #include"com_nedu_jni_helloword_Printf_Jni.h" JNIEXPORTvoidJNICALLJava_com_nedu_jni_helloword_Printf_1Jni_printHello (JNIEnv*e,jobjectj) { printf("Helloworld!"); } 第四步,书写Android.mk文件,编译c文件 Android.mk文件如下: LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE:=com_nedu_jni_helloword_printf-jni LOCAL_SRC_FILES:=Printf_Jni.c include$(BUILD_SHARED_LIBRARY) System.loadLibrary("com_nedu_jni_helloword_printf-jni"); Printf_Jniprint=newPrintf_Jni(); print.printHello(); /**。 * @author 张兴业 * 邮箱:xy-zhang@163.com * qq:363302850 */ 通过下面的代码加载so文件通过下面的代码加载so文件 调用如下: LOCAL_MODULE := com_nedu_jni_helloword_printf-jniLOCAL_MODULE := com_nedu_jni_helloword_printf-jniLOCAL_MODULE表示so文件名 LOCAL_SRC_FILES 需要编译的文件 按照这篇文章(Get Your Eclipse-Integrated NDK On!)的介绍就可以在Eclipse编译了。 第五步:使用so文件: 通过下面的代码加载so文件 2、javac编译 进入java文件所在路径,调用javac命令,如图: android支持使用NDK开发C程序,关于配置NDK环境问题应该不用再赘述了,这个网上有很多,这里通过一篇实例来讲述简单的JNI开发,大家可以参考这篇文章(Get Your Eclipse-Integrated NDK On!)搭建Eclipse编译C语言为so文件的开发环境。 native方法实现步骤如下: 1、在Java中声明native()方法,然后编译(javac); 2、用javah产生一个.h文件; 3、编写包含.h文件的c文件 4、编译c文件 5、使用编译成功的so文件。 第一步: 1、声明native方法 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817227,如需转载请自行联系原作者

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

HBase编程 API入门系列之工具Bytes类(7)

这是从程度开发层面来说,为了方便和提高开发人员。 这个工具Bytes类,有很多很多方法,帮助我们HBase编程开发人员,提高开发。 这里,我只赘述,很常用的! 1 package zhouls.bigdata.HbaseProject.Tool; 2 3 import org.apache.hadoop.hbase.util.Bytes; 4 5 public class BytesTest { 6 public static void main(String[] args) { 7 byte b[] = Bytes.toBytes("maizi"); 8 byte a[] = Bytes.toBytes("hello"); 9 10 // 多个字节,拼装成一个row key 11 byte c[] =Bytes.add(a,b); 12 System.out.println(Bytes.toString(c)); 13 } 14 } hellomaizi 1 package zhouls.bigdata.HbaseProject.Tool; 2 3 import org.apache.hadoop.hbase.util.Bytes; 4 5 public class BytesTest { 6 public static void main(String[] args) { 7 byte b[] = Bytes.toBytes("maizi"); 8 byte a[] = Bytes.toBytes("hello"); 9 // 多个字节,拼装成一个row key 10 byte c[] =Bytes.add(a,b); 11 System.out.println(Bytes.toString(c)); 12 byte d[] = Bytes.head(c, 5); 13 System.out.println(Bytes.toString(d)); 14 } 15 } hellomaizihello 1 package zhouls.bigdata.HbaseProject.Tool; 2 3 import org.apache.hadoop.hbase.util.Bytes; 4 5 public class BytesTest { 6 public static void main(String[] args) { 7 byte b[] = Bytes.toBytes("maizi"); 8 byte a[] = Bytes.toBytes("hello"); 9 // 多个字节,拼装成一个row key 10 byte c[] =Bytes.add(a,b); 11 System.out.println(Bytes.toString(c)); 12 13 byte d[] = Bytes.head(c, 5); 14 System.out.println(Bytes.toString(d)); 15 16 byte e[] = Bytes.tail(c, 3); 17 System.out.println(Bytes.toString(e)); 18 } 19 } hellomaizihelloizi 这里,我只是做一个,抛砖引玉的作用,大家,一定要去看到我这篇博文,下去之后,多实践和研究Bytes这个工具类的其他方法。(一定!!!) 对于,HBase的编程,是非常必须,掌握和熟练的。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6159444.html,如需转载请自行联系原作者

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

Android入门第六篇之ListView (一)

ListView是一个经常用到的控件,ListView里面的每个子项Item可以使一个字符串,也可以是一个组合控件。先说说ListView的实现: 1.准备ListView要显示的数据; 2.使用一维或多维动态数组保存数据; 2.构建适配器,简单地来说,适配器就是Item数组,动态数组有多少元素就生成多少个Item; 3.把适配器添加到ListView,并显示出来。 接下来,看看本文代码所实现的ListView: 接下来,就开始UI的XML代码: main.xml代码如下,很简单,也不需要多做解释了: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <ListViewandroid:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MyListView"> </ListView> </LinearLayout> my_listitem.xml的代码如下,my_listitem.xml用于设计ListView的Item: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="wrap_content" android:id="@+id/MyListItem" android:paddingBottom="3dip" android:paddingLeft="10dip"> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/ItemTitle" android:textSize="30dip"> </TextView> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/ItemText"> </TextView> </LinearLayout> 解释一下,里面用到的一些属性: 1.paddingBottom="3dip",Layout往底部留出3个像素的空白区域 2.paddingLeft="10dip",Layout往左边留出10个像素的空白区域 3.textSize="30dip",TextView的字体为30个像素那么大。 最后就是JAVA的源代码: publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //绑定XML中的ListView,作为Item的容器 ListViewlist=(ListView)findViewById(R.id.MyListView); //生成动态数组,并且转载数据 ArrayList<HashMap<String,String>>mylist=newArrayList<HashMap<String,String>>(); for(inti=0;i<30;i++) { HashMap<String,String>map=newHashMap<String,String>(); map.put("ItemTitle","ThisisTitle....."); map.put("ItemText","Thisistext....."); mylist.add(map); } //生成适配器,数组===》ListItem SimpleAdaptermSchedule=newSimpleAdapter(this,//没什么解释 mylist,//数据来源 R.layout.my_listitem,//ListItem的XML实现 //动态数组与ListItem对应的子项 newString[]{"ItemTitle","ItemText"}, //ListItem的XML文件里面的两个TextViewID newint[]{R.id.ItemTitle,R.id.ItemText}); //添加并且显示 list.setAdapter(mSchedule); } 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/819844,如需转载请自行联系原作者

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

Android入门第四篇之TableLayout (一)

TableLayout跟TableLayout 是一组搭配使用的布局,TableLayout置底,TableRow在TableLayout的上面,而Button、TextView等控件就在TableRow之上,另外,TableLayout之上也可以单独放控件。TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但实际上,会经常在代码里使用TableLayout,例如做出表格的效果。本文主要介绍TableLayout的基本使用方法。 TableLayout经常用的属性是: android:collapseColumns:以第0行为序,隐藏指定的列: android:collapseColumns该属性为空时,如下图: 把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,如下图: android:shrinkColumns:以第0行为序,自动延伸指定的列填充可用部分: 当LayoutRow里面的控件还没有布满布局时,shrinkColumns不起作用,如下图: 设置了shrinkColumns=0,1,2,布局完全没有改变,因为LayoutRow里面还剩足够的空间。 当LayoutRow布满控件时,如下图: 设置设置了shrinkColumns=2,则结果如下图,控件自动向垂直方向填充空间: android:stretchColumns:以第0行为序,尽量把指定的列填充空白部分: 设置stretchColumns=1,则结果如下图,第1列被尽量填充(Button02与TextView02同时向右填充,直到TextView03被压挤到最后边)。 Android的TableLayout + TableRow虽然使用有点复杂,但是功能很强大。。。。。。Android提供了很多布局属性,但是手机程序的界面没有PC那么花俏,所以常用的就那几项而已。。。 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/819856,如需转载请自行联系原作者

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

Wintel物联网平台-Windows IoT新手入门指南

近期,微软跟进物联网的速度也在不断加速,除了微软手环,。NET MicroFramework,还有一个叫做Windows IoT的项目。该项目早在今年4月份的Build大会上就提出来了,7月份收集初期的开发者和用户。目前虽然还是处于Developer Program的状态,但是已经在软件和硬件上拿得出手了。关于Windows IoT的资源,主要可以参考下面几个链接: 1. Windows Developer Program for IoT 主页:http://dev.windows.com/en-us/featured/Windows-Developer-Program-for-IoT 2. GitHub主页:http://ms-iot.github.io/content/WhatsNew.htm 3. Building Apps for Windows主页:http://blogs.windows.com/buildingapps/ 目前,Windows IoT运行在英特尔Galileo 平台上。该平台已经发布了第一代和第二代开发板。第二代开发主板是基于英特尔Quark SoC X1000 应用处理器的微控制器板,它也是一个 32 位英特尔奔腾品牌的片上系统 (SoC)。它是第一款基于英特尔架构且设计为与用于 Arduino Uno R3的防护实现硬件和软件引脚兼容的板。此平台支持 Microsoft Windows、Mac OS 和 Linux 主机操作系统,因此让英特尔架构开发简单易行。它还简化了 Arduino 集成开发环境 (IDE) 软件。 关于Galileo平台,可以参考一下资源: 1. Galileo 第二代开发板主页: http://www.intel.cn/content/www/cn/zh/embedded/products/galileo/galileo-overview.html?_ga=1.201686033.105208985.1416798644 2. Galileo开发板主页:http://www.intel.cn/content/www/cn/zh/education/higher-education/galileo-development-board.html 2. 开发环境搭建 2.1 设置PC环境(参考链接为Link) 2.1.1 使用LiveID登陆Windows Developer Program for IoT,链接地址为Microsoft Connect. 2.1.2 然后下载Visual Studio插件:WindowsDeveloperProgramforIOT.msi,该插件位于Microsoft Connect上,必须登陆以后才能下载。然后安装。 安装结束以后,增加了一个Galileo Watcher软件,如下图: 2.1.3 启用Telnet客户端:具体位于控制面板->程序->启用或关闭Windows功能,选中Telnet客户端,如下图。 然后重启PC。 2.2 设置Intel Galileo 2.2.1 创建一个包含Windows IoT系统的MicroSD卡 硬件上,需要一个容量为16G或者更大的MicroSD卡,同时需要有USB接口的读卡器,方便和PC连接。 在Connect上下载apply-BootMedia.cmd文件,以及对应Galileo板子对应的系统镜像,要注意的是,一代伽利略和二代伽利略的镜像是不一样的,按需下载: Microsoft Windows Intel Galileo Gen 1 Microsoft Windows Intel Galileo Gen 2 然后就是把操作系统镜像写入SD了。首先,把microSD卡格式化为FAT32格式,使用管理管方式打开命令行, 在命令行中进入apply-BootMedia.cmd文件所在的路径,然后输入命令: cd /d %USERPROFILE%\Downloads apply-bootmedia.cmd -destination {YourSDCardDrive} -image {.wimFile downloaded above} -hostname mygalileo -password admin 以我的为例,具体命令如下: F:\Software\Develop\WindowsIoT>apply-bootmedia.cmd -destination I: -image 9600.16384.x86fre.winblue_rtm_iotbuild.140925-1000_galileo_v2.wim -hostname mygalileo-password admin 如果是在Windows 7下操作,还需要做如下链接的操作:Link 然后就开始写操作系统镜像,整个过程大约需要15分钟左右,需要耐心等待。命令行截屏信息如下: 注意,一定要等到“正在应用映像”结束以后才算是成功。 2.2.2 启动Galileo的Windows 首先,将SD卡插入到板子上,然后,给板子上电,同时,将PC的网口和板子的网口通过网线连接。如下图所示。 上电以后,板子的电源指示灯亮起。SD卡对应的LED灯闪烁。启动系统大概需要2分钟的时间。启动完毕以后,SD卡对应的LED灯就熄灭了。 然后,可以看到Galileo Watcher软件上出现板子的信息: 2.2.3 与Galileo进行TelNet通信 我们需要使用Telnet客户端与Galileo进行通信,从而判断其连接是否正常,同时,需要通过Telnet客户端来关闭Galileo。 在“运行”中,输入“telnet mygalileo”,如下图所示。 在弹出的验证窗口中输入如下用户名和密码信息: Username: Administrator Password: admin 当出现如上所示的信息以后,才表示PC与Galileo正确连接,下面就可以使用Visual Studio进行调试了,如果没有做这一步,那么是无法进行Visual Studio调试的。 2.2.4 关闭Galileo 在上述的telnet mygalileo命令行中,输入以下指令:shutdown /s /t 0。 当Galileo关闭以后,其microSD卡的指示灯会停止闪烁。注意,每次关闭电源之前最好使用指令关闭Galileo。因为不然的话,下一次启动时间会比较长,需要经过Check Disk的过程,和PC上一样。 3. Hello Blinky工程 打开Visual Studio,新建项目,选择File -> New Project and Select Templates -> Visual C++ -> Windows for IoT -> Galileo Wiring app。如下图所示。 其Main.cpp文件代码如下: // Main.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "arduino.h" int _tmain(int argc, _TCHAR* argv[]) { return RunArduinoSketch(); } int led = 13; // This is the pin the LED is attached to. void setup() { // TODO: Add your code here pinMode(led, OUTPUT); // Configure the pin for OUTPUT so you can turn on the LED. } // the loop routine runs over and over again forever: void loop() { // TODO: Add your code here digitalWrite(led, LOW); // turn the LED off by making the voltage LOW Log(L"LED OFF\n"); delay(1000); // wait for a second digitalWrite(led, HIGH); // turn the LED on by making the voltage HIGH Log(L"LED ON\n"); delay(1000); // wait for a second } 其代码结构如下: 4. 测试硬件准备 需要一个面包板,一个电阻,一个LED灯,两根导线,连接方式如下图所示: 5. 调试结果 编译以后,点击部署,在弹出的对话框中,输入 Username: mygalileo\Administrator Password: admin 如下图所示: 部署成功以后,可以看到LED灯闪烁。如下图所示。 参考链接: 1. Windows Developer Program for IoT 主页:http://dev.windows.com/en-us/featured/Windows-Developer-Program-for-IoT 2. GitHub主页:http://ms-iot.github.io/content/WhatsNew.htm 3. Building Apps for Windows主页:http://blogs.windows.com/buildingapps/ 4. Galileo 第二代开发板主页: http://www.intel.cn/content/www/cn/zh/embedded/products/galileo/galileo-overview.html?_ga=1.201686033.105208985.1416798644 5. Galileo开发板主页:http://www.intel.cn/content/www/cn/zh/education/higher-education/galileo-development-board.html 本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/dearsj001/p/WindowsIoT.html,如需转载请自行联系原作者

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

Hadoop入门进阶课程5--MapReduce原理及操作

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为http://www.cnblogs.com/shishanyuan。该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为https://www.shiyanlou.com/courses/237 【注】该系列所使用到安装包、测试数据和代码均可在百度网盘下载,具体地址为http://pan.baidu.com/s/10PnDs,下载该PDF文件 1、环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放Hadoop等组件运行包。因为该目录用于安装hadoop等组件程序,用户对shiyanlou必须赋予rwx权限(一般做法是root用户在根目录下创建/app目录,并修改该目录拥有者为shiyanlou(chown–R shiyanlou:shiyanlou /app)。 Hadoop搭建环境: l虚拟机操作系统:CentOS6.664位,单核,1G内存 lJDK:1.7.0_55 64位 lHadoop:1.1.2 2、MapReduce原理 2.1MapReduce简介 MapReduce是现今一个非常流行的分布式计算框架,它被设计用于并行计算海量数据。第一个提出该技术框架的是Google公司,而Google的灵感则来自于函数式编程语言,如LISP,Scheme,ML等。MapReduce框架的核心步骤主要分两部分:Map和Reduce。当你向MapReduce框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map任务,然后分配到不同的节点上去执行,每一个Map任务处理输入数据中的一部分,当Map任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce任务的输入数据。Reduce任务的主要目标就是把前面若干个Map的输出汇总到一起并输出。从高层抽象来看,MapReduce的数据流图如下图所示: 2.2MapReduce流程分析 2.2.1Map过程 1.每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认为64M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件; 2.在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combia操作,这样做的目的是让尽可能少的数据写入到磁盘; 3.当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combia操作,目的有两个: l尽量减少每次写入磁盘的数据量 l尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compress.map.out设置为true就可以了 4.将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就可以了。 2.2.2Reduce过程 1.Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据合并后溢写到磁盘中; 2.随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在map端还是reduce端,MapReduce都是反复地执行排序,合并操作; 3.合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。 2.3MapReduce工作机制剖析 1.在集群中的任意一个节点提交MapReduce程序; 2.JobClient收到作业后,JobClient向JobTracker请求获取一个Job ID; 3.将运行作业所需要的资源文件复制到HDFS上(包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息),这些文件都存放在JobTracker专门为该作业创建的文件夹中,文件夹名为该作业的Job ID; 4.获得作业ID后,提交作业; 5.JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行; 6.对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”; 7.TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户; 8.运行的TaskTracker从HDFS中获取运行所需要的资源,这些资源包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分等信息; 9.TaskTracker获取资源后启动新的JVM虚拟机; 10.运行每一个任务; 3、测试例子1 3.1测试例子1内容 下载气象数据集部分数据,写一个Map-Reduce作业,求每年的最低温度 3.2运行代码 3.2.1MinTemperature 1 import org.apache.hadoop.fs.Path; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.Text; 4 import org.apache.hadoop.mapreduce.Job; 5 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 6 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 7 8 public class MinTemperature { 9 10 public static void main(String[] args) throws Exception { 11 if(args.length != 2) { 12 System.err.println("Usage: MinTemperature<input path> <output path>"); 13 System.exit(-1); 14 } 15 16 Job job = new Job(); 17 job.setJarByClass(MinTemperature.class); 18 job.setJobName("Min temperature"); 19 FileInputFormat.addInputPath(job, new Path(args[0])); 20 FileOutputFormat.setOutputPath(job, new Path(args[1])); 21 job.setMapperClass(MinTemperatureMapper.class); 22 job.setReducerClass(MinTemperatureReducer.class); 23 job.setOutputKeyClass(Text.class); 24 job.setOutputValueClass(IntWritable.class); 25 System.exit(job.waitForCompletion(true) ? 0 : 1); 26 } 27 } 3.2.2MinTemperatureMapper 1 import java.io.IOException; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.LongWritable; 4 import org.apache.hadoop.io.Text; 5 import org.apache.hadoop.mapreduce.Mapper; 6 7 public class MinTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ 8 9 private static final int MISSING = 9999; 10 11 @Override 12 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 13 14 String line = value.toString(); 15 String year = line.substring(15, 19); 16 17 int airTemperature; 18 if(line.charAt(87) == '+') { 19 airTemperature = Integer.parseInt(line.substring(88, 92)); 20 } else { 21 airTemperature = Integer.parseInt(line.substring(87, 92)); 22 } 23 24 String quality = line.substring(92, 93); 25 if(airTemperature != MISSING && quality.matches("[01459]")) { 26 context.write(new Text(year), new IntWritable(airTemperature)); 27 } 28 } 29 } 3.2.3MinTemperatureReducer 1 import java.io.IOException; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.Text; 4 import org.apache.hadoop.mapreduce.Reducer; 5 6 public class MinTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 7 8 @Override 9 public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 10 11 int minValue = Integer.MAX_VALUE; 12 for(IntWritable value : values) { 13 minValue = Math.min(minValue, value.get()); 14 } 15 context.write(key, new IntWritable(minValue)); 16 } 17 } 3.3实现过程 3.3.1编写代码 进入/app/hadoop-1.1.2/myclass目录,在该目录中建立MinTemperature.java、MinTemperatureMapper.java和MinTemperatureReducer.java代码文件,执行命令如下: cd /app/hadoop-1.1.2/myclass/ vi MinTemperature.java vi MinTemperatureMapper.java vi MinTemperatureReducer.java MinTemperature.java: MinTemperatureMapper.java: MinTemperatureReducer.java: 3.3.2编译代码 在/app/hadoop-1.1.2/myclass目录中,使用如下命令对java代码进行编译,为保证编译成功,加入classpath变量,引入hadoop-core-1.1.2.jar包: javac -classpath ../hadoop-core-1.1.2.jar *.java 3.3.3打包编译文件 把编译好class文件打包,否则在执行过程会发生错误。把打好的包移动到上级目录并删除编译好的class文件: jar cvf ./MinTemperature.jar ./Min*.class mv *.jar .. rm Min*.class 3.3.4解压气象数据并上传到HDFS中 把NCDC气象数据解压,并使用zcat命令把这些数据文件解压并合并到一个temperature.txt文件中 cd /home/shiyanlou unzip temperature cd temperature zcat *.gz > temperature.txt 气象数据具体的下载地址为ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/,该数据包括1900年到现在所有年份的气象数据,大小大概有70多个G,为了测试简单,我们这里选取一部分的数据进行测试。合并后把这个文件上传到HDFS文件系统的/class5/in目录中: hadoop fs -mkdir -p /class5/in hadoop fs -copyFromLocal temperature.txt /class5/in hadoop fs -ls /class5/in 3.3.5运行程序 以jar的方式启动MapReduce任务,执行输出目录为/class5/out: cd /app/hadoop-1.1.2 hadoop jar MinTemperature.jar MinTemperature /class5/in/temperature.txt/class5/out 3.3.6查看结果 执行成功后,查看/class5/out目录中是否存在运行结果,使用cat查看结果(温度需要除以10): hadoop fs -ls /class5/out hadoop fs -cat /class5/out/part-r-00000 3.3.7通过页面结果(由于实验楼环境是命令行界面,以下仅为说明运行过程和结果可以通过界面进行查看) 1.查看jobtracker.jsp http://XX. XXX.XX.XXX:50030/jobtracker.jsp 查看已经完成的作业任务: 任务的详细信息: 2.查看dfshealth.jsp http://XX. XXX.XX.XXX:50070/dfshealth.jsp 分别查看HDFS文件系统和日志 4、测试例子2 4.1测试例子2内容 如果求温度的平均值,能使用combiner吗?有没有变通的方法? 4.2回答 不能直接使用,因为求平均值和前面求最值存在差异,各局部最值的最值还是等于整体的最值的,但是对于平均值而言,各局部平均值的平均值将不再是整体的平均值了,所以不能直接用combiner。可以通过变通的办法使用combiner来计算平均值,即在combiner的键值对中不直接存储最后的平均值,而是存储所有值的和个数,最后在reducer输出时再用和除以个数得到平均值。 4.3程序代码 4.3.1AvgTemperature.java 1 import org.apache.hadoop.fs.Path; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.Text; 4 import org.apache.hadoop.mapreduce.Job; 5 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 6 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 7 8 public class AvgTemperature { 9 10 public static void main(String[] args) throws Exception { 11 12 if(args.length != 2) { 13 System.out.println("Usage: AvgTemperatrue <input path><output path>"); 14 System.exit(-1); 15 } 16 17 Job job = new Job(); 18 job.setJarByClass(AvgTemperature.class); 19 job.setJobName("Avg Temperature"); 20 FileInputFormat.addInputPath(job, new Path(args[0])); 21 FileOutputFormat.setOutputPath(job, new Path(args[1])); 22 23 job.setMapperClass(AvgTemperatureMapper.class); 24 job.setCombinerClass(AvgTemperatureCombiner.class); 25 job.setReducerClass(AvgTemperatureReducer.class); 26 27 job.setMapOutputKeyClass(Text.class); 28 job.setMapOutputValueClass(Text.class); 29 30 job.setOutputKeyClass(Text.class); 31 job.setOutputValueClass(IntWritable.class); 32 33 System.exit(job.waitForCompletion(true) ? 0 : 1); 34 } 35 } 4.3.2AvgTemperatureMapper.java 1 import java.io.IOException; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.LongWritable; 4 import org.apache.hadoop.io.Text; 5 import org.apache.hadoop.mapreduce.Mapper; 6 7 public class AvgTemperatureMapper extends Mapper<LongWritable, Text, Text, Text> { 8 9 private static final int MISSING = 9999; 10 11 @Override 12 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ 13 14 String line = value.toString(); 15 String year = line.substring(15, 19); 16 17 int airTemperature; 18 if(line.charAt(87) == '+') { 19 airTemperature = Integer.parseInt(line.substring(88, 92)); 20 } else { 21 airTemperature = Integer.parseInt(line.substring(87, 92)); 22 } 23 24 String quality = line.substring(92, 93); 25 if(airTemperature != MISSING && !quality.matches("[01459]")) { 26 context.write(new Text(year), new Text(String.valueOf(airTemperature))); 27 } 28 } 29 } 4.3.3AvgTemperatureCombiner.java 1 import java.io.IOException; 2 import org.apache.hadoop.io.Text; 3 import org.apache.hadoop.mapreduce.Reducer; 4 5 public class AvgTemperatureCombiner extends Reducer<Text, Text, Text, Text>{ 6 7 @Override 8 public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 9 10 double sumValue = 0; 11 long numValue = 0; 12 13 for(Text value : values) { 14 sumValue += Double.parseDouble(value.toString()); 15 numValue ++; 16 } 17 18 context.write(key, new Text(String.valueOf(sumValue) + ',' + String.valueOf(numValue))); 19 } 20 } 4.3.4AvgTemperatureReducer.java 1 import java.io.IOException; 2 import org.apache.hadoop.io.IntWritable; 3 import org.apache.hadoop.io.Text; 4 import org.apache.hadoop.mapreduce.Reducer; 5 6 public class AvgTemperatureReducer extends Reducer<Text, Text, Text, IntWritable>{ 7 8 @Override 9 public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 10 11 double sumValue = 0; 12 long numValue = 0; 13 int avgValue = 0; 14 15 for(Text value : values) { 16 String[] valueAll = value.toString().split(","); 17 sumValue += Double.parseDouble(valueAll[0]); 18 numValue += Integer.parseInt(valueAll[1]); 19 } 20 21 avgValue = (int)(sumValue/numValue); 22 context.write(key, new IntWritable(avgValue)); 23 } 24 } 4.4实现过程 4.4.1编写代码 进入/app/hadoop-1.1.2/myclass目录,在该目录中建立AvgTemperature.java、AvgTemperatureMapper.java、AvgTemperatureCombiner.java和AvgTemperatureReducer.java代码文件,代码内容为4.3所示,执行命令如下: cd /app/hadoop-1.1.2/myclass/ vi AvgTemperature.java vi AvgTemperatureMapper.java vi AvgTemperatureCombiner.java vi AvgTemperatureReducer.java AvgTemperature.java: AvgTemperatureMapper.java: AvgTemperatureCombiner.java: AvgTemperatureReducer.java: 4.4.2编译代码 在/app/hadoop-1.1.2/myclass目录中,使用如下命令对java代码进行编译,为保证编译成功,加入classpath变量,引入hadoop-core-1.1.2.jar包: javac -classpath ../hadoop-core-1.1.2.jar Avg*.java 4.4.3打包编译文件 把编译好class文件打包,否则在执行过程会发生错误。把打好的包移动到上级目录并删除编译好的class文件: jar cvf ./AvgTemperature.jar ./Avg*.class ls mv *.jar .. rm Avg*.class 4.4.4运行程序 数据使用作业2求每年最低温度的气象数据,数据在HDFS位置为/class5/in/temperature.txt,以jar的方式启动MapReduce任务,执行输出目录为/class5/out2: cd /app/hadoop-1.1.2 hadoop jar AvgTemperature.jar AvgTemperature /class5/in/temperature.txt /class5/out2 4.4.5查看结果 执行成功后,查看/class5/out2目录中是否存在运行结果,使用cat查看结果(温度需要除以10): hadoop fs -ls /class5/out2 hadoop fs -cat /class5/out2/part-r-00000 本文转自shishanyuan博客园博客,原文链接: http://www.cnblogs.com/shishanyuan/p/4639519.html ,如需转载请自行联系原作者

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

Android入门第三篇之RelativeLayout、FrameLayout

接下来本文要讲的是RelativeLayout、FrameLayout。 RelativeLayout是一个按照相对位置排列的布局,跟AbsoluteLayout这个绝对坐标布局是个相反的理解。 在RelativeLayout布局里的控件包含丰富的排列属性: Layout above:选择ID A,则该控件在A控件的上方, Layout below、Layout to left of。。。。等同样用法。使用 RelativeLayout布局的时候,最好在界面设计时 做好布局,尽少程序运行时 做控件布局的更改,因为 RelativeLayout布局里面的属性之间,很容易冲突,例如, Layout below、 Layout above同选 ID A,那就肯定发生冲突了。 FrameLayout,顾名思义跟帧有关,布局里所有的控件都被放到布局的左上角,并且一层覆盖一层。 FrameLayout布局里面的控件布局属性才那几项,其中关键的是layout_gravity,负责控制控件的位置。 FrameLayout布局常用在哪些情况。。。。 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/819872,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

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

用户登录
用户注册