返回大数据案例首页
《大数据课程实验案例:网站用户行为分析—-步骤三: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命令看一下当前运行的进程:
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进行数据可视化分析》