首页 文章 精选 留言 我的

精选列表

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

Hadoop学习(二)——HDFS简介

Hadoop提供了一个被称为HDFS的分布式文件系统的实现。HDFS是Hadoop系统的基础层,主要负责数据的存储、管理和容错处理,设计思想来源于Google的GFS(Google File System)文件系统。HDFS是一个运行在普通的硬件之上的分布式文件系统,它和现有的分布式文件系统有着很多的相似性,然而和其他分布式文件系统的区别也很明显:HDFS是高容错性的,可以部署在低成本的硬件之上;HDFS提供高吞吐量以应对应用程序数据访问,适合大数据集的应用程序;HDFS放开一些POSIX的需求去实现流式地访问文件数据;HDFS最初是为开源的Apache项目Nutch的基础结构而创建;HDFS是Hadoop项目的一部分。 HDFS的特点 HDFS认为硬件出现错误是经常发生的事情。HDFS部署在由廉价机器组成的集群中,整个集群中可能会有非常多的机器结点,结点的故障也是不可避免的,这种情况下,HDFS必须保证某些结点故障时,整个集群的工作不会受到影响。 HDFS支持超大规模的数据集。 HDFS采用“一次写入多次读取”的文件访问模型。HDFS简化了传统的文件访问模型,它假定当一个文件被创建、写入并关闭后就不会被修改了。 HDFS提供了类似于流式的数据访问模式。并不是标准的流式,而是将数据以较小的数据包的形式进行传输,提供数据方法的吞吐量。 HDFS提供了很强的容错处理能力。HDFS将大文件分割成很多文件块分开存储,并采用了完全备份的策略,每个文件块的副本数量最少是3个。 HDFS具有很强的系统扩展性。HDFS可以动态的向集群中添加或者从集群中撤出结点。 HDFS具有良好的平台移植性。由于HDFS是用Java语言开发的,所以它可以运行在Linux、Windows的等操作系统上,具有很好的可移植性。 HDFS文件系统架构 HDFS系统架构采用主从架构,整个集群由一个NameNode、一个SecondNameNode和若干个DataNode组成。NameNode是一个中心服务器,负责管理整个文件系统的命名空间元数据和客户端对文件的访问。SecondNameNode是NameNode的备份结点,定期对NameNode上的系统信息文件进行备份。一般情况下,一个结点运行一个DataNode,主要负责存储用户数据,并在NameNode的控制下进行数据的读写和出错处理。在HDFS内部,一个文件会被分隔成一个或多个Block,这些Block存储在DataNode上。

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

Hadoop学习笔记(四):HBase

HBase是在一个HDFS上开发的面向列的分布式数据库。HBase不是关系型数据库,不支持SQL。 HTable一些基本概念 Row key 行主键, HBase不支持条件查询和Order by等查询,读取记录只能按Row key(及其range)或全表扫描,因此Row key需要根据业务来设计以利用其存储排序特性(Table按Row key字典序排序如1,10,100,11,2)提高性能。 Column Family(列族) 在表创建时声明,每个Column Family为一个存储单元。在上例中设计了一个HBase表blog,该表有两个列族:article和author。 Column(列) HBase的每个列都属于一个列族,以列族名为前缀,如列article:title和article:content属于article列族,author:name和author:nickname属于author列族。Column不用创建表时定义即可以动态新增,同一Column Family的Columns会群聚在一个存储单元上,并依Column key排序,因此设计时应将具有相同I/O特性的Column设计在一个Column Family上以提高性能。 Timestamp HBase通过row和column确定一份数据,这份数据的值可能有多个版本,不同版本的值按照时间倒序排序,即最新的数据排在最前面,查询时默认返回最新版本。如上例中row key=1的author:nickname值有两个版本,分别为1317180070811对应的“一叶渡江”和1317180718830对应的“yedu”(对应到实际业务可以理解为在某时刻修改了nickname为yedu,但旧值仍然存在)。Timestamp默认为系统当前时间(精确到毫秒),也可以在写入数据时指定该值。 Value 每个值通过4个键唯一索引,tableName+RowKey+ColumnKey+Timestamp=>value,例如上例中{tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’,Timestamp=’ 1317180718830’}索引到的唯一值是“yedu”。 存储类型 TableName 是字符串RowKey 和 ColumnName 是二进制值(Java 类型 byte[])Timestamp 是一个 64 位整数(Java 类型 long)value 是一个字节数组(Java类型 byte[])。 SHELL操作 HBase提供了丰富的访问接口,其中HBase Shell是常用的便捷方式。 • HBase Shell • Java clietn API • Jython、Groovy DSL、Scala • REST • Thrift(Ruby、Python、Perl、C++…) • MapReduce • Hive/Pig 创建表> create 'test','data1','data2' Column Family是schema的一部分,而Column不是。这里的data1和data2是Column Family。 增加记录>put 'test','1','data1:name','luc'>put 'test','1','data1:age','24'>put 'test','1','data2:height','170cm'>put 'test','1','data2:weight','65kg'>put 'test','1','data1:nickname','vichao'Column完全动态扩展,每行可以有不同的Columns。(ps:好像有点胖啊,要减肥~~) 根据RowKey查询> get 'test','1' HTable按RowKey字典序(1,10,100,11,2)自动排序,每行包含任意数量的Columns,Columns按ColumnKey(data1:age,data1:name,data1:nickname,data2:height,data2:weight)自动排序。 更新操作 查询值: >get 'test','1','data1:nickname' 更新nickname为'vic': >put 'test','1','data1:nickname','vic' 查询更新后的结果:(返回的将是vic) > get ‘blog’,’1’,’data1:nickname’ 知识点回顾:查询默认返回最近的值。 查询nickname的多个(本示例为2个)版本值 > get 'test','1',{COLUMN => 'data1:nickname',VERSIONS => 2}知识点回顾:每个Column可以有任意数量的Values,按Timestamp倒序自动排序。 如何只查询到以前的旧版本呢,需要借助Timestamp >get 'test','1',{COLUMN=>'data1:nickname',TIMESTAMP=>1373707746997} 知识点回顾:TabelName+RowKey+Column+Timestamp=>Value 删除记录 delete只能删除一个column >delete 'test','1','data1:nickname' 删除RowKey的所有column用deleteall >deleteall 'test','1' 删除表练习完毕,把练习表删了吧,删除之前需要先disable>disable 'test'>drop 'test' JAVA API操作 javaAPI操作还是比较简单的,各种api类和api函数,直接上代码了 import java.io.IOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.conf.Configuration; public class ExampleClient { public static void main(String[] args) throws IOException { Configuration conf = HBaseConfiguration.create(); // Create table HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor htd = new HTableDescriptor("test"); HColumnDescriptor hcd = new HColumnDescriptor("data"); htd.addFamily(hcd); admin.createTable(htd); byte[] tablename = htd.getName(); HTableDescriptor[] tables = admin.listTables(); if (tables.length != 1 && Bytes.equals(tablename, tables[0].getName())) { throw new IOException("Failed create of table!"); } // Run some operations HTable table = new HTable(conf, tablename); byte[] row1 = Bytes.toBytes("row1"); Put p1 = new Put(row1); byte[] databytes = Bytes.toBytes("data"); p1.add(databytes, Bytes.toBytes("1"), Bytes.toBytes("value1")); table.put(p1); Get g = new Get(row1); Result result = table.get(g); System.out.println("GET:" + result); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); try { for (Result scannerResult : scanner) { System.out.println("Scan:" + scannerResult); } } catch (Exception e) { e.printStackTrace(); } finally { scanner.close(); } // Drop the table admin.disableTable(tablename); admin.deleteTable(tablename); } } 这里要注意的一点是连接到HBase需要将将HBase环境的hbase-site.xml文件引入到工程中,就像jdbc的数据库连接一样,不然是连不上hbase滴。 Configuration conf = HBaseConfiguration.create();//这行代码会从hbase-site.xml中读取配置信息 HBase MapReduce操作 直接上代码了: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.hbase.mapreduce.TableReducer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.mapreduce.Job; public class testHBaseMR { public static class Mapper extends TableMapper<ImmutableBytesWritable, ImmutableBytesWritable> { public Mapper() { } @Override public void map(ImmutableBytesWritable row, Result values, Context context) throws IOException { ImmutableBytesWritable value = null; String[] tags = null; for (KeyValue kv : values.list()) { if ("author".equals(Bytes.toString(kv.getFamily())) && "nickname".equals(Bytes.toString(kv.getQualifier()))) { value = new ImmutableBytesWritable(kv.getValue()); } if ("article".equals(Bytes.toString(kv.getFamily())) && "tags".equals(Bytes.toString(kv.getQualifier()))) { tags = Bytes.toString(kv.getValue()).split(","); } } for (int i = 0; i < tags.length; i++) { ImmutableBytesWritable key = new ImmutableBytesWritable( Bytes.toBytes(tags[i].toLowerCase())); try { context.write(key, value); } catch (InterruptedException e) { throw new IOException(e); } } } } public static class Reducer extends TableReducer<ImmutableBytesWritable, ImmutableBytesWritable, ImmutableBytesWritable> { @Override public void reduce(ImmutableBytesWritable key, Iterable values, Context context) throws IOException, InterruptedException { String friends = ""; for (ImmutableBytesWritable val : values) { friends += (friends.length() > 0 ? "," : "") + Bytes.toString(val.get()); } Put put = new Put(key.get()); put.add(Bytes.toBytes("person"), Bytes.toBytes("nicknames"), Bytes.toBytes(friends)); context.write(key, put); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf = HBaseConfiguration.create(conf); Job job = new Job(conf, "HBase_FindFriend"); job.setJarByClass(testHBaseMR.class); Scan scan = new Scan(); scan.addColumn(Bytes.toBytes("author"), Bytes.toBytes("nickname")); scan.addColumn(Bytes.toBytes("article"), Bytes.toBytes("tags")); TableMapReduceUtil .initTableMapperJob("blog", scan, Mapper.class, ImmutableBytesWritable.class, ImmutableBytesWritable.class, job); TableMapReduceUtil .initTableReducerJob("tag_friend", Reducer.class, job); System.exit(job.waitForCompletion(true) ? 0 : 1); } } TableMapReduceUtil.initTableMapperJob;TableMapReduceUtil.initTableReducerJob 用来指定map和reduce。相当于hbase的MR操作工具类吧~ 优化 针对行的键按数据排列的次序进行随机处理; 每个任务只实例化一个HTable对象; HTable.put(put)执行put操作时不使用任何缓冲。可以通过使用HTable.setAutoFlush(false),设置禁用自动刷入,并设置写缓冲大小,同时在任务的最后设置HTable.flushCommits()或者HTable.close(),以确保缓冲中最后没有剩下的未刷入的数据; 设计行键的时候要多加考虑,可以使用复合键,如果键是整数,则应该使用二进制形式以节省存储空间; HBase和RDBMS的比较 HBase: HBase是一个分布式的面向列的数据存储系统; HBase表可以很高和很宽(数十亿行,数百万列); 水平分区并在数千个商用机节点上自动复制; 表的模式是物理存储的直接反映; 不支持SQL; 不需要强一致性和参照完整性; 不支持索引;行是顺序存储的,每行中的列也是,不存在索引膨胀的问题,插入性能和表的大小无关 事务好像仅仅支持针对某一行的一系列Put/Delete操作。不同行、不同表间的操作是无法放在一个事务中的; HBase不支持条件查询和Order by等查询,读取记录只能按Row key(及其range)或全表扫描; 没有内置对连接操作的支持,但是由于表的宽度可以很大,一个宽行可以容下一个主键相关的所有数据,并不需要使用连接; RDBMS: 支持SQL; 需要强一致性和参照完整性; 支持事务,索引等; HBase的特性 没有索引,行是顺序存储的,每行中的列也是,不存在索引膨胀的问题,插入性能和表的大小无关; 自动分区,在表增长的时候,表会自动分裂成区域,并分布到可用的节点上; 线性扩展和对于新节点的自动处理,增加一个节点,把它指向现有的集群,并运行Regionserver,区域会自动重新进行平衡,负载会均匀分布; 普通商用硬件支持; 容错,大量节点意味着每个节点的重要性并不突出,不用担心单个节点失效; 批处理,支持MapReduce操作,可以用全并行的分布式作业来处理数据;

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

同时开启JAVA学习记录

大概翻了一下HADOOP的资料。 好像会点JAVA语法,更能深入了争MAP和REDUCE过程。 那只好再开启这个JAVA了。 印象中,大学时,上世纪九十年代,我就买过类似JAVA的书,但一直是当新奇玩意看,从未到现在这样触及IT心脏的了解过它。 去年,也简短的涉及过,由于没有应用目标,也是草草看过了事。 现在从浅到深,再慢慢来过中。 以网上PDF《JAVA基础教程-JAVA快车》为蓝本,先慢慢干起来。。

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

学习Hbase之quick start

1.2. Quick Start Loopback IP /etc/hosts should look something like this: vi /etc/hosts 127.0.0.1 localhost 127.0.0.1 ubuntu.ubuntu-domain ubuntu 1.2.1. Download and unpack the latest stable release.(下载和解压稳定版本) $ tar xfvz hbase-0.94.3-security.tar.gz $ cd hbase-0.94.3-security 安装之前,编辑 conf/hbase-site.xml.其中hbase.rootdir,是Hbase写数据的目录 其中hbase.zookeeper.property.dataDir,是ZooKeeper写数据的目录 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> hbase.rootdir /data/hbase hbase.zookeeper.property.dataDir /data/zookeeper 1.2.2. Start HBase [root@ZSDDB8 hbase-0.94.3-security]# ./bin/start-hbase.sh starting master, logging to /root/hbase-0.94.3-security/bin/../logs/hbase-root-master-ZSDDB8.out 这样就算开启了单实例的HBase Is java Installed?可以查看http://blog.chinaunix.net/space.php?uid=26446098&do=blog&id=3438622 java7安装方式1.2.3. Shell Exercises 通过shell连接HBASE [root@ZSDDB8 hbase-0.94.3-security]# ./bin/hbase shell HBase Shell; enter 'help' for list of supported commands. Type "exit" to leave the HBase Shell Version 0.94.3, r1408904, Wed Nov 14 16:41:36 UTC 2012 hbase(main):001:0> 创建一个表为test且一个列集合为cf。通过list 'test'验证它的创建然后插入一些数据 hbase(main):003:0> create 'test', 'cf' 0 row(s) in 1.2200 seconds hbase(main):002:0> list 'test' TABLE test 1 row(s) in 0.0170 seconds 1 row(s) in 0.0550 seconds hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1' 0 row(s) in 0.0560 seconds hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2' 0 row(s) in 0.0370 seconds hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3' 0 row(s) in 0.0450 seconds 通过执行scan 命令验证刚插入的数据 hbase(main):006:0> scan 'test' ROW COLUMN+CELL row1 column=cf:a, timestamp=1355386368983, value=value1 row2 column=cf:b, timestamp=1355386374028, value=value2 row3 column=cf:c, timestamp=1355386377745, value=value3 3 row(s) in 0.0600 seconds 得到一行的数据 hbase(main):007:0> get 'test', 'row1' COLUMN CELL cf:a timestamp=1355386368983, value=value1 1 row(s) in 0.0330 seconds 现在disable然后drop掉你的表,就可以清除上面你做的所有操作 hbase(main):008:0> disable 'test' 0 row(s) in 2.0730 seconds hbase(main):009:0> drop 'test' 0 row(s) in 0.1100 seconds 退出 hbase(main):013:0> exit 1.2.4. Stopping HBase 执行stop-hbase.sh关闭HBase $ ./bin/stop-hbase.sh [root@ZSDDB8 hbase-0.94.3-security]# ./bin/stop-hbase.sh stopping hbase........... 1.2.5.Where to go next The above described standalone setup is good for testing and experiments only. In the next chapter, Chapter2, Apache HBase (TM) Configuration, we'll go into depth on the different HBase run modes, system requirements running HBase, and critical configurations setting up a distributed HBase deploy.

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

人工智能进阶心得:在战斗中学习,在学习中战斗

摘要:12月20日的北京云栖大会上,由云栖社区主办的开发者技术进阶峰会再度开启(报名请戳这里,输入邀请码yqsqz3)。在此之前,我们整理了2017杭州云栖大会开发者技术进阶专场上的精彩分享内容,本文是新浪微博高级架构师谌贻荣的分享内容,他带来人工智能人才技术进阶的心得,他先确立了人工智能的发展思考维度层次,进而分析了想要进阶需要远见和明确自己的志向,重点对人工智能的未来进行畅想并提出知行合一的方法论。 以下是精彩视频内容整理: 层次 在人工智能上我们进步空间到底有多大?在内容广度上,会有DNN、CNN卷积网络、RNN循环神经网络、GAN和RL等;在深度上可以分为两大阶段,一是认知上的了解-理解,一是行动上的应用、改造和创造。越向上的人会越少,比如应用层的从业者就会少一些。 认知层即了解概念、理解原理,应用即将所学及时的付诸于实践,改造即

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

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

Sublime Text

Sublime Text

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

用户登录
用户注册