精华内容
下载资源
问答
  • HBase轻量级框架Parrot

    2014-05-27 17:40:24
    HBase轻量级框架Parrot   目录 一、Parrot什么? ...二、Parrot的数据源配置与连接 ...三、使用无状态的实体Bean执行CRUD;...四、Parrot所支持的原生HBase特性... 在弄清楚Parrot什么之前,你需要首先弄清楚HBase...

    HBase轻量级框架Parrot

     

    目录

    一、Parrot是什么?

    二、Parrot的数据源配置与连接

    三、使用无状态的实体Bean执行CRUD

    四、Parrot所支持的原生HBase特性;

    五、Parrot中被废弃的事物操作;

    六、Parrot的设计实现;

     

      一、Parrot是什么?

             在弄清楚Parrot是什么之前,你需要首先弄清楚HBase是什么,HBase能够适用于哪些场景?当这一切你都明白后,再开看看如何使用Parrot

             Parrot是鹦鹉的单词,或许源于家族遗传因素,本人对鸟类一直比较感冒,所以故用此名作为该项目的名字。Parrot是一种超轻量级的HBase框架,它对代码的侵入极低,且不依赖于任何容器,也就是说最简单的Java工程中也能够跑起来。就目前而言,市面上几乎没有成熟的HBase框架,那么Parrot诞生的目的已经很明确了,就是为了开发实惠!

             目前开发人员在程序中大部分都是直接使用HBase Client API操作HBase。笔者使用该工具在项目中倒腾了差不多有半年多的时间,不得不说,使用原生的HBase Client操作HBase确实是一件非常痛苦的事情,不仅开发耗时,且代码冗余度极高。所以我在HBase Client API的基础之上,轻量级的封装了一层,以达到极致简化的目的,这便是Parrot的重。Parrot目前的最新版本是1.1,后续版本中,Parrot将会继续迭代。

             Parrot的优点如下:

       降低原本90%的工作量,使你只需关注于业务;

       使用无状态的Entity Bean方式,对HBase进行CRUD操作;

       低侵入式设计,与业务耦合极低;

       支持从Diamond中进行数据源信息的配置和加载;

       数据检索的自动映射操作;

       支持HBase原生的TTableInterface接口;

     

    Parrot缺省依赖DiamondHBase Client API等相关构件!

     

    二、Parrot的数据源配置与连接

             Parrot不支持HBase缺省的基于配置文件的方式配置数据源信息,之所以这么做是因为在大规模的项目场景中,资源配置最好是集中式的,以此避免每一次的项目部署都需要修改集群节点中的配置文件,所以Parrot选用了淘宝的Diamond最为集中式配置中心。

    ParrotDiamond中的数据源配置信息(dataId=hbase_info,组名=DEFAULT_GROUP):

    rootdir=hdfs://CNSZ141222:30000/hbase

    distributed=true

    quorum=CNSZ141222,CNSZ141223,CNSZ141224

    maxSize=1000

            

    其中rootdir属性配置了HDFS的地址,distributed属性配置了HBase是否集群,quorum属性配置了ZK的与IP地址对应的机器名,最后一个属性maxSize则用于配置TablePool的连接数。

    当你第一次使用Parrot的时候,你需要现将上述信息配置在Diamond中。然后在程序中你只需通过如下语句,便可以建立与HBase的连接:

    publicclass ParrotTest {

      privatestatic ConnectionConfig conn;

      @BeforeClass

      publicstaticvoid testConnection() {

           conn = new ParrotConnectionConfig();

      }

    }

    }

     

    ConnectionConfig接口是Parrot的数据源接口,支持从Diamond集中式配置中心获取HBase的数据源信息并建立与HBase的会话连接。前面我们说过Parrot能够及时响应Diamond的变化,一旦Diamond中的配置信息发生变化,Parrot便会重新调用ConnectionConfig接口中的loadDataSource()方法,重新初始化数据源信息并关闭内部打开的TablePool连接。

     

    ConnectionConfig接口的常用方法如下:

       MetaDataTablegetTable():获取一个用于操作HBase元数据的Table对象.  

       ParrotTablegetTable(java.lang.Class entityClass):根据实体Bean中的信息从HBase中获取指定的Table对象;

       ParrotTemplategetTemplate():获取一个用于执行数据检索的ParrotTemplate对象;

       voidloadDataSource(com.taobao.diamond.manager.ManagerListener listener):从Diamond集中式配置中心获取出HBase的数据源信息;

     

    三、使用无状态的实体Bean执行CRUD

    使用无状态的实体Bean操作HBase,翻译白话点,就是使用对象的方式操作HBase。光从名字就能够听出来,既然使用了面向对象特性,那么操作HBase必然比使用原生的HBase Client API更简单,不过Parrot不仅支持实体Bean的方式对HBase执行CRUD操作,并且对于数据检索,Parrot还能够做到将检索的数据结果集,自动映射到实体Bean上。

     

    在使用实体Bean操作HBase之前,实体Bean必须添加@Entity注解,如下所示:

    @Entity(tableName = "my_table", cloumnFamily = { "info" })

     

    上述住接种,tableName属性指定了HBase的表名,cloumnFamily则指定了列族,很遗憾的是目前Parrot1.0的版本中,只能够暂时支持一个列族。不过这并不我们的使用,且按常理说,列族的数量越少,HBase的执行效率越快,这也是实时。

    定义实体Bean对象:

    @Entity(tableName = "my_table", cloumnFamily = { "info" })

    publicclass Bean1 {

         private String userName, passWord;

     

         public String getUserName() {

             returnuserName;

         }

     

         publicvoid setUserName(String userName) {

             this.userName = userName;

         }

     

         public String getPassWord() {

             returnpassWord;

         }

     

         publicvoid setPassWord(String passWord) {

             this.passWord = passWord;

         }

    }

     

    使用Parrot操作实体Bean对象执行CRUD操作:

    privatestatic ConnectionConfig conn;

         @BeforeClass

         publicstaticvoid testConnection() {

             conn = new ParrotConnectionConfig();

         }

     

         @Test

         publicvoid testInsert() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             Bean1 entityObj = new Bean1();

             entityObj.setUserName("JohnGao");

             entityObj.setPassWord("123456");

             table.insert(entityObj, "key1");

         }

     

         @Test

         publicvoid testInserts() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             Bean1 entityObj1 = new Bean1();

             entityObj1.setUserName("JohnGao1");

             entityObj1.setPassWord("123456");

             Bean1 entityObj2 = new Bean1();

             entityObj2.setUserName("JohnGao2");

             entityObj2.setPassWord("123456");

             List<Bean1> entityObjs = new ArrayList<Bean1>();

             entityObjs.add(entityObj1);

             entityObjs.add(entityObj2);

             List<String> rowKeys = new ArrayList<String>();

             rowKeys.add("key1");

             rowKeys.add("key2");

             table.insert(entityObjs, rowKeys);

         }

     

         @Test

         publicvoid testUpdate() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             Bean1 entityObj = new Bean1();

             entityObj.setUserName("JohnGao1");

             entityObj.setPassWord("1111111");

             table.update(entityObj, "key1");

         }

     

         @Test

         publicvoid testUpdates() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             Bean1 entityObj1 = new Bean1();

             entityObj1.setUserName("JohnGao1");

             entityObj1.setPassWord("2222222");

             Bean1 entityObj2 = new Bean1();

             entityObj2.setUserName("JohnGao2");

             entityObj2.setPassWord("33333333");

             List<Bean1> entityObjs = new ArrayList<Bean1>();

             entityObjs.add(entityObj1);

             entityObjs.add(entityObj2);

             List<String> rowKeys = new ArrayList<String>();

             rowKeys.add("key1");

             rowKeys.add("key2");

             table.update(entityObjs, rowKeys);

         }

     

         @Test

         publicvoid testDelete() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             table.delete("key1");

         }

     

         @Test

         publicvoid testDeletes() throws Exception {

             ParrotTable table = conn.getTable(Bean1.class);

             List<String> rowKeys = new ArrayList<String>();

             rowKeys.add("key1");

             rowKeys.add("key2");

             table.delete(rowKeys);

         }

     

         @Test

         publicvoid testGet1() throws Exception {

             ParrotTemplate template = conn.getTemplate();

             Bean1 bean = (Bean1) template.get(Bean1.class, "key1");

             System.out.println(bean.getUserName());

             System.out.println(bean.getPassWord());

         }

     

         @Test

         publicvoid testGet2() throws Exception {

             ParrotTemplate template = conn.getTemplate();

             List<String> rowKeys = new ArrayList<String>();

             rowKeys.add("key1");

             rowKeys.add("key2");

             List<Bean1> beans = (List<Bean1>) template.get(Bean1.class, rowKeys);

             for (Bean1 bean : beans) {

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

         }

     

         @Test

         publicvoid testGet3() throws Exception {

             ParrotTemplate template = conn.getTemplate();

             Object[] objs = template.get(Bean1.class,

                       new String[] { "key1", "key2" });

             for (Object obj : objs) {

                  Bean1 bean = (Bean1) obj;

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

         }

     

         @Test

         publicvoid testfind1() throws Exception {

             ParrotTemplate template = conn.getTemplate();

             List<Bean1> beans = template.find(Bean1.class, "key", null, null);

             for (Bean1 bean : beans) {

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

         }

     

         @Test

         publicvoid testfind2() throws Exception {

             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

             ParrotTemplate template = conn.getTemplate();

             List<Bean1> beans = template.find(Bean1.class, "key",

                       format.parse("2014-05-23 00:00:00").getTime(),

                       format.parse("2014-05-24 00:00:00").getTime());

             for (Bean1 bean : beans) {

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

         }

     

         @Test

         publicvoid testfind3() throws Exception {

             ParrotTemplate template = conn.getTemplate();

             List<Bean1> beans = template

                       .find(Bean1.class, "key", null, null, 0, 10);

             for (Bean1 bean : beans) {

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

         }

     

         @Test

         publicvoid testfind4() throws Exception {

             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

             ParrotTemplate template = conn.getTemplate();

             List<Bean1> beans = template.find(Bean1.class, "key",

                       format.parse("2014-05-22 00:00:00").getTime(),

                       format.parse("2014-05-23 00:00:00").getTime(), 0, 10);

             for (Bean1 bean : beans) {

                  System.out.println(bean.getUserName());

                  System.out.println(bean.getPassWord());

             }

    }

     

    上述程序中我们很好的使用了Parrot的对象特性对HBase进行了CRUD操作,那么ConnectionConfig中包含2getTable()方法,上述程序中使用getTable()方法成功的获取到了一个ParrotTable对象,该对象代表着可以用于操作HBase Table的一个表对象。

    如果需要执行查询,我们则可以使用ConnectionConfiggetTemplate()方法获取一个ParrotTemplate对象,不仅支持通过索引的get操作,也能够支持scan扫描的find方式。

    当我们使用完ParrotTable或者ParrotTemplate后,Parrot会自动管理其中的连接,无需开发人员手动进行资源的释放,并且使用ParrotTemplate执行数据检索的时候,结果集会自动被映射到实体Bean中返回,而无需开发人员手动进行赋值操作。

    除了对Table进行CRUD操作,我们还可以通过getTable()方法获取到MetaDateTable对象,该对象用于执行HBase中的元数据操作,比如表的创建和删除,使用方式如下所示:

    @Test

         publicvoid testDropTable() throws Exception {

             MetaDataTable table = conn.getTable();

             table.drop(Bean1.class);

         }

     

         @Test

         publicvoid testCreateTable() throws Exception {

             MetaDataTable table = conn.getTable();

             table.create(Bean1.class);

         }

     

         @Test

         publicvoid testCreateTables() throws Exception {

             MetaDataTable table = conn.getTable();

             List<Class> classes = new ArrayList<Class>();

             classes.add(Bean1.class);

             classes.add(Bean2.class);

             table.create(classes);

         }

     

         @Test

         publicvoid testDropTables() throws Exception {

             MetaDataTable table = conn.getTable();

             List<Class> classes = new ArrayList<Class>();

             classes.add(Bean1.class);

             classes.add(Bean2.class);

             table.drop(classes);

         }

     

    四、Parrot所支持的原生HBase特性

             Parrot不满足于我们的业务场景时怎么办?这个时候可以使用ConnectionConfig接口中提供的getHTableInterface()方法,该方法会返回一个HTableInterface对象,该对象就是HBase的原生Table对象,开发人员可以使用该对象完成HBaseCRUD操作,如下所示:

         @Test

         publicvoid testHTableInterface() throws Exception {

             /* HBase的原生操作 */

             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

             ParrotTable parrotTable = conn.getTable(Bean1.class);

             HTableInterface table = parrotTable.getHTableInterface();

             Scan can = new Scan();

             can.setStartRow(Bytes.toBytes("key"));

             can.setTimeRange(format.parse("2014-05-23 00:00:00").getTime(), format

                       .parse("2014-05-24 00:00:00").getTime());

             ResultScanner rts = table.getScanner(can);

             Result rt = null;

             while ((rt = rts.next()) != null) {

                  System.out.println(Bytes.toString(rt.getValue("info".getBytes(),

                           "userName".getBytes())));

                  System.out.println(Bytes.toString(rt.getValue("info".getBytes(),

                           "passWord".getBytes())));

             }

             parrotTable.setAutoFlush(table);

         }

     

        一旦你在程序中使用原生的HTableInterface,则默认不再受到Parrot的管理,所有的资源则需要自己释放,所有的赋值操作则需要自己手动完成,Parrot将不会再负责结果集映射。

     

    五、Parrot中被废弃的事物操作

         刚开始设计Parrot的时候,我的想象非常美好。那就是在Parrot中添加事物支持,哪怕是“伪事物”也可以。但这一切都是错误的开始。

        我们知道HBase0.94版本之前,可以说是根本没有提供事物这个操作的,但0.94版本之后却可以支持弱事物,所谓弱事物指的就是支持同一行中的多个putdelete操作,但跨行、跨表、跨Region则不行,那么我当时的思路是提供Annotation的方式实现事物的AOP横切管理,当有多个事物执行的时候,无论是否在同一个表或者同一个region中,我们只需要做到putdelete失败就回滚,回滚的操作比较复杂,put的话就对应deletedelete就对应put,这样一来就无需顾虑是否是跨行、跨表、跨Region了。

        想象是美好的,但现实的残酷是,delete失败后,执行回滚,我不仅要保存delete之前的数据状态,且回滚时,我如何保证数据正确落入到删除之前的region中?如何确保插入的时间戳与数据真实insert前是一致的?等等这些问题折腾了一天,所以彻底死心宣布Parrot废弃事物,目前只能等待后续HBase版本的更新支持是事物后,再说!

     

    六、Parrot的设计实现;

    没时间写了,以后再说,主要是没建模工具,懒得画图。

    展开全文
  • 鹦鹉 Parrot是Grpc和HTTP转换器网关,在Rust中有虾和蟹
  • 使用 Parrot 项目中的工具,用户可以自动生成 RIF 规则和 OWL 本体的参考文档。 PARROT 项目已移至 bitbucket https://bitbucket.org/fundacionctic/parrot
  • parrot 国内源

    2021-09-07 15:46:35
    parrot 4.10,4.11 国内源 parrot mirrors /etc/apt/sources.list.d/parrot.list China USTC 1Gbps CMCC 1Gbps Cernet 300Mbps ChinaNet University of Science and Technology of China and ...

    parrot 4.10,4.11 国内源

    parrot mirrors

    /etc/apt/sources.list.d/parrot.list

    China
    USTC
    1Gbps CMCC
    1Gbps Cernet
    300Mbps ChinaNet
    University of Science and Technology of China and USTCLUGmirrors.ustc.edu.cn/parrotdeb http://mirrors.ustc.edu.cn/parrot rolling main contrib non-free
    China
    TUNA
    2 Gbps
    TUNA (Tsinghua university of Beijing, TUNA association)mirrors.tuna.tsinghua.edu.cn/parrotdeb https://mirrors.tuna.tsinghua.edu.cn/parrot/ rolling main contrib non-free
    China
    SJTUG
    2 Gbps
    SJTUG (SJTU *NIX User Group)mirrors.sjtug.sjtu.edu.cn/parrotdeb https://mirrors.sjtug.sjtu.edu.cn/parrot/ rolling main contrib non-free

    sudo parrot-upgrade 

    展开全文
  • Parrot Leaf字体

    2019-10-23 07:41:41
    Parrot Leaf字体是一款用于漫画设计方面的字体
  • Parrot os 2.0

    2015-08-05 22:16:41
    parrot os 2.0 系统下载地址 分享给大家
  • parrot linux

    千次阅读 2017-01-10 12:46:54
    今儿看头条,发现系统管理员适合的linux是 parrot linux,这个好像没有听说过哦,查了一下,擦,界面和过去的红色龙太像了。mark下。

    今儿看头条,发现系统管理员适合的linux是 parrot linux,这个好像没有听说过哦,查了一下,擦,界面和过去的红色龙太像了。

    为啥要用这种linux呢?
    因为写这些东西的都是些geek,看看那些炫酷的界面,有利于创造一个比较好的ops氛围。
    mark下。

    展开全文
  • Biker Parrot

    2020-12-30 05:40:52
    <div><p>I'm open to suggestions if you hate this</p><p>该提问来源于开源项目:jmhobbs/cultofthepartyparrot.com</p></div>
  • Parrot-Status, Parrot Zik的状态项 鹦鹉状态Parrot Zik的状态项。http://www.parrot.com/zik下载要下载最新版本,请遵循以下链接。https://github.com/vincent-le-normand/Parrot-Status/r
  • Parrot虚拟机

    2012-04-11 22:14:00
    Parrot是一个虚拟机,旨在有效地编译和执行代码的动态语言。目前,它的主机的各种语言的实现在各个阶段的完成,包括Tcl,使用Javascript ,Ruby,Lua,Scheme, PHP中,Python,以及Perl 6 ,APL,和 .NET 等等超过...

    Parrot是一个虚拟机,旨在有效地编译和执行代码的动态语言。目前,它的主机的各种语言的实现在各个阶段的完成,包括Tcl,使用Javascript ,Ruby,Lua,Scheme, PHP中,Python,以及Perl 6 ,APL,和 .NET 等等超过几十种语言的代码翻译。

     

    摘自:http://www.oschina.net/p/parrot

    展开全文
  • 发现parrot Linux,所以就尝试一下这个与kali齐名的系统,好吧主要是够酷,一定程度上弥补了kali在加密上的不足
  • Wordpress Lonely Parrot模板
  • Parrot 国内源

    2017-06-21 12:24:56
    [资源] Parrot Security OS 国内源指令sudo leafpad /etc/apt/sources.list源deb http://mirrors.ustc.edu.cn/parrot/ parrot main contrib non-freedeb http://mirrors.tuna.tsinghua.edu.cn/parrot/ parrot mai...
  • parrot设置ip

    千次阅读 2018-06-19 09:52:49
    刚在虚拟机重装了parrot,突然发现没有网络于是,ifconfig,可以看到没有IP接下来输入sudo atom /etc/network/interfaces把IP地址这些填进去,重启一下sudo /etc/init.d/networking restart好了,已经解决了...
  • Parrot-TV-Kodi:Parrot TV Kodi插件的附加文件
  • parrot_demo-源码

    2021-03-30 16:47:28
    parrot_demo
  • parrot-tools-源码

    2021-03-27 14:14:51
    parrot-tools
  • parrot_project-源码

    2021-03-15 14:07:17
    parrot_project
  • terminal-parrot-源码

    2021-05-06 05:13:49
    :parrot: 为您的终端 正在安装 在上获取或者克隆并运行... $ go get -u github.com/jmhobbs/terminal-parrot $ terminal-parrot 自制酒 也有一个水龙头,它是jmhobbs/parrot brew tap jmhobbs/parrot brew install...
  • Android代码-Parrot

    2019-08-06 03:22:24
    Parrot A kotlin extension to load easily remote images in your ImageView. Install Add to gradle in allprojects maven { url 'https://jitpack.io' } then add this compile '...
  • Parrot Devtools-crx插件

    2021-04-01 21:22:01
    Parrot DevTools是开放源代码Parrot库的Chrome DevTools扩展。 它使您可以从Chrome开发者工具中选择活动的模拟HTTP方案。 访问Github存储库以获取更多信息https://github.com/americanexpress/parrot
  • Parrot-Messenger-源码

    2021-03-19 22:45:09
    Parrot Messenger是一个消息传递库,可以规范化不同消息传递传输的API。在当前的迭代中,它支持3种类型的传输类: 电子邮件 短信 称呼 电邮服务 AWS SES Mailchimp(Mandrill) Mailgun 森格 SMTP协议 短信服务 ...
  • Parrot_Conky

    2017-11-27 13:29:18
    ParrotSec的Conky,既然你想下载这个文件,那么你就知道ParrotSec的Conky是什么样子的,不知道什么鬼策略,莫名把下载积分提了这么高.。
  • parrot linux 使用

    千次阅读 2017-07-15 11:35:00
    之前一直使用kalilinux 最近想换parrot玩玩。 问题1:下载的镜像用dd写入U盘作为启动盘成功,但是instull到其他U盘是失败,在copy阶段。 后来在虚拟机安装此镜像还是失败。 查看发现镜像文件没有授权,直接chmod +x ...
  • parrotOS国内源

    千次阅读 2016-08-21 12:49:15
    /etc/apt/sources.list.d/parrot.list # parrot repository # this file was automatically generated by parrot-mirror-selector #deb http://free.nchc.org.tw/parrot/ parrot main #deb-src http://free.nch
  • 名称 README.pod-鹦鹉虚拟机 描述 Parrot是一种虚拟机,... “ docs / parrot.pod”列出了核心平台,“ PLATFORMS”提供了有关在其上构建和测试Parrot的平台的报告。 如何从GITHUB获取鹦鹉 I.安装Git。 Linux:该方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,475
精华内容 2,590
关键字:

parrot是什么