HBase初探

string hbaseCluster = "https://charju.azurehdinsight.net";
string hadoopUsername = "账户名字";
string hadoopPassword = "密码";

ClusterCredentials creds = new ClusterCredentials(new Uri(hbaseCluster), hadoopUsername, hadoopPassword);
var hbaseClient = new HBaseClient(creds);

// No response when GetVersion
var version = hbaseClient.GetVersion();

Console.WriteLine(Convert.ToString(version));

首先上代码,这个太特么的坑爹了!代码在winform中是无法运行滴!!!在命令行应用中是可以的!!!(浪费了老子好几天的时间……)

在winform中,通过windbg调试,发现在GetVersion的时候,主线程起了一个Task,然后等待Task的完成。在Task运行初期(大概1分钟内),会有另外一个线程,在WaitHandle,然后等一段时间,该线程消失。主线程中开始Retries调用,然后,就没有然后了……

Anyway,命令行中,代码是OK的。

我的例子,是利用新浪上的API来得到股票信息,比如说:http://hq.sinajs.cn/list=sz000977,sh600718,我每秒钟调用一次,然后这些数据刷到hbase里面去。

股票的实体类定义

public class StockEntity
    {
        public string Name { get; set; }
        public double TodayOpeningPrice { get; set; }
        public double YesterdayClosingPrice { get; set; }
        public double CurrentPrice { get; set; }
        public double TodayMaxPrice { get; set; }
        public double TodayMinPrice { get; set; }
        public double BidPriceBuy { get; set; }
        public double BidPriceSell { get; set; }
        public int FixtureNumber { get; set; }
        public double FixtureAmount { get; set; }
        public int Buy1Number { get; set; }
        public double Buy1Price { get; set; }
        public int Buy2Number { get; set; }
        public double Buy2Price { get; set; }
        public int Buy3Number { get; set; }
        public double Buy3Price { get; set; }
        public int Buy4Number { get; set; }
        public double Buy4Price { get; set; }
        public int Buy5Number { get; set; }
        public double Buy5Price { get; set; }
        public int Sell1Number { get; set; }
        public double Sell1Price { get; set; }
        public int Sell2Number { get; set; }
        public double Sell2Price { get; set; }
        public int Sell3Number { get; set; }
        public double Sell3Price { get; set; }
        public int Sell4Number { get; set; }
        public double Sell4Price { get; set; }
        public int Sell5Number { get; set; }
        public double Sell5Price { get; set; }

        public DateTime TransactionTime { get; set; }
    }

数据拉下来之后,新开一个线程,让它去写到hbase中。

ThreadPool.QueueUserWorkItem(new WaitCallback(SaveStockDataToHbase), se);

具体干活代码如下:

 1 private void SaveStockDataToHbase(object state)
 2         {
 3             StockEntity se = state as StockEntity;
 4
 5             // Insert data into the HBase table.
 6             string rowKey = Guid.NewGuid().ToString();
 7
 8             CellSet cellSet = new CellSet();
 9             CellSet.Row cellSetRow = new CellSet.Row { key = Encoding.UTF8.GetBytes(rowKey) };
10             cellSet.rows.Add(cellSetRow);
11
12
13             Type t = typeof(StockEntity);
14
15             foreach (string colname in stockEntityColumns)
16             {
17                 var pi = t.GetProperty(colname);
18                 object val = pi.GetValue(se);
19
20                 Cell value = new Cell { column = Encoding.UTF8.GetBytes("charju:" + colname), data = Encoding.UTF8.GetBytes(Convert.ToString(val)) };
21                 cellSetRow.values.Add(value);
22             }
23
24             try
25             {
26                 hbaseClient.StoreCells(hbaseStockTableName, cellSet);
27             }
28             catch (Exception ex)
29             {
30                 Console.WriteLine(ex.Message);
31             }
32         }

6~10行,是生成一个新Row。20行,是反射实体类的每一个Property 定义,来取对应的值(否则我要写一坨重复的代码)。21行,把对应的该列数据写到这个行上。

26行,就是真正的放到hbase中。

上面20行,你可能会注意到:charju,这是我的column family的名字。回过头来,看看hbase中的表是怎么建立的

string hbaseCluster = "https://charju.azurehdinsight.net";
string hadoopUsername = "<your name>";
string hadoopPassword = "<your password>";
string hbaseStockTableName = "StockInformation";
HBaseClient hbaseClient;

public void CreateHbaseTable()
{

            // Create a new HBase table. - StockInformation
            TableSchema stockTableSchema = new TableSchema();
            stockTableSchema.name = hbaseStockTableName;
            stockTableSchema.columns.Add(new ColumnSchema() { name = "charju" });
            hbaseClient.CreateTable(stockTableSchema);

}

而hbaseClient的实例化,是在这里:

ClusterCredentials creds = new ClusterCredentials(new Uri(hbaseCluster), hadoopUsername, hadoopPassword);
hbaseClient = new HBaseClient(creds);

数据写入后,我们可以有几个方式来。一是在hbase中配置一下,允许RDP,然后remote上去跑hbase shell命令,可惜我虚机里面RDP总失败,不知道为啥。第二种方式,就是用HIVE来查。

连接到hbase的网站后,在hive editor那个界面中,先创建对应的表

CREATE EXTERNAL TABLE StockInformation(rowkey STRING, TodayOpeningPrice STRING, YesterdayClosingPrice STRING, CurrentPrice STRING, TodayMaxPrice STRING, TodayMinPrice STRING, BidPriceBuy STRING, BidPriceSell STRING, FixtureNumber STRING, FixtureAmount STRING, Buy1Number STRING, Buy1Price STRING, Buy2Number STRING, Buy2Price STRING, Buy3Number STRING, Buy3Price STRING, Buy4Number STRING, Buy4Price STRING, Buy5Number STRING, Buy5Price STRING, Sell1Number STRING, Sell1Price STRING, Sell2Number STRING, Sell2Price STRING, Sell3Number STRING, Sell3Price STRING, Sell4Number STRING, Sell4Price STRING, Sell5Number STRING, Sell5Price STRING, TransactionTime STRING)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘
WITH SERDEPROPERTIES (‘hbase.columns.mapping‘ = ‘:key,charju:TodayOpeningPrice ,charju:YesterdayClosingPrice ,charju:CurrentPrice ,charju:TodayMaxPrice ,charju:TodayMinPrice ,charju:BidPriceBuy ,charju:BidPriceSell ,charju:FixtureNumber ,charju:FixtureAmount ,charju:Buy1Number ,charju:Buy1Price ,charju:Buy2Number ,charju:Buy2Price ,charju:Buy3Number ,charju:Buy3Price ,charju:Buy4Number ,charju:Buy4Price ,charju:Buy5Number ,charju:Buy5Price ,charju:Sell1Number ,charju:Sell1Price ,charju:Sell2Number ,charju:Sell2Price ,charju:Sell3Number ,charju:Sell3Price ,charju:Sell4Number ,charju:Sell4Price ,charju:Sell5Number ,charju:Sell5Price ,charju:TransactionTime‘)
TBLPROPERTIES (‘hbase.table.name‘ = ‘StockInformation‘);

创建成功后,然后就可以跑SQL了,比如说:

select * from StockInformation where buy1number=9800 order by transactiontime

今天小浪的最大一笔买入。当然,类似于select count(0) 之类的更OK了。

有用的连接:

https://azure.microsoft.com/en-us/documentation/articles/hdinsight-hbase-tutorial-get-started/

时间: 2024-10-17 00:43:09

HBase初探的相关文章

Hadoop实习操作练习1(Hive与HBase初探)

Chapter 1:     引言 近期电信集团公司举办了大数据技术培训课,按照要求,Hadoop小白的我对两者作完对比,进行实际操作做一个练习记录吧,嘿嘿... 两者的共同点: 1.hbase与hive都是架构在hadoop之上的.都是用hadoop作为底层存储 两者的区别: 2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 . 3.想象你在操作RMDB数据库,如果是全表扫描,就用Hive+

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

hue3.5.0使用初探(cdh版本)

之前一直用phpHiveAdmin,也一直在关注hue,最近打算调研一下hue,hue在最近两年发展很快,页面效果和功能上都有很大程度的提升,所支持的服务也越来越多,除了hive,hbase,目前还支持sqoop,impala,pig等. hue的一个大致架构如下图所示 核心服务是Hue Server,在本地使用SQLLite作为默认的DB,用户可以通过Hue UI(也就是通过浏览器)查看Hue的服务并使用相关的服务.Hue由python实现,通过thrift与所支持的各种服务进行交互. 目前集

Hadoop那些事儿(一)–Hadoop初探

前言 Hadoop是什么? 用百科上的话说:"Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储." 可能有些抽象,这个问题可以在一步步学习Hadoop的各种知识以后再回过头来重新看待. Hadoop大家族 Hadoop不是一个单一的项目,经过10年的发展,Hadoop已经成为了一个拥有近20个产品的庞大家族. 其中最核心的包括以下9个产品,并且我们将按照下面的顺序一步步学习.

Apache Drill初探

    Apache Drill初探 介绍 Apache Drill是一个开源的,对于Hadoop和NoSQL低延迟的SQL查询引擎. Apache Drill 实现了 Google's Dremel.那么什么是Google's Dremel?网络中一段描述:Dremel 是Google 的"交互式"数据分析系统.可以组建成规模上千的集群,处理PB级别的数据.MapReduce处理一个数据,需要分钟级的时间.作为MapReduce的发起人,Google开发了Dremel将处理时间缩短到

第一章 NoSQL初探

前言 已经很久没有写博客了,虽然这是提升各方面能力的一种非常好的方式.废话少说,希望能够坚持.还是希望能够完成一个系列的总结.大致内容如下 第一章  NoSQL初探 第二章  Redis  运用 第三章  Redis  集群 第四章  NoSQL+SQL ,非关系数据库结合关系型数据库运用 本文结构 (1)基本概念 (2)NoSQL解决的问题 (3)NoSQL现状 (4)NoSQL各种款式 一. 基本概念 NoSQL :最常见的解释是“No-Relational”,当然“Not Only SQL

NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题: (1)对数据库高并发读写的需求 网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求.关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求

Hadoop初探

本文转自:https://blog.csdn.net/column/details/14334.html 前言 Hadoop是什么? 用百科上的话说:"Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储." 可能有些抽象,这个问题可以在一步步学习Hadoop的各种知识以后再回过头来重新看待. Hadoop大家族 Hadoop不是一个单一的项目,经过10年的发展,Hadoop已经成

hbase过滤器(1)

最近在公司做hbase就打算复习下它的过滤器以便不时之需,RowFilter根据行键(rowkey)筛选数据 public void filter() throws IOException { Filter rf = new RowFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("35643b94-b396-4cdc-abd9-029ca495769d"))); Scan s = new S