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的更多相关文章

  1. 关于mapreducer 读取hbase数据 存入mysql的实现过程

    mapreducer编程模型是一种八股文的代码逻辑,就以用户行为分析求流存率的作为例子 1.map端来说:必须继承hadoop规定好的mapper类:在读取hbase数据时,已经有现成的接口 Tabl ...

  2. Hadoop生态圈-使用MapReduce处理HBase数据

    Hadoop生态圈-使用MapReduce处理HBase数据 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对HBase表中数据进行单词统计(TableInputFormat) ...

  3. SparkSQL读取HBase数据

    这里的SparkSQL是指整合了Hive的spark-sql cli(关于SparkSQL和Hive的整合,见文章后面的参考阅读). 本质上就是通过Hive访问HBase表,具体就是通过hive-hb ...

  4. 猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库

    前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...

  5. python3下scrapy爬虫(第十卷:scrapy数据存储进mysql)

    上一卷中我将爬取的数据文件直接写入文本文件中,现在我将数据存储到mysql中,我依然用的是pymysql,这个很麻烦建表需要在外面建 这次代码只需要改变pipyline就行 来 现在看下结果: 对比发 ...

  6. SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量

    SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量 1. ScalikeJDBC 2.配置文件 3.导入依赖的jar包 4.源码测试 通过MySQL保存kafka的偏移量 ...

  7. Mapreduce读取Hbase表,写数据到一个Hbase表中

    public class LabelJob { public static void main(String[] args) throws Exception { Job job = Job.getI ...

  8. HBase 数据存储结构

    在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...

  9. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

随机推荐

  1. C++中char*与wchar_t*之间的转换

    http://blog.163.com/tianshi_17th/blog/static/4856418920085209414977/ 关于C++中的char*与wchar_t*这两种类型的相互转换 ...

  2. maven学习(五)插件和自定义插件

    插件是可以配置在settings.xml和pom.xml中的 插件目标: 在了解插件和生命周期的绑定关系之前,先来说一下插件目标.在实际项目构建的过程中,需要经历编译.打包等等许许多多的操作,为每个操 ...

  3. ARM 中可用性集使用的注意事项

    Azure 目前有两种部署模型:经典部署模型 (ASM) 和资源管理器 (ARM).如果您之前使用过 ASM 模式下的可用性集,那么很可能在使用 ARM 模式下的可用性集时,会遇到一些问题或者疑惑.这 ...

  4. 利用SQL Server Management Studio(SSMS)复制数据库

    利用SQL Server Management Studio(SSMS)复制数据库 标签(空格分隔): SQLServer 前言 今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低, ...

  5. Centos7安装JDK1.8 Linux64bit

    流程一览: 1.下载JDK1.8(jdk-8u11-linux-x64.tar.gz) 2. 解压缩安装 3.配置JAVA_HOME环境变量 4.切换JDK1.8为当前使用的JDK 5.重启,查看安装 ...

  6. June 10th 2017 Week 23rd Saturday

    A lot of things, we can be touched, but we can not shed tears. 很多事情,我们可以感动,却不能流泪. Sometimes I was to ...

  7. python25 python的三目运算符

    其他语言的三目运算符大类似: 条件 ?  条件为真返回值: 条件为假返回值 python不一样: 条件为真的返回值  if  条件  else  条件为假的返回值                 或者 ...

  8. 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)

    http://blog.csdn.net/hjf19790118/article/details/6919265 1.什么是面向对象编程(Object-Oriented Programming)? 面 ...

  9. GreenPlum 与hadoop什么关系?(转)

    没关系. gp 可以处理大量数据, hadoop 可以处理海量. gp 只能处理湖量,或者河量. 无法处理海量. 作者:SallyLeo链接:https://www.zhihu.com/questio ...

  10. Python中使用list和tuple

    list: Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: 变量classmates ...