hadoop执行hdfs文件到hbase表插入操作(xjl456852原创)
本例中需要将hdfs上的文本文件,解析后插入到hbase的表中.
create 'ns2:user', 'info'
1,xiejl,20
2,haha,30
3,liudehua,40
4,daoming,41
[hadoop@master ~]$ hdfs classpath
package com.xjl456852.mapreduce;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import java.io.IOException;
/**
* 将hdfs中的文本文件写入到hbase的表中
* 程序的运行需要加入hadoop的配置文件和hbase的配置文件到jar包中
* 对应的hbase的表
* create 'ns2:user','info'
*
* Created by xiejl on 2016/8/10.
*/
public class HBaseApp {
public static void main(String [] args) {
try {
Job job = Job.getInstance();
job.setJobName("text into hbase table");
job.setJarByClass(HBaseApp.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
//设置表名
job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, args[1]);
//设置输出格式为table
job.setOutputFormatClass(TableOutputFormat.class);
//设置输出的key类型为ImmutableBytesWritable
job.setOutputKeyClass(ImmutableBytesWritable.class);
//设置输出的value类型为Put
job.setOutputValueClass(Put.class);
//因为map输出key和reduce输出的key类型不一致,所以需要再设置map的key输出类型为Text
job.setMapOutputKeyClass(Text.class);
//因为map输出value和reduce输出的value类型不一致,所以需要再设置map的value输出类型为Text
job.setMapOutputValueClass(Text.class);
//Mapper
job.setMapperClass(MyMapper.class);
//Reducer
job.setReducerClass(MyReducer.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
package com.xjl456852.mapreduce;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* Created by xiejl on 2016/8/10.
*/
public class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
int index = line.indexOf(",");
String rowKey = line.substring(0, index);
//跳过逗号
String valueLine = line.substring(index+1);
context.write(new Text(rowKey), new Text(valueLine));
}
}
package com.xjl456852.mapreduce;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* Created by xiejl on 2016/8/11.
*/
public class MyReducer extends Reducer<Text, Text, ImmutableBytesWritable, Put> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
byte[] rowKey = Bytes.toBytes(key.toString());
for(Text text : values) {
//设置put对象的行键
Put put = new Put(rowKey);
String line = text.toString();
int index = line.indexOf(",");
String name = line.substring(0, index);
String age = line.substring(index+1);
//列族的是建表时固定的,列和值是插入时添加的.
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"),Bytes.toBytes(name));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"),Bytes.toBytes(age));
context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())), put);
}
}
}
将HBase的类jar包加到hadoop的classpath下, 修改${HADOOP_HOME}/etc/hadoop/hadoop-env.sh。配置好这个文件,分发到各个节点,改这个配置不用重启集群.
TEMP=`ls /opt/modules/hbase/lib/*.jar`
HBASE_JARS=`echo $TEMP | sed 's/ /:/g'`
HADOOP_CLASSPATH=$HBASE_JARS
<property>
<name>yarn.application.classpath</name>
<value>
/opt/modules/hadoop/etc/*,
/opt/modules/hadoop/etc/hadoop/*,
/opt/modules/hadoop/lib/*,
/opt/modules/hadoop/share/hadoop/common/*,
/opt/modules/hadoop/share/hadoop/common/lib/*,
/opt/modules/hadoop/share/hadoop/mapreduce/*,
/opt/modules/hadoop/share/hadoop/mapreduce/lib/*,
/opt/modules/hadoop/share/hadoop/hdfs/*,
/opt/modules/hadoop/share/hadoop/hdfs/lib/*,
/opt/modules/hadoop/share/hadoop/yarn/*,
/opt/modules/hadoop/share/hadoop/yarn/lib/*,
/opt/modules/hbase/lib/*
</value>
</property>
hadoop jar hbase.jar com.xjl456852.mapreduce.HBaseApp data/hbase_input ns2:user
hbase(main):001:0> scan 'ns2:user'
ROW COLUMN+CELL
1 column=info:age, timestamp=1470966325326, value=20
1 column=info:name, timestamp=1470966325326, value=xiejl
2 column=info:age, timestamp=1470966325326, value=30
2 column=info:name, timestamp=1470966325326, value=haha
3 column=info:age, timestamp=1470966325326, value=40
3 column=info:name, timestamp=1470966325326, value=liudehua
4 column=info:age, timestamp=1470966325326, value=41
4 column=info:name, timestamp=1470966325326, value=daoming
4 row(s) in 0.3100 seconds
package com.xjl456852.mapreduce;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import java.io.IOException;
/**
* 如果继承TableReducer,从源码中可以看到,输出的value是Mutation类型,也就是输出的值可以是Put,Delete之类的类型
* Created by xiejl on 2016/8/11.
*/
public class MyReducer2 extends TableReducer<Text, Text, ImmutableBytesWritable> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
byte[] rowKey = Bytes.toBytes(key.toString());
for(Text text : values) {
//设置put对象的行键
Put put = new Put(rowKey);
String line = text.toString();
int index = line.indexOf(",");
String name = line.substring(0, index);
String age = line.substring(index+1);
//列族的是建表时固定的,列和值是插入时添加的.
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"),Bytes.toBytes(name));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"),Bytes.toBytes(age));
context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())), put);
}
context.getCounter("reduce", "over").increment(1);
}
}
hadoop执行hdfs文件到hbase表插入操作(xjl456852原创)的更多相关文章
- BulkLoad加载本地文件到HBase表
BulkLoad加载文件到HBase表 1.功能 将本地数据导入到HBase中 2.原理 BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入 ...
- Hadoop之HDFS文件操作常有两种方式(转载)
摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- Hadoop之HDFS文件操作
摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- HDFS文件和HIVE表的一些操作
1. hadoop fs -ls 可以查看HDFS文件 后面不加目录参数的话,默认当前用户的目录./user/当前用户 $ hadoop fs -ls 16/05/19 10:40:10 WARN ...
- hadoop的hdfs文件操作实现上传文件到hdfs
这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到 ...
- Hadoop 执行 hdfs 命令烦人的警告信息
问题描述: 安装完 hadoop,执行 hdfs dfs -ls 命令时,报警告如下: -- ::, WARN util.NativeCodeLoader: Unable to load native ...
- Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac)
org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac 代码: //1.create HTa ...
- Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac
org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac 代码: //1.create HTa ...
- Java 向Hbase表插入数据异常org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apache.client.HTable
出错代码如下: //1.create HTablePool HTablePool hp=new HTablePool(con, 1000); //2.get HTable from HTablepoo ...
随机推荐
- Yum出错Error: Cannot find a valid baseurl for repo: base
centos yum 错误 Error: Cannot find a valid baseurl for repo: addons 装了个CentOS 6.5,使用yum时出现了以下的错误提示. [r ...
- openwrt上opkg更新报错"opkg_download: Failed to download ............."
開始搞op的时候,看到op居然能够直接安装一些插件.激动坏了,由于这东西对嵌入式的小系统来说简直不敢想,可是op就支持了,就是这么任性. 好不easy编译了固件.依照网上的教程.telnet进去.首先 ...
- 自定义ViewGroup 流式布局
使用 public class MainActivity extends Activity { @Override protected void onCreate(Bundle sav ...
- Java初转型-Maven入门
原系列名:Maven学习总结(一) 原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3498271.html 感谢! 一.Maven的基本概念 Maven(翻译为&q ...
- 《第一行代码》学习笔记38-服务Service(5)
1.希望服务一旦启动就立刻去执行某个动作,可以将逻辑写在onStartCommand()方法里. 2.onCreate()和onStartCommand()的区别:onCreate()方法是在服务第一 ...
- java线层的启动与停止
class Do8 { public static void main(String[] args) { Resource r =new Resource(); Input in =new Input ...
- 武汉科技大学ACM :1010: 华科版C语言程序设计教程(第二版)例题7.8
Problem Description 输入一个用年月日表示的日期,求该日期是该年的第几天.输入某年的第几天,输出这一天是该年的几月几号,茂茂解不出,需要你的帮助. Input 开始有个整数k,表示询 ...
- OpenCV——改变图像大小
, , int interpolation=INTER_LINEAR ) dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不 ...
- struts2中<s:select/>标签的运用详解
<s:select list="smsTypes" listKey="SmsTypeId" listValue="SmsTypeName&quo ...
- 3月26日html(七)window document
---恢复内容开始--- 1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: v ...