返回大数据案例首页
《大数据课程实验案例:网站用户行为分析—-步骤三:Hive、MySQL、HBase数据互导》
开发团队:厦门大学数据库实验室 联系人:林子雨老师 ziyulin@xmu.edu.cn
版权声明:版权归厦门大学数据库实验室所有,请勿用于商业用途;未经授权,其他网站请勿转载

本教程介绍大数据课程实验案例“网站用户行为分析”的第三个步骤,Hive、MySQL、HBase数据互导。在实践本步骤之前,请先完成该实验案例的第一个步骤—— 本地数据集上传到数据仓库Hive ,和第二个步骤—— Hive数据分析 。这里假设你已经完成了前面的这两个步骤。

所需知识储备

数据仓库Hive概念与基本原理、关系数据库概念与基本原理、SQL语句、列族数据库HBase概念与基本原理

数据仓库Hive的基本操作、关系数据库MySQL的基本操作、Sqoop工具的使用方法、HBase API的Java编程、Eclipse开发工具使用方法

  • Hive预操作
  • 使用Sqoop将数据从Hive导入MySQL
  • 使用Sqoop将数据从MySQL导入HBase
  • 使用HBase Java API把数据从本地导入到HBase中
  • 一、准备工作

    本教程需要安装Hive、MySQL、HBase和Sqoop。在前面的第一个步骤中,我们在安装Hive的时候就已经一起安装了MySQL(因为我们采用MySQL来存储Hive的元数据),所以,现在你只需要再安装HBase和Sqoop。
    (1)请参考厦大数据库实验室博客 Ubuntu安装HBase及常用操作 ,完成HBase的安装。本教程把HBase安装在了“/usr/local/hbase”目录下,采用伪分布式配置,也就是HBase会使用HDFS来存储数据。
    (2)请参考厦大数据库实验室博客 Ubuntu安装Sqoop ,完成Sqoop的安装。本教程下载的是sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz,安装目录是“/usr/local/sqoop”。虽然这个sqoop是为hadoop2.0.4版本开发的,本教程Hadoop版本是2.7.1,但是,依然可以顺利使用。

    二、Hive预操作

    如果你还没有启动Hive,请首先启动Hive。
    请登录Linux系统(本教程统一采用hadoop用户名登录系统),然后,打开一个终端(可以按快捷键Ctrl+Alt+T)。
    本教程中,Hadoop的安装目录是“/usr/local/hadoop”,Hive的安装目录是“/usr/local/hive”。
    因为需要借助于MySQL保存Hive的元数据,所以,请首先启动MySQL数据库,请在终端中输入下面命令:

    service mysql start  //可以在Linux的任何目录下执行该命令
    

    由于Hive是基于Hadoop的数据仓库,使用HiveQL语言撰写的查询语句,最终都会被Hive自动解析成MapReduce任务由Hadoop去具体执行,因此,需要启动Hadoop,然后再启动Hive。

    请执行下面命令启动Hadoop(如果你已经启动了Hadoop就不用再次启动了):

    cd /usr/local/hadoop
    ./sbin/start-all.sh
    

    然后,执行jps命令看一下当前运行的进程:

    如果出现下面这些进程,说明Hadoop启动成功了。

    3765 NodeManager
    3639 ResourceManager
    3800 Jps
    3261 DataNode
    3134 NameNode
    3471 SecondaryNameNode
    

    下面,继续执行下面命令启动进入Hive:

    cd /usr/local/hive
    ./bin/hive   //启动Hive
    

    通过上述过程,我们就完成了MySQL、Hadoop和Hive三者的启动。
    启动成功以后,就进入了“hive>”命令提示符状态,可以输入类似SQL语句的HiveQL语句。

    然后,在“hive>”命令提示符状态下执行下面命令:

    1、创建临时表user_action

    hive> create table dblab.user_action(id STRING,uid STRING, item_id STRING, behavior_type STRING, item_category STRING, visit_date DATE, province STRING) COMMENT 'Welcome to XMU dblab! ' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
    

    这个命令执行完以后,Hive会自动在HDFS文件系统中创建对应的数据文件“/user/hive/warehouse/dblab.db/user_action”。
    我们可以新建一个终端,执行命令查看一下,确认这个数据文件在HDFS中确实被创建了,请在新建的终端中执行下面命令:

    cd /usr/local/hadoop
    ./bin/hdfs dfs -ls /user/hive/warehouse/dblab.db/user_action
    

    可以看到如下结果:

    -rwxr-xr-x   1 hadoop supergroup   15590786 2016-11-27 21:57 /user/hive/warehouse/dblab.db/user_action/000000_0
    

    这说明,这个数据文件在HDFS中确实被创建了。注意,这个HDFS中的数据文件,在我们后面的“使用HBase Java API把数据从本地导入到HBase中”操作中会使用到。
    2、将bigdata_user表中的数据插入到user_action(执行时间:10秒左右)
    在第二个步骤——Hive数据分析中,我们已经在Hive中的dblab数据库中创建了一个外部表bigdata_user。下面把dblab.bigdata_user数据插入到dblab.user_action表中,命令如下:

    hive> INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user;
    

    请执行下面命令查询上面的插入命令是否成功执行:

    hive>select * from user_action limit 10;
    

    三、使用Sqoop将数据从Hive导入MySQL

    1、启动Hadoop集群、MySQL服务
    前面我们已经启动了Hadoop集群和MySQL服务。这里请确认已经按照前面操作启动成功。

    2、将前面生成的临时表数据从Hive导入到 MySQL 中,包含如下四个步骤。
    (1)登录 MySQL
    请在Linux系统中新建一个终端,执行下面命令:

    mysql –u root –p 
    

    为了简化操作,本教程直接使用root用户登录MySQL数据库,但是,在实际应用中,建议在MySQL中再另外创建一个用户。
    执行上面命令以后,就进入了“mysql>”命令提示符状态。
    (2)创建数据库

    mysql> show databases; #显示所有数据库
    mysql> create database dblab; #创建dblab数据库
    mysql> use dblab; #使用数据库
    

    注意:请使用下面命令查看数据库的编码:

    mysql>show variables like "char%";
    

    会显示类似下面的结果:

    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    

    请确认当前编码为utf8,否则无法导入中文,请参考Ubuntu安装MySQL及常用操作修改编码。
    下面是笔者电脑上修改了编码格式后的结果:

    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    

    (3)创建表
    下面在MySQL的数据库dblab中创建一个新表user_action,并设置其编码为utf-8:

    mysql> CREATE TABLE `dblab`.`user_action` (`id` varchar(50),`uid` varchar(50),`item_id` varchar(50),`behavior_type` varchar(10),`item_category` varchar(50), `visit_date` DATE,`province` varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    提示:语句中的引号是反引号`,不是单引号’。
    创建成功后,输入下面命令退出MySQL:

    mysql> exit
    

    (4)导入数据(执行时间:20秒左右)
    注意,刚才已经退出MySQL,回到了Shell命令提示符状态。下面就可以执行数据导入操作,

    cd /usr/local/sqoop
    ./bin/sqoop export --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --export-dir '/user/hive/warehouse/dblab.db/user_action' --fields-terminated-by '\t'; #导入命令
    

    字段解释:

    ./bin/sqoop export  ##表示数据从 hive 复制到 mysql 中
    --connect jdbc:mysql://localhost:3306/dblab 
    --username root  #mysql登陆用户名
    --password hadoop  #登录密码
    --table user_action  #mysql 中的表,即将被导入的表名称  
    --export-dir '/user/hive/warehouse/dblab.db/user_action '  #hive 中被导出的文件 
    --fields-terminated-by '\t'   #Hive 中被导出的文件字段的分隔符
    
    16/11/28 09:18:12 INFO mapreduce.Job: Job job_local1006738657_0001 completed successfully
    16/11/28 09:18:12 INFO mapreduce.Job: Counters: 20
        File System Counters
            FILE: Number of bytes read=72216458
            FILE: Number of bytes written=73973600
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=38989562
            HDFS: Number of bytes written=0
            HDFS: Number of read operations=78
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=0
        Map-Reduce Framework
            Map input records=300000
            Map output records=300000
            Input split bytes=696
            Spilled Records=0
            Failed Shuffles=0
            Merged Map outputs=0
            GC time elapsed (ms)=145
            Total committed heap usage (bytes)=511180800
        File Input Format Counters 
            Bytes Read=0
        File Output Format Counters 
            Bytes Written=0
    16/11/28 09:18:12 INFO mapreduce.ExportJobBase: Transferred 37.1833 MB in 29.2772 seconds (1.27 MB/sec)
    16/11/28 09:18:12 INFO mapreduce.ExportJobBase: Exported 300000 records.
    

    3、查看MySQL中user_action表数据
    下面需要再次启动MySQL,进入“mysql>”命令提示符状态:

    mysql -u root -p
    

    会提示你输入MySQL的root用户的密码,本教程中安装的MySQL数据库的root用户的密码是hadoop。
    然后执行下面命令查询user_action表中的数据:

    mysql> use dblab;
    mysql> select * from user_action limit 10;
    

    会得到类似下面的查询结果:

    +--------+-----------+-----------+---------------+---------------+------------+-----------+
    | id     | uid       | item_id   | behavior_type | item_category | visit_date | province  |
    +--------+-----------+-----------+---------------+---------------+------------+-----------+
    | 225653 | 102865660 | 164310319 | 1             | 5027          | 2014-12-08 | 香港      |
    | 225654 | 102865660 | 72511722  | 1             | 1121          | 2014-12-13 | 天津市    |
    | 225655 | 102865660 | 334372932 | 1             | 5027          | 2014-11-30 | 江苏      |
    | 225656 | 102865660 | 323237439 | 1             | 5027          | 2014-12-02 | 广东      |
    | 225657 | 102865660 | 323237439 | 1             | 5027          | 2014-12-07 | 山西      |
    | 225658 | 102865660 | 34102362  | 1             | 1863          | 2014-12-13 | 内蒙古    |
    | 225659 | 102865660 | 373499226 | 1             | 12388         | 2014-11-26 | 湖北      |
    | 225660 | 102865660 | 271583890 | 1             | 5027          | 2014-12-06 | 山西      |
    | 225661 | 102865660 | 384764083 | 1             | 5399          | 2014-11-26 | 澳门      |
    | 225662 | 102865660 | 139671483 | 1             | 5027          | 2014-12-03 | 广东      |
    +--------+-----------+-----------+---------------+---------------+------------+-----------+
    10 rows in set (0.00 sec)
    

    从Hive导入数据到MySQL中,成功!

    四、使用Sqoop将数据从MySQL导入HBase

    1、启动Hadoop集群、MySQL服务、HBase服务
    之前我们已经启动了Hadoop集群、MySQL服务,这里请确认已经按照前面操作启动成功。这里我们再启动HBase服务。本教程中,HBase的安装目录是“/usr/local/hbase”,而且本教程中,HBase配置为使用HDFS存储数据。
    请新建一个终端,执行下面命令:

    cd /usr/local/hbase
    ./bin/start-hbase.sh
    

    2、启动HBase shell

    cd /usr/local/hbase
    ./bin/hbase shell
    

    启动成功后,就进入了“hbase>”命令提示符状态。
    3、创建表user_action

    hbase> create 'user_action', { NAME => 'f1', VERSIONS => 5}
    

    上面命令在HBase中创建了一个user_action表,这个表中有一个列族f1(你愿意把列族名称取为其他名称也可以,比如列族名称为userinfo),历史版本保留数量为5。
    4、导入数据(执行时间:30秒左右)
    下面新建一个终端,执行下面命令导入数据:

    cd /usr/local/sqoop
    ./bin/sqoop  import  --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --hbase-table user_action --column-family f1 --hbase-row-key id --hbase-create-table -m 1
    

    注意:IP部分改为本机IP地址或localhost。同时,HBase只支持十六进制存储中文。
    命令解释如下:

    ./bin/sqoop  import  --connect  jdbc:mysql://localhost:3306/dblab
    --username  root
    --password  hadoop 
    --table user_action
    --hbase-table user_action #HBase中表名称
    --column-family f1 #列簇名称
    --hbase-row-key id #HBase 行键
    --hbase-create-table #是否在不存在情况下创建表
    -m 1 #启动 Map 数量
    

    执行上面的sqoop import命令以后,会得到类似下面的结果(省略了很多非重要的屏幕信息):

    16/11/28 10:03:40 INFO mapreduce.Job: Counters: 20
        File System Counters
            FILE: Number of bytes read=39428226
            FILE: Number of bytes written=40095167
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=0
            HDFS: Number of bytes written=0
            HDFS: Number of read operations=0
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=0
        Map-Reduce Framework
            Map input records=300000
            Map output records=300000
            Input split bytes=87
            Spilled Records=0
            Failed Shuffles=0
            Merged Map outputs=0
            GC time elapsed (ms)=1018
            Total committed heap usage (bytes)=127795200
        File Input Format Counters 
            Bytes Read=0
        File Output Format Counters 
            Bytes Written=0
    16/11/28 10:03:40 INFO mapreduce.ImportJobBase: Transferred 0 bytes in 69.7527 seconds (0 bytes/sec)
    16/11/28 10:03:40 INFO mapreduce.ImportJobBase: Retrieved 300000 records.
    

    5、查看HBase中user_action表数据
    现在,再次切换到HBase Shell运行的那个终端窗口,在“hbase>”命令提示符下,执行下面命令查询刚才导入的数据:

    habse> scan 'user_action',{LIMIT=>10}  #只查询前面10行
    

    因为有30万条记录,所以,我们用LIMIT只查询前10行的记录,会得到类似下面的结果:

     1                                     column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     1                                     column=f1:item_category, timestamp=1480298573684, value=4076                                                  
     1                                     column=f1:item_id, timestamp=1480298573684, value=285259775                                                   
     1                                     column=f1:province, timestamp=1480298573684, value=\xE5\xB9\xBF\xE4\xB8\x9C                                   
     1                                     column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     1                                     column=f1:visit_date, timestamp=1480298573684, value=2014-12-08                                               
     10                                    column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     10                                    column=f1:item_category, timestamp=1480298573684, value=10894                                                 
     10                                    column=f1:item_id, timestamp=1480298573684, value=323339743                                                   
     10                                    column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE4\xB8\x9C                                   
     10                                    column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     10                                    column=f1:visit_date, timestamp=1480298573684, value=2014-12-12                                               
     100                                   column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     100                                   column=f1:item_category, timestamp=1480298573684, value=10576                                                 
     100                                   column=f1:item_id, timestamp=1480298573684, value=275221686                                                   
     100                                   column=f1:province, timestamp=1480298573684, value=\xE6\xB9\x96\xE5\x8C\x97                                   
     100                                   column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     100                                   column=f1:visit_date, timestamp=1480298573684, value=2014-12-02                                               
     1000                                  column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     1000                                  column=f1:item_category, timestamp=1480298573684, value=3381                                                  
     1000                                  column=f1:item_id, timestamp=1480298573684, value=168463559                                                   
     1000                                  column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE8\xA5\xBF                                   
     1000                                  column=f1:uid, timestamp=1480298573684, value=100068031                                                       
     1000                                  column=f1:visit_date, timestamp=1480298573684, value=2014-12-02                                               
     10000                                 column=f1:behavior_type, timestamp=1480298575888, value=1                                                     
     10000                                 column=f1:item_category, timestamp=1480298575888, value=12488                                                 
     10000                                 column=f1:item_id, timestamp=1480298575888, value=45571867                                                    
     10000                                 column=f1:province, timestamp=1480298575888, value=\xE6\xB9\x96\xE5\x8C\x97                                   
     10000                                 column=f1:uid, timestamp=1480298575888, value=100198255                                                       
     10000                                 column=f1:visit_date, timestamp=1480298575888, value=2014-12-05                                               
     100000                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100000                                column=f1:item_category, timestamp=1480298594850, value=6580                                                  
     100000                                column=f1:item_id, timestamp=1480298594850, value=78973192                                                    
     100000                                column=f1:province, timestamp=1480298594850, value=\xE5\xB1\xB1\xE4\xB8\x9C                                   
     100000                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100000                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-29                                               
     100001                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100001                                column=f1:item_category, timestamp=1480298594850, value=3472                                                  
     100001                                column=f1:item_id, timestamp=1480298594850, value=34929314                                                    
     100001                                column=f1:province, timestamp=1480298594850, value=\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82                       
     100001                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100001                                column=f1:visit_date, timestamp=1480298594850, value=2014-12-15  
     100002                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100002                                column=f1:item_category, timestamp=1480298594850, value=10392                                                 
     100002                                column=f1:item_id, timestamp=1480298594850, value=401104894                                                   
     100002                                column=f1:province, timestamp=1480298594850, value=\xE6\xB1\x9F\xE8\xA5\xBF                                   
     100002                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100002                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-29                                               
     100003                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100003                                column=f1:item_category, timestamp=1480298594850, value=5894                                                  
     100003                                column=f1:item_id, timestamp=1480298594850, value=217913901                                                   
     100003                                column=f1:province, timestamp=1480298594850, value=\xE9\xBB\x91\xE9\xBE\x99\xE6\xB1\x9F                       
     100003                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100003                                column=f1:visit_date, timestamp=1480298594850, value=2014-12-04                                               
     100004                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100004                                column=f1:item_category, timestamp=1480298594850, value=12189                                                 
     100004                                column=f1:item_id, timestamp=1480298594850, value=295053167                                                   
     100004                                column=f1:province, timestamp=1480298594850, value=\xE6\xB5\xB7\xE5\x8D\x97                                   
     100004                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100004                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-26                                               
    10 row(s) in 2.1550 seconds
    

    注意,我们用limit10是返回HBase表中的前面10行数据,但是,上面的结果,从“行数”来看,给人一种错误,似乎不是10行,要远远多于10行。这是因为,HBase在显示数据的时候,和关系型数据库MySQL是不同的,每行显示的不是一行记录,而是一个“单元格”(如果无法理解,请参考厦大数据库实验室录制的在线课程视频《分布式数据库HBase》)。

    五、使用HBase Java API把数据从本地导入到HBase中

    1、启动Hadoop集群、HBase服务
    请首先确保启动了Hadoop集群和HBase服务。如果还没有启动,请在Linux系统中打开一个终端。
    首先,按照下面命令启动Hadoop:

    cd /usr/local/hadoop
    ./sbin/start-all.sh
    

    然后,按照下面命令启动HBase:

    cd /usr/local/hbase
    ./bin/start-hbase.sh
    

    2、数据准备
    实际上,我们也可以编写Java程序,直接从HDFS中读取数据加载到HBase。但是,这里我们展示的是如何用JAVA程序把本地数据导入到HBase中。你只要把程序做简单修改,就可以实现从HDFS中读取数据加载到HBase。
    首先,请将之前的user_action数据从HDFS复制到Linux系统的本地文件系统中,命令如下:

    cd /usr/local/bigdatacase/dataset
    /usr/local/hadoop/bin/hdfs dfs -get /user/hive/warehouse/dblab.db/user_action .
     #将HDFS上的user_action数据复制到本地当前目录,注意'.'表示当前目录
    cat ./user_action/* | head -10   #查看前10行数据
    cat ./user_action/00000* > user_action.output #将00000*文件复制一份重命名为user_action.output,*表示通配符
    head user_action.output  #查看user_action.output前10行
    

    3、编写数据导入程序
    我们这里采用Eclipse编写Java程序实现HBase数据导入功能。关于如何使用Eclipse编写Java程序调用HBase API,请参考厦大数据库实验室博客《分布式数据库HBase学习指南》。
    请使用Eclipse编写ImportHBase程序(Java代码在本文最后的附录部分),并打包成可执行jar包,命名为ImportHBase.jar。
    然后,请在“/usr/local/bigdatacase/”目录下面新建一个hbase子目录,用来存放ImportHBase.jar。
    4、数据导入
    现在开始执行数据导入操作。
    使用Java程序将数据从本地导入HBase中,导入前,请先清空user_action表。
    请在之前已经打开的HBase Shell窗口中(也就是在“hbase>”命令提示符下)执行下面操作:

    hbase> truncate 'user_action'
    Truncating 'user_action' table (it may take a while):
     - Disabling table...
     - Truncating table...
    0 row(s) in 4.0120 seconds
    //删除以后再查看就没有记录了
    hbase> scan 'user_action',{LIMIT=>10}
    ROW                                    COLUMN+CELL                                                                                                   
    0 row(s) in 0.4010 seconds
    

    下面就可以运行hadoop jar命令运行程序:

    /usr/local/hadoop/bin/hadoop jar /usr/local/bigdatacase/hbase/ImportHBase.jar HBaseImportTest /usr/local/bigdatacase/dataset/user_action.output
    

    命令解释如下:

    /usr/local/hadoop/bin/hadoop jar  #hadoop jar包执行方式
    /usr/local/bigdatacase/hbase/ImportHBase.jar  #jar包的路径
    HBaseImportTest   #主函数入口 
    /usr/local/bigdatacase/dataset/user_action.output  #main方法接收的参数args,用来指定输入文件的路径
    

    这个命令大概会执行3分钟左右,执行过程中,屏幕上会打印出执行进度,每执行1万条,对打印出一行信息,所以,整个执行过程屏幕上显示如下信息:

    10000
    20000
    30000
    40000
    50000
    60000
    70000
    80000
    90000
    100000
    110000
    120000
    130000
    140000
    150000
    160000
    170000
    180000
    190000
    200000
    210000
    220000
    230000
    240000
    250000
    260000
    270000
    280000
    290000
    300000
    Total Time: 259001 ms
    

    5、查看HBase中user_action表数据
    下面,再次切换到HBase Shell窗口,执行下面命令查询数据:

    habse> scan 'user_action',{LIMIT=>10}  #只查询前面10行
    

    就可以得到类似下面的查询结果了:

     1                                     column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     1                                     column=f1:item_category, timestamp=1480298573684, value=4076                                                  
     1                                     column=f1:item_id, timestamp=1480298573684, value=285259775                                                   
     1                                     column=f1:province, timestamp=1480298573684, value=\xE5\xB9\xBF\xE4\xB8\x9C                                   
     1                                     column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     1                                     column=f1:visit_date, timestamp=1480298573684, value=2014-12-08                                               
     10                                    column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     10                                    column=f1:item_category, timestamp=1480298573684, value=10894                                                 
     10                                    column=f1:item_id, timestamp=1480298573684, value=323339743                                                   
     10                                    column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE4\xB8\x9C                                   
     10                                    column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     10                                    column=f1:visit_date, timestamp=1480298573684, value=2014-12-12                                               
     100                                   column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     100                                   column=f1:item_category, timestamp=1480298573684, value=10576                                                 
     100                                   column=f1:item_id, timestamp=1480298573684, value=275221686                                                   
     100                                   column=f1:province, timestamp=1480298573684, value=\xE6\xB9\x96\xE5\x8C\x97                                   
     100                                   column=f1:uid, timestamp=1480298573684, value=10001082                                                        
     100                                   column=f1:visit_date, timestamp=1480298573684, value=2014-12-02                                               
     1000                                  column=f1:behavior_type, timestamp=1480298573684, value=1                                                     
     1000                                  column=f1:item_category, timestamp=1480298573684, value=3381                                                  
     1000                                  column=f1:item_id, timestamp=1480298573684, value=168463559                                                   
     1000                                  column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE8\xA5\xBF                                   
     1000                                  column=f1:uid, timestamp=1480298573684, value=100068031                                                       
     1000                                  column=f1:visit_date, timestamp=1480298573684, value=2014-12-02                                               
     10000                                 column=f1:behavior_type, timestamp=1480298575888, value=1                                                     
     10000                                 column=f1:item_category, timestamp=1480298575888, value=12488                                                 
     10000                                 column=f1:item_id, timestamp=1480298575888, value=45571867                                                    
     10000                                 column=f1:province, timestamp=1480298575888, value=\xE6\xB9\x96\xE5\x8C\x97                                   
     10000                                 column=f1:uid, timestamp=1480298575888, value=100198255                                                       
     10000                                 column=f1:visit_date, timestamp=1480298575888, value=2014-12-05                                               
     100000                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100000                                column=f1:item_category, timestamp=1480298594850, value=6580                                                  
     100000                                column=f1:item_id, timestamp=1480298594850, value=78973192                                                    
     100000                                column=f1:province, timestamp=1480298594850, value=\xE5\xB1\xB1\xE4\xB8\x9C                                   
     100000                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100000                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-29                                               
     100001                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100001                                column=f1:item_category, timestamp=1480298594850, value=3472                                                  
     100001                                column=f1:item_id, timestamp=1480298594850, value=34929314                                                    
     100001                                column=f1:province, timestamp=1480298594850, value=\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82                       
     100001                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100001                                column=f1:visit_date, timestamp=1480298594850, value=2014-12-15  
     100002                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100002                                column=f1:item_category, timestamp=1480298594850, value=10392                                                 
     100002                                column=f1:item_id, timestamp=1480298594850, value=401104894                                                   
     100002                                column=f1:province, timestamp=1480298594850, value=\xE6\xB1\x9F\xE8\xA5\xBF                                   
     100002                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100002                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-29                                               
     100003                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100003                                column=f1:item_category, timestamp=1480298594850, value=5894                                                  
     100003                                column=f1:item_id, timestamp=1480298594850, value=217913901                                                   
     100003                                column=f1:province, timestamp=1480298594850, value=\xE9\xBB\x91\xE9\xBE\x99\xE6\xB1\x9F                       
     100003                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100003                                column=f1:visit_date, timestamp=1480298594850, value=2014-12-04                                               
     100004                                column=f1:behavior_type, timestamp=1480298594850, value=1                                                     
     100004                                column=f1:item_category, timestamp=1480298594850, value=12189                                                 
     100004                                column=f1:item_id, timestamp=1480298594850, value=295053167                                                   
     100004                                column=f1:province, timestamp=1480298594850, value=\xE6\xB5\xB7\xE5\x8D\x97                                   
     100004                                column=f1:uid, timestamp=1480298594850, value=101480065                                                       
     100004                                column=f1:visit_date, timestamp=1480298594850, value=2014-11-26                                               
    10 row(s) in 0.6380 seconds
    

    实验顺利结束!

    附录:ImportHBase.java

    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.List;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.KeyValue;
    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;
    public class HBaseImportTest extends Thread {
        public Configuration config;
        public HTable table;
        public HBaseAdmin admin;
        public HBaseImportTest() {
            config = HBaseConfiguration.create();
    //      config.set("hbase.master", "master:60000");
    //      config.set("hbase.zookeeper.quorum", "master");
            try {
                table = new HTable(config, Bytes.toBytes("user_action"));
                admin = new HBaseAdmin(config);
            } catch (IOException e) {
                e.printStackTrace();
        public static void main(String[] args) throws Exception {
            if (args.length == 0) {       //第一个参数是该jar所使用的类,第二个参数是数据集所存放的路径
                throw new Exception("You must set input path!");
            String fileName = args[args.length-1];  //输入的文件路径是最后一个参数
            HBaseImportTest test = new HBaseImportTest();
            test.importLocalFileToHBase(fileName);
        public void importLocalFileToHBase(String fileName) {
            long st = System.currentTimeMillis();
            BufferedReader br = null;
            try {
                br = new BufferedReader(new InputStreamReader(new FileInputStream(
                        fileName)));
                String line = null;
                int count = 0;
                while ((line = br.readLine()) != null) {
                    count++;
                    put(line);
                    if (count % 10000 == 0)
                        System.out.println(count);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                try {
                    table.flushCommits();
                    table.close(); // must close the client
                } catch (IOException e) {
                    e.printStackTrace();
            long en2 = System.currentTimeMillis();
            System.out.println("Total Time: " + (en2 - st) + " ms");
        @SuppressWarnings("deprecation")
        public void put(String line) throws IOException {
            String[] arr = line.split("\t", -1);
            String[] column = {"id","uid","item_id","behavior_type","item_category","date","province"};
            if (arr.length == 7) {
                Put put = new Put(Bytes.toBytes(arr[0]));// rowkey
                for(int i=1;i<arr.length;i++){
                    put.add(Bytes.toBytes("f1"), Bytes.toBytes(column[i]),Bytes.toBytes(arr[i]));
                table.put(put); // put to server
        public void get(String rowkey, String columnFamily, String column,
                int versions) throws IOException {
            long st = System.currentTimeMillis();
            Get get = new Get(Bytes.toBytes(rowkey));
            get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
            Scan scanner = new Scan(get);
            scanner.setMaxVersions(versions);
            ResultScanner rsScanner = table.getScanner(scanner);
            for (Result result : rsScanner) {
                final List<KeyValue> list = result.list();
                for (final KeyValue kv : list) {
                    System.out.println(Bytes.toStringBinary(kv.getValue()) + "\t"
                            + kv.getTimestamp()); // mid + time
            rsScanner.close();
            long en2 = System.currentTimeMillis();
            System.out.println("Total Time: " + (en2 - st) + " ms");
    

    到这里,第三个步骤的实验内容顺利结束,请继续访问第四个步骤《大数据案例-步骤四:利用R进行数据可视化分析

    返回大数据案例首页