使用MapReduce读取HBase数据存储到MySQL
Mapper读取HBase数据
package MapReduce; import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper; import java.io.IOException; public class CallMapper extends TableMapper<phoneInfoDBWritable,phoneInfoDBWritable>{ //将log的caller,callee,time,dur提取出来,相当于将每一行数据读取出来放入到 phoneInfo 对象中。
private phoneInfo pp = new phoneInfo();
private phoneInfoDBWritable pDB = null;
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { //获取rowkey
String rowkey = new String(key.get());
//获取一行数据
Cell[] cells = value.rawCells();
// 获取的数据,通话时长,日期
String caller = "";
String callee = "";
String time = "";
String dur = "";
String flag = "";
String dateCallk = "";
//循环取出
for (Cell cell :cells){
// 取出行名称
String lineName = new String(CellUtil.cloneQualifier(cell)); // 判断打电话的人
if(lineName.equals("caller")){
caller = new String(CellUtil.cloneValue(cell));
}
// 接电话的人
if(lineName.equals("callee")){
callee = new String(CellUtil.cloneValue(cell));
}
// 判断日期
if(lineName.equals("time")){
time = new String(CellUtil.cloneValue(cell));
}
// 判断时长
if(lineName.equals("dur")){
dur = new String(CellUtil.cloneValue(cell));
}
// 判断日期
if(lineName.equals("flag")){
flag = new String(CellUtil.cloneValue(cell));
}
//01_手机号_yyyMMddhhmmss_1
String[] split = rowkey.split("_");
//截取打电话的人的电话号码
String phoneNum = split[1];
//拼接key
dateCallk = phoneNum + "_" + split[2].substring(0, 6);
//输出到文件 }
//测试输出内容
pp.setCaller(caller);
pp.setCallee(callee);
pp.setTime(time);
pp.setDur(dur);
pp.setFlag(flag);
//System.err.println("rowkey: " + rowkey + "-" +caller+ "-" +callee+ "-" + time + "-" +dur+ "-" +flag);
//String string = "rowkey: " + rowkey + "-" +caller+ "-" +callee+ "-" + time + "-" +dur+ "-" +flag;
//将数据写入到mysql中
pDB = new phoneInfoDBWritable(pp);
context.write(pDB,null);
}
}
Driver配置分发任务
package MapReduce; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
import org.apache.hadoop.mapreduce.lib.db.DBOutputFormat; public class MRRunner { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); //创建configuration
conf.set("hbase.zookeeper.quorum", "hadoop1,hadoop2,hadoop3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
Job job = Job.getInstance(conf, "db store"); //实现与数据库的连接
DBConfiguration.configureDB(job.getConfiguration(), "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/callphone", "root","root");
//将从HBase表中获取的数据封装写入到数据库表的格式
DBOutputFormat.setOutput(job, "phone", "caller", "callee", "time", "dur","flag"); //设置Driver
job.setJarByClass(MRRunner.class);
//设置数据输出学出到mysql的类格式
job.setOutputFormatClass(DBOutputFormat.class); //扫描HBase表
Scan scan = new Scan();
scan.setCacheBlocks(false);
scan.setCaching(500); //设置Mapper
job.setMapperClass(CallMapper.class);
TableMapReduceUtil.initTableMapperJob(
"phone:log",
scan,
CallMapper.class,
phoneInfoDBWritable.class,
phoneInfoDBWritable.class,
job); // 设置Reduce数量,没有使用到Reducer
job.setNumReduceTasks(0); System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
phoneInfo封装读取到的HBase
package MapReduce; /**
* 构建phoneInfo类,将HBase表中的数据存储到phoneInfo对象中
* 实现封装数据
*/
public class phoneInfo{ private String caller;
private String callee;
private String time;
private String dur;
private String flag; public String getCaller() {
return caller;
} public void setCaller(String caller) {
this.caller = caller;
} public String getCallee() {
return callee;
} public void setCallee(String callee) {
this.callee = callee;
} public String getTime() {
return time;
} public void setTime(String time) {
this.time = time;
} public String getDur() {
return dur;
} public void setDur(String dur) {
this.dur = dur;
} public String getFlag() {
return flag;
} public void setFlag(String flag) {
this.flag = flag;
}
}
phoneInfoDBWritable实现DBWritable用于存放phoneInfo对象
package MapReduce; import org.apache.hadoop.mapreduce.lib.db.DBWritable; import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /**
* 编写phoneInfoDBWritable类实现DBWritable,完成HBase的数据写入到指定的MySQL的序列化
*/
public class phoneInfoDBWritable implements DBWritable { private phoneInfo phoneinfo; public phoneInfoDBWritable() { } public phoneInfoDBWritable(phoneInfo phoneinfo) {
this.phoneinfo = phoneinfo;
}
public void write(PreparedStatement statement) throws SQLException {
statement.setString(1, phoneinfo.getCaller());
statement.setString(2, phoneinfo.getCallee());
statement.setString(3, phoneinfo.getTime());
statement.setString(4, phoneinfo.getDur());
statement.setString(5, phoneinfo.getFlag());
} public void readFields(ResultSet resultSet) throws SQLException { }
}
使用MapReduce读取HBase数据存储到MySQL的更多相关文章
- 关于mapreducer 读取hbase数据 存入mysql的实现过程
mapreducer编程模型是一种八股文的代码逻辑,就以用户行为分析求流存率的作为例子 1.map端来说:必须继承hadoop规定好的mapper类:在读取hbase数据时,已经有现成的接口 Tabl ...
- Hadoop生态圈-使用MapReduce处理HBase数据
Hadoop生态圈-使用MapReduce处理HBase数据 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对HBase表中数据进行单词统计(TableInputFormat) ...
- SparkSQL读取HBase数据
这里的SparkSQL是指整合了Hive的spark-sql cli(关于SparkSQL和Hive的整合,见文章后面的参考阅读). 本质上就是通过Hive访问HBase表,具体就是通过hive-hb ...
- 猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库
前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...
- python3下scrapy爬虫(第十卷:scrapy数据存储进mysql)
上一卷中我将爬取的数据文件直接写入文本文件中,现在我将数据存储到mysql中,我依然用的是pymysql,这个很麻烦建表需要在外面建 这次代码只需要改变pipyline就行 来 现在看下结果: 对比发 ...
- SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量
SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量 1. ScalikeJDBC 2.配置文件 3.导入依赖的jar包 4.源码测试 通过MySQL保存kafka的偏移量 ...
- Mapreduce读取Hbase表,写数据到一个Hbase表中
public class LabelJob { public static void main(String[] args) throws Exception { Job job = Job.getI ...
- HBase 数据存储结构
在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...
- BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...
随机推荐
- 【Linux】动态链接函数库
动静区别 1. gcc –c mylib.c –o mylib.o 2. gcc -shared -fPIC mylib.o -o libmylib.so 3. 将制作好的libmylib.so 复制 ...
- Java实现队列结构的详细代码
一.什么是队列结构 一种线性结构,具有特殊的运算法则[只能在一端(队头)删除,在另一端(队尾)插入]. 分类: 顺序队列结构 链式队列结构 基本操作: 入队列 出队列 二.准备数据 static fi ...
- Dynamics CRM GBK编码
Dynamics CRM用文本汉字为条件去请求数据时,传过去的竟然是GBK编码⊙_⊙ 下面这段代码解决了我的问题,这是拷贝自网上一位大神的博客: http://qq100002656.blog.163 ...
- Flask入门request session cookie(二)
1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...
- Centos7安装完毕后无法联网的解决方法(转)
今天在VMware虚拟机中经过千辛万苦终于安装好了centos7..正兴致勃勃的例行yum update 却发现centos系统貌似默认网卡没配置好,反馈无法联网.经过一番研究,终于让centos连上 ...
- GraphQL 到底怎么用?看看这个例子就知道了
转载自: https://www.infoq.cn/article/i5JMm54_aWrRZcem1VgH
- hdu-4288 Coder---线段树+离线处理&离散化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4288 题目大意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3 ...
- Python map/reduce/filter/sorted函数以及匿名函数
1. map() 函数的功能: map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)] def f(x): return x*x a = map(f, [1, 2, 3, ...
- python-实现登录接口
简介:1.在本地创建两个文件,一个文件的内容是存储用户名和密码,另一个的内容是存储锁定的用户 2.登录次数限制为三次,当密码错误三次后,该账号锁定,无法再次登录 #coding=ut ...
- context.RewritePath
context.RewritePath原理修改HttpRequest类中的Path属性