使用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数据库, ...
随机推荐
- 【C++ Primer】详解C++和C中的float中的有效数字
在<C++ Primer>第二章中,2.1.1讲到float型的最小尺寸是6位有效数字.这里对“有效数字”的概念产生疑问,故有了以下内容. 首先,float的“尺寸”的意思是 ...
- jQuery 资料
jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...
- tensorflow 模型不兼容
[ERROR] [1533570199.196157]: bad callback: <bound method TLDetector.image_cb of <__main__.TLDe ...
- Unix 和 Linux 安装 Perl
Unix/Linux 系统上 Perl 安装步骤如下: 通过浏览器打开 http://www.perl.org/get.html. 下载适用于 Unix/Linux 的源码包. 下载 perl-5.x ...
- 修改CPAN安装源
更新CPAN镜像源的方法,以CentOS 6.5为例. 存储CPAN设置信息的文件路径为: /usr/share/perl/CPAN/Config.pm 使用vi打开文件 vi /usr/share/ ...
- Hello World, S/4HANA for Customer Management 1.0
SAP CRM的前世今生 在我之前的微信公众号文章 SAP的这三款CRM解决方案,您能区分清楚么我曾经提到过我作为成都SAP研究院CRM产品开发团队的一员工作过一段时间. 我向在SAP德国总部工作的德 ...
- IOS 播放视频(MPMoviePlayerController、MPMoviePlayerViewController)
● iOS提供了叫 做MPMoviePlayerController.MPMoviePlayerViewController的两个 类,可以用来轻松播放视频 ➢ YouTobe就是用MPMoviePl ...
- Android(java)学习笔记2:继承Thread类创建线程类
1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...
- 推箱子Unity
逻辑首先有控制台写了一下. 需要注意的地方不少: 进一步,需要考虑3个层面的问题. 前面的位置是空地,成功点,墙,还是箱子. 前面是箱子的时候,箱子的前面是空地,墙,成功点,还是箱子. 当移动的时候, ...
- stixel-net绘制指标图
需解决问题: 1.离散点进行平滑曲线画法 https://blog.csdn.net/cdqn10086/article/details/70143616 def draw_curve(x,y,img ...