hbase导入csv文件 importtsv 能导csv格式的数据吗

数据导入HBase最惯用的三种方式及实践分析(3)
我的图书馆
数据导入HBase最惯用的三种方式及实践分析(3)
&数据导入HBase最常用的三种方式及实践分析(3)
HBase数据迁移(3)-自己编写MapReduce Job导入数据 :尽管在将文本文件加载入HBase时importtsv工具十分高效,但在许多情况下为了完全控制整个加载过程,你可能更想自己编写MapReduce Job向HBase导入数据。例如在你希望加载其他格式文件时不能使用importtsv工具。HBase提供TableOutputFormat 用于在MapReduce Job中向HBase的表中写入数据。你也可以使用HFileOutputFormat 类在MapReduce Job中直接生成HBase自有格式文件HFile,之后使用上一篇(迁移2)中提到的completebulkload 工具加载至运行的HBase集群中。在本文中,我们将详细解释如何编写自己的MapReduce Job来加载数据。我们会先介绍如何使用TableOutputFormat,在更多章节中介绍在MapReduce Job中直接生成HBase自有格式文件HFile。 准备我们本文中使用 “美国国家海洋和大气管理局 气候平均值”的公共数据集合。访问http://www1.ncdc.noaa.gov/pub/data/normals//。 在目录 products | hourly 下的小时温度数据(可以在上述链接页面中找到)。下载hly-temp-normal.txt文件。对于下载的数据文件无需进行格式处理,我们将使用MapReduce直接读取原始数据。我们假设您的环境已经可以在HBase上运行MapReduce。若还不行,你可以参考一下之前的文章(迁移1、迁移2)。 如何实施1.将原始数据从本地文件系统拷贝进HDFS:123 hac@client1$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hac/input/2-3 hac@client1$ $HADOOP_HOME/bin/hadoop fs -copyFromLocal hly-temp-normal.tsv /user/hac/input/2-3 2.编辑客户端服务器上的hadoop-env.sh文件,将HBase的JAR文件加入Hadoop的环境变量中:123 hadoop@client1$ vi $HADOOP_HOME/conf/hadoop-env.sh export HADOOP_CLASSPATH=/usr/local/hbase/current/hbase-0.92.1.jar 3.编写MapReduce的Java代码并且打包为JAR文件。Java源码如下:1 $ vi Recipe3.java123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 public class Recipe3 { public static Job createSubmittableJob (Configuration conf, String[] args) throws IOException { String tableName = args[0]; Path inputDir = new Path(args[1]); Job job = new Job (conf, "hac_chapter2_recipe3"); job.setJarByClass(HourlyImporter.class); FileInputFormat.setInputPaths(job, inputDir); job.setInputFormatClass(TextInputFormat.class); job.setMapperClass(HourlyImporter.class); // ++++ insert into table directly using TableOutputFormat ++++ // ++++ 使用TableOutputFormat 直接插入表中++++ TableMapReduceUtil.initTableReducerJob(tableName, null, job); job.setNumReduceTasks(0); TableMapReduceUtil.addDependencyJars(job);
} public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); Job job = createSubmittableJob(conf, args); System.exit (job.waitForCompletion(true) ? 0 : 1); } }4.在Recipe3.java中添加一个内部类。作为MapReduce Job的mapper类:1 $ vi Recipe3.java12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 static class HourlyImporter extends Mapper&LongWritable, Text, ImmutableBytesWritable, Put& {
static byte[] family = Bytes.toBytes("n"); @Override protected void setup(Context context) { ts = System.currentTimeMillis(); } @Override public void map(LongWritable offset, Text value, Context context)throws IOException { try { String line = value.toString(); String stationID = line.substring(0, 11); String month = line.substring(12, 14); String day = line.substring(15, 17); String rowkey = stationID + month + byte[] bRowKey = Bytes.toBytes(rowkey); ImmutableBytesWritable rowKey =& new ImmutableBytesWritable(bRowKey); Put p = new Put(bRowKey); for (int i = 1; i & 25 ; i++) { String columnI = "v" + Common.lpad(String.valueOf(i), 2, '0'); int beginIndex = i * 7 + 11; String valueI = line.substring(beginIndex, beginIndex + 6).trim(); p.add(family, Bytes.toBytes(columnI), ts, Bytes.toBytes(valueI)); } context.write(rowKey, p); } catch (InterruptedException e) { e.printStackTrace(); } } } }5.为了能够运行MapReduce Job需要将源码打包为JAR文件,并且从客户端使用hadoop jar命令:1234567 hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac. chapter2.Recipe3 \ hly_temp \ /user/hac/input/2-3检查结果。MapReduce job的运行结果应当显示下内容:12345678910111213141516171819 13/03/27 17:42:40 INFO mapred.JobClient:&& Map-Reduce Framework 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Map input records=95630 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Physical memory (bytes) snapshot= 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Spilled Records=0 13/03/27 17:42:40 INFO mapred.JobClient:&&&& CPU time spent (ms)=124530 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Total committed heap usage (bytes)= 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Virtual memory (bytes) snapshot= 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Map input bytes= 13/03/27 17:42:40 INFO mapred.JobClient:&&&& Map output records=95630 13/03/27 17:42:40 INFO mapred.JobClient:&&&& SPLIT_RAW_BYTES=118 Map的输入记录数应当与输入路径下的文件内容总行数相同。Map输出记录数应当与输入记录数相同(本文中)。你能够在HBase中使用 count/scan命令来验证上述结果 运行原理为了运行MapReduce Job,我们首先在createSubmittableJob()方法中构建一个Job实例。实例建立后,我们对其设置了输入路径,输入格式以及mapper类。之后,我们调用了TableMapReduceUtil.initTableReducerJob() 对job进行适当配置。包括,加入HBase配置,设置TableOutputFormat,以及job运行需要的一些依赖的添加。在HBase上编写MapReduce程序时,TableMapReduceUtil 是一个很有用的工具类。主函数中调用 job.waitForCompletion() 能够将Job提交到MapReduce框架中,直到运行完成才退出。运行的Job将会读取输入路径下的所有文件,并且将每行都传入到mapper类(HourlyImporter)。在map方法中,转换行数据并生成row key,建立Put对象,通过Put.add()方法将转换后的数据添加到对应的列中。最终调用context.write()方法将数据写入HBase表中。本例中无需reduce阶段。如你所见,编写自定义的MapReduce Job来向HBase插入数据是很简单的。程序与直接在单台客户端使用HBase API类似。当面对海量数据时,我们建议使用MapReduce来向HBase中导入数据。 其他使用自定义的MapReduce Job来向HBase加载数据在大部分情况下都是合理的。但是,如果你的数据是极大量级的,上述方案不能很好处理时。还有其他方式能够更好的处理数据合并问题。 在MapReduce中生成HFile除了直接将数据写入HBase表,我们还可以在MapReduce Job中直接生成HBase自有格式HFile,然后使用completebulkload 工具将文件加载进集群中。这个方案将比使用TableOutputFormat API更加节省CPU与网络资源:1.修改Job配置。要生成HFile文件,找到createSubmittableJob()的下面两行:123 TableMapReduceUtil.initTableReducerJob(tableName, null, job); job.setNumReduceTasks(0);2.替换代码12345678910111213 HTable table = new HTable(conf, tableName); job.setReducerClass(PutSortReducer.class); Path outputDir = new Path(args[2]); FileOutputFormat.setOutputPath(job, outputDir); job.setMapOutputKeyClass(ImmutableBytesWritable.class); job.setMapOutputValueClass(Put.class); HFileOutputFormat.configureIncrementalLoad (job, table);3.在命令行添加输出地址参数。编译并打包源码,然后在运行任务的命令行添加输出地址参数:123456789 hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac. chapter2.Recipe3 \ hly_temp \ /user/hac/input/2-3 \ /user/hac/output/2-34.完成bulk load:1234567 hac@client1$ $HADOOP_HOME/bin/hadoop jar $HBASE_HOME/hbase- 0.92.1.jar completebulkload \ /user/hac/output/2-3 \ hly_temp步骤1中,我们修改了源码中的job配置。我们设置job使用由HBase提供的PutSortReducer& reduce类。这个类会在数据行写入之前对列进行整理。HFileOutputFormat.configureIncrementalLoad() 方法能够为生成HFile文件设置适当的参数。在步骤2中的job运行完成之后,自有HFile格式文件会生成在我们指定的输出路径。文件在列族目录2-3/n之下,将会使用completebulkload 加载到HBase集群中。在MapReduce Job执行过程中,如果你在浏览器中打开HBase的管理界面,会发现HBase没有发出任何请求。这表明这些数据不是直接写入HBase的表中。 影响数据合并的重要配置如果你在MapReduce Job使用TableOutputFormat 类将数据直接写入HBase表中,是一个十分繁重的写操作。尽管HBase是设计用于快速处理写操作,但下面的这些还是你可能需要调整的重要的配置:&&& JVM的堆栈和GC设置&&& 域服务器处理数量&&&& 最大的域文件数量&&&& 内存大小&&&& 更新块设置你需要了解HBase架构的基本知识来理解这些配置如何影响HBase的写性能。以后我们会进行详细的描述。Hadoop和HBase会生成若干日志。当集群中的MapReduce Job加载数据时存在某些瓶颈或障碍时,检查日志可以给你一些提示。下面是一些比较重要的日志:&&&& Hadoop/HBase/ZooKeeper的守护进程的GC日志&&&& HMaster守护进程的日志 在将数据转移至HBase之前预先搭建域HBase的每行数据都归属一个特定的域中。一个域中包含了一定范围内的排序号的HBase的数据行。域是由域服务器发布和管理的。当我们在HBase中建立一个表后,该表会在一个单独的域启动。所有插入该表的数据都会首先进入这个域中。数据持续插入,当到达一个极限之后,域会被分为两份。称之为域的分离。分离的域会分布到其他域服务器上,以达到集群中的负载能够均衡。如你所想,若我们能够将表初始化在预先建好的域上,使用合适的算法,数据加载的负载会在整个集群中平衡,并且加快了数据加载的速度。我们将描述如何用预先建好的域来建立一个表。 准备登入HBase的客户端节点 如何实施在客户端节点上执行如下命令:123456789 $ $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.util.RegionSplitter -c 10 -f n hly_temp2 12/04/06 23:16:32 DEBUG util.RegionSplitter: Creating table hly_temp2 with 1 column families.& Presplitting to 10 regions … 12/04/06 23:16:44 DEBUG util.RegionSplitter: Table created!& Waiting for regions to show online in META... 12/04/06 23:16:44 DEBUG util.RegionSplitter: Finished creating table with 10 regions 运行原理命令行调用了RegionSplitter 类,并且附带如下参数:&&&& -c 10—用预先分割的10个域来建立这个表&&&& -f n—建立一个名叫n的列族&&&& hly_temp2— 表名在浏览器中打开HBase管理界面,在用户表中点击hly_temp2,你可以看到预先建立的10个域。RegionSplitter 是HBase提供的一个工具类。使用RegionSplitter 你可以做下面这些事情:&&&& 使用具体数量的预建域来建立一个表。&&&& 能够将一个已存在的表进行分离域。&&&& 使用自定义算法来分离域。在上文中使用自定义MapReduce导入数据时,也许你原本认为数据写入应该是分布在集群中所有的域中,但实际不是。在管理页上可以看到,在MapReduce Job的执行期间所有的请求都发送至相同的服务器。这是因为默认的分离算法(MD5StringSplit)不是很适合我们的情况。我们所有的数据都发送至相同集群,因此所有的API请求都发送至域所在的域服务器中。我们需要提供自定义的算法来适当的分离域。预分离的域也能够对生成自有格式HFile文件的的MapReduce Job产生影响。运行上文中的MapReduce Job,对hly_temp2表使用生成HFile文件的选项。如下图所示,你可以发现MapReduce Job的reduce数量从原本的1到10了,这就是预搭建域的数量:这是因为Job中reduce的数量是基于目标表的域数量。若reduce数量增加,通常意味加载动作分布到多个服务器上面,所以job的运行速度会更快。 &
TA的最新馆藏[转]&
喜欢该文的人也喜欢1063人阅读
网上大多数的文章都是使用hadoop端ImportTsv工具导入数据,但会遇到一堆缺少jar包的问题,解决办法就是拷贝hbase边的jar包拷贝到hadoop指定目录下。根据HBase官网介绍,可以选择使用HBase的org.apache.hadoop.hbase.mapreduce.ImportTsv工具。
create 'VEHICLE', 'Message', 'Properties',
{NUMREGIONS =& 2000, SPLITALGO =& 'HexStringSplit'}
bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv '-Dimporttsv.separator=,' -Dimporttsv.bulk.output=/hfileout -Dimporttsv.columns=HBASE_ROW_KEY,Message:a1,Properties:a1 VEHICLE hdfs://RDCMaster:9100/input1
bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /hfileout VEHICLE
hbase表名:VEHICLE
导入数据源:hdfs://RDCMaster:9100/input1
列族:Message 和 Properties,分别对应的列限定符a1。
特别需要注意的是,在创建表时,我做了预分配Region,个数是2000,那就意味着导入数据过程中的Map/Reduce阶段,Reduce个数为2000。这个预分配的Region个数不能随便指定,否者会影响导入数据时Map/Reduce的性能。
假如hbase的Region大小为64M,64M * 2000 = 128,000M,约为120G,源头文件hdfs://RDCMaster:9100/input1的大小应该稍微小于120G才合理,比如90止110之间都可以,如果input1文件大小为20G,那Reduce的个数任然是2000,Reduce的过程就非常缓慢。所以在导入数据时,一定要计算好预分配的Region个数,切记切记!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10306次
排名:千里之外
原创:12篇
(1)(1)(1)(1)(1)(3)(3)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'9989人阅读
大数据(24)
Hadoop(20)
hbase(1)
Big Data(20)
本文的测试环境为hbase-0.96.0 + yarn(hadoop-2.0.3-alpha) + pig-0.12.0。在测试前,先创建了一张名为test的hbase表,它内容非常简单,就只有一行数据:
HBase export工具导出的数据的格式是sequence file。比如,在执行完命令“bin/hbase org.apache.hadoop.hbase.mapreduce.Export test test-output-001”后,hbase会启动一个MapReduce作业,作业完成后会在hdfs上面会生成sequence file格式的数据文件:
当然,对于这类Sequence file格式的数据文件,HBase是可以直接将它导入到HBase的表里面的。
比如,我们创建另外一张hbase空表,名为test-01。命令为:“create 'test-01','cf'”。此时,表test-01的内容为空。
然后,执行命令“bin/hbase org.apache.hadoop.hbase.mapreduce.Import test-01 test-output-001”,随后hbase会启动一个MapReduce 作业:
此时,我们可以看到表test-01中已经成功导入了数据:
如果想从HBase中直接导出CSV格式的数据文件,可以借助Pig。步骤为:
a) 编辑名为ExportHbase.pig的文件:
REGISTER ${HBASE_HOME}/lib/htrace-core-2.01.
REGISTER ${PIG_HOME}/contrib/piggybank/java/piggybank.
x = LOAD 'hbase://test' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('cf:c1');
STORE x INTO 'test-tbl-data.csv' USING PigStorage('$');
b) 执行命令“bin/pig -x mapreduce ExportHbase.pig”,然后Pig会启动一个MapReduce job,执行完毕后会在hdfs上生成CSV格式的数据:
除了利用Pig,还可以用别的方法从HBase 导出CSV格式的数据:
- 编写Java程序,调用HBase API。
具体方法可以参考http://blog.csdn.net/macyang/article/details/8522677.
- 把HBase生成的Sequence file转化成CSV格式的文件
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:137627次
积分:1516
积分:1516
排名:千里之外
原创:29篇
评论:29条
(2)(4)(1)(1)(1)(2)(1)(6)(2)(6)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Hbase导入数据ImportTsv - 泡杯茶,过来坐坐 - ITeye博客
把文本或者hdfs文本型数据导入到hbase中去
基于ImportTsv
bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv
-Dimporttsv.columns=HBASE_ROW_KEY,E:E,E:N
hdfs://host:ip/yourfile
-Dimporttsv.separator=\t
这个是以mr job的形式导入,详情参见ImportTsv实现
-Dimporttsv.columns 指定列,需要指定HBASE_ROW_KEY
TABLE 为table名称
-Dimporttsv.separator为分隔符,默认为\t
浏览: 508437 次
来自: 北京
不错!可以使用,已验证。
这和我去官网看有啥区别?
小网客 写道evanzzy 写道使用preparedState ...
evanzzy 写道使用preparedStatement进行 ...
使用preparedStatement进行数据库操作防注入这事 ...一、HBase介绍
HBase是Apache Hadoop中的一个子项目,依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的命令就可以看到HBase数据存储文件夹的目录结构,还可以通过Map/Reduce对HBase进行操作。HBase是一个适合于非结构化数据存储的数据库.所谓非结构化数据存储就是说HBase是基于列的而不是基于行的模式。HBase是介于Map Entry(key & value)和DB Row之间的一种数据存储方式。你很可能需要存储多个属性的数据结构,但没有传统数据库表中那么多的关联关系,这就是所谓的松散数据。简单来说,你在HBase中的表创建的可以看做是一张很大的表,而这个表的属性可以根据需求去动态增加,在HBase中没有表与表之间关联查询。你只需要告诉你的数据存储到HBase的那个column family就可以了,不需要指定具体类型,需要注意的是HBase中不包含事务的功能。
二、ImportTsv介绍
将数据导入HBase,通常HBase用户会使用HBase API进行数据导入,但是如果一次性导入大批量数据,可能会占用大量Regionserver资源,影响存储在该Regionserver上其他表的操作,或者性能低下,那么怎么才能高效地将数据导入HBase呢?
ImportTsv是HBase官方提供了基于mapreduce进行批量数据导入的工具,ImportTsv可以将HDFS上的TSV格式(默认制表符分隔\t,或者自定义分隔符的其他格式数据文件也可,逗号‘,’分隔的txt亲测可以)的数据文件通过命令简单方便地导入到HBase中,对于大数据量的导入非常实用。
三、数据导入
ImportTsv进行数据导入有两种方式:
1、直接导入(使用TableOutputFormat在map中插入)
使用方法:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c &tablename& &hdfs-inputdir&
-Dimporttsv.columns即导入的列,例如:-Dimporttsv.columns=cf:col1,cf:col2…
hdfs-inputdir即数据文件在HDFS的路径,例如:/hbase_tsv_input
如果使用的不是制表符\t分隔,请指定参数:’-Dimporttsv.separator=,’
命令举例:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=cf:col1,cf:col2 test /hbase_tsv_input
至此,第一种方式导入数据成功,在控制台会看到执行一些map任务,执行完成之后数据导入完成。
总结:这种方式,使用简单,一条命令搞定,但是在导入大批量数据的时候有可能会存在问题,尤其是column比较多的宽表导入的时候,会出现RegionTooBusyException,导致数据丢失,因此建议在数据量不是特别大并且column不是特别多的情况下使用。
使用bulk-load方式(通过mapreduce先生成HFile格式的文件,再执行CompleteBulkLoad命令将文件move到HBase相应目录。)
使用方法:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir &tablename& &hdfs-data-inputdir&
第一步中,在1的基础上添加了-Dimporttsv.bulk.output参数来指定output目录,即HFile的输出目录,此目录在执行前不能存在,如果存在请删除。
$ bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles &hdfs://storefileoutput& &tablename&
第二步就是讲HFile move到HBase相应的目录。第一个参数就是第一步中的output目录,tableName和1中相同,就是表名。
总结:bulk-load导入方式完成,等待执行结束即可,第一步可能会花费很长时间(62column1000万数据大约花费20分钟),第二步瞬间完成。这种方式对Regionserver更加友好一些,加载数据几乎不占用Regionserver的计算资源,因为只是在HDFS上生成HFile,移动HFile文件,然后通知HMaster将该Regionserver的一个或多个region上线,大数据量导入推荐使用此方式。
四、碰到的问题
在使用的过程中,可能会出现如下异常:
Encountered unrecoverable error from region server, additional details: row ' ' on table 'test'
出现上面异常的原因是执行命令的用户权限不够:
两种方案:
1.给output目录赋予权限
hadoop fs -chmod -R 777 $output
2.切换成有权限操做的用户执行。
本文已收录于以下专栏:
相关文章推荐
1、先把log.txt上传至hdsf。
2、在hbase中定义好表T_SYS_LOG。
3、bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv ...
HBase官方提供了基于Mapreduce的批量数据导入工具:Bulk load和ImportTsv。关于Bulk load大家可以看下我另一篇博文。通常HBase用户会使用HBase API导数,但...
如何成为一名机器学习的大咖?
对于机器学习,很多人的观点是:机器学习技术是今后所有技术人员都绕不过的一个门槛。 那么,普通程序员该学习机器学作为一名对机器学习心有向往的程序员,我该以什么样的姿势开始呢?
HBase本身提供了很多种数据导入的方式,通常有两种常用方式:
1、使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase
2、另一种方式就是...
记录一下HBase 0.96.0 利用ImportTsv和completebulkload 导入数据的方法。我的环境里用的是Yarn。
1、利用ImportTsv 将cvs文件导入到HBase
原文 :
 http://blog.csdn.net/wolf_soul/article/details/
一、HBase介绍
HBase是Apache Hadoo...
一、HBase介绍HBase是Apache Hadoop中的一个子项目,依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的命令就可以看到HBase数据存储文件夹的目录结构,还可...
网上大多数的文章都是使用hadoop端ImportTsv工具导入数据,但会遇到一堆缺少jar包的问题,解决办法就是拷贝hbase边的jar包拷贝到hadoop指定目录下。根据HBase官网介绍,可以选...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 hbase 导出csv 的文章

 

随机推荐