찾다
데이터 베이스MySQL 튜토리얼HBase数据迁移(3)-自己编写MapReduce Job导入数据

HBase数据迁移(3)-自己编写MapReduce Job导入数据

Jun 07, 2016 pm 04:30 PM
hbasemapreduce데이터쓰다소유하다이주하다

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨 本篇文章是对数据合并的系列文章之三(共三篇),针对的情景模式就是将现有的各种类型的数据库或数据文件中的数据转入至 HBase 中。 系列之一 ???《HBase数据迁移(1)- 通过单个

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨

本篇文章是对数据合并的系列文章之三(共三篇),针对的情景模式就是将现有的各种类型的数据库或数据文件中的数据转入至HBase中。

系列之一 ???《HBase数据迁移(1)- 通过单个客户端导入MySQL数据》
系列之二 ???《HBase数据迁移(1)- 使用bulk load 工具从TSV文件中导入数据》

尽管在将文本文件加载入HBaseimporttsv工具十分高效,但在许多情况下为了完全控制整个加载过程,你可能更想自己编写MapReduce?JobHBase导入数据。例如在你希望加载其他格式文件时不能使用importtsv工具。

HBase提供TableOutputFormat?用于在MapReduce?Job中向HBase的表中写入数据。你也可以使用HFileOutputFormat?类在MapReduce?Job中直接生成HBase自有格式文件HFile,之后使用上一篇(迁移2)中提到的completebulkload?工具加载至运行的HBase集群中。在本文中,我们将详细解释如何编写自己的MapReduce?Job来加载数据。我们会先介绍如何使用TableOutputFormat,在更多章节中介绍在MapReduce?Job中直接生成HBase自有格式文件HFile

准备

我们本文中使用?“美国国家海洋和大气管理局?1981-2010气候平均值”的公共数据集合。访问http://www1.ncdc.noaa.gov/pub/data/normals/1981-2010/。?在目录?products?|?hourly?下的小时温度数据(可以在上述链接页面中找到)。下载hly-temp-normal.txt文件。对于下载的数据文件无需进行格式处理,我们将使用MapReduce直接读取原始数据。

我们假设您的环境已经可以在HBase上运行MapReduce。若还不行,你可以参考一下之前的文章(迁移1、迁移2)。

如何实施

1.将原始数据从本地文件系统拷贝进HDFS

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文件,将HBaseJAR文件加入Hadoop的环境变量中:

hadoop@client1$ vi $HADOOP_HOME/conf/hadoop-env.sh
export HADOOP_CLASSPATH=/usr/local/hbase/current/hbase-0.92.1.jar

3.编写MapReduceJava代码并且打包为JAR文件。Java源码如下:

$ vi Recipe3.java
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);
return 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?Jobmapper类:

$ vi Recipe3.java
static class HourlyImporter extends
Mapper<longwritable text immutablebyteswritable put> {
private long ts;
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 + day;
byte[] bRowKey = Bytes.toBytes(rowkey);
ImmutableBytesWritable rowKey =  new ImmutableBytesWritable(bRowKey);
Put p = new Put(bRowKey);
for (int i = 1; i 
<p>5.<span style="font-family: 宋体;">为了能够运行</span><span style="font-family: 'Times New Roman';">MapReduce?Job</span><span style="font-family: 宋体;">需要将源码打包为</span><span style="font-family: 'Times New Roman';">JAR</span><span style="font-family: 宋体;">文件,并且从客户端使用</span><span style="font-family: 'Times New Roman';">hadoop?jar</span><span style="font-family: 宋体;">命令:</span></p>
<pre class="brush:php;toolbar:false">hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac.
chapter2.Recipe3 \
hly_temp \
/user/hac/input/2-3

检查结果。MapReduce?job的运行结果应当显示下内容:

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=239820800
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)=130220032
13/03/27 17:42:40 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1132621824
13/03/27 17:42:40 INFO mapred.JobClient:     Map input bytes=69176670
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()的下面两行:

TableMapReduceUtil.initTableReducerJob(tableName, null, job);
job.setNumReduceTasks(0);

2.替换代码

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.在命令行添加输出地址参数。编译并打包源码,然后在运行任务的命令行添加输出地址参数:

hac@client1$ $HADOOP_HOME/bin/hadoop jar hac-chapter2.jar hac.
chapter2.Recipe3 \
hly_temp \
/user/hac/input/2-3 \
/user/hac/output/2-3

4.完成bulk?load

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的写性能。以后我们会进行详细的描述。

HadoopHBase会生成若干日志。当集群中的MapReduce?Job加载数据时存在某些瓶颈或障碍时,检查日志可以给你一些提示。下面是一些比较重要的日志:

  • ?Hadoop/HBase/ZooKeeper的守护进程的GC日志
  • ?HMaster守护进程的日志

在将数据转移至HBase之前预先搭建域

HBase的每行数据都归属一个特定的域中。一个域中包含了一定范围内的排序号的HBase的数据行。域是由域服务器发布和管理的。

当我们在HBase中建立一个表后,该表会在一个单独的域启动。所有插入该表的数据都会首先进入这个域中。数据持续插入,当到达一个极限之后,域会被分为两份。称之为域的分离。分离的域会分布到其他域服务器上,以达到集群中的负载能够均衡。

如你所想,若我们能够将表初始化在预先建好的域上,使用合适的算法,数据加载的负载会在整个集群中平衡,并且加快了数据加载的速度。

我们将描述如何用预先建好的域来建立一个表。

准备

登入HBase的客户端节点

如何实施

在客户端节点上执行如下命令:

$ $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?Jobreduce数量从原本的110了,这就是预搭建域的数量:

这是因为Jobreduce的数量是基于目标表的域数量。

reduce数量增加,通常意味加载动作分布到多个服务器上面,所以job的运行速度会更快。

英文原文摘自:《HBase Administration Cookbook》??编译:ImportNew?-?陈晨

译文链接:http://www.importnew.com/3645.html

【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
InnoDB 버퍼 풀과 성능의 중요성을 설명하십시오.InnoDB 버퍼 풀과 성능의 중요성을 설명하십시오.Apr 19, 2025 am 12:24 AM

innodbbufferpool은 데이터와 인덱싱 페이지를 캐싱하여 디스크 I/O를 줄여 데이터베이스 성능을 향상시킵니다. 작업 원칙에는 다음이 포함됩니다. 1. 데이터 읽기 : BufferPool의 데이터 읽기; 2. 데이터 작성 : 데이터 수정 후 BufferPool에 쓰고 정기적으로 디스크로 새로 고치십시오. 3. 캐시 관리 : LRU 알고리즘을 사용하여 캐시 페이지를 관리합니다. 4. 읽기 메커니즘 : 인접한 데이터 페이지를 미리로드합니다. Bufferpool을 크기를 조정하고 여러 인스턴스를 사용하여 데이터베이스 성능을 최적화 할 수 있습니다.

MySQL 대 기타 프로그래밍 언어 : 비교MySQL 대 기타 프로그래밍 언어 : 비교Apr 19, 2025 am 12:22 AM

다른 프로그래밍 언어와 비교할 때 MySQL은 주로 데이터를 저장하고 관리하는 데 사용되는 반면 Python, Java 및 C와 같은 다른 언어는 논리적 처리 및 응용 프로그램 개발에 사용됩니다. MySQL은 데이터 관리 요구에 적합한 고성능, 확장 성 및 크로스 플랫폼 지원으로 유명하며 다른 언어는 데이터 분석, 엔터프라이즈 애플리케이션 및 시스템 프로그래밍과 같은 해당 분야에서 이점이 있습니다.

MySQL 학습 : 새로운 사용자를위한 단계별 안내서MySQL 학습 : 새로운 사용자를위한 단계별 안내서Apr 19, 2025 am 12:19 AM

MySQL은 데이터 저장, 관리 및 분석에 적합한 강력한 오픈 소스 데이터베이스 관리 시스템이기 때문에 학습 할 가치가 있습니다. 1) MySQL은 SQL을 사용하여 데이터를 작동하고 구조화 된 데이터 관리에 적합한 관계형 데이터베이스입니다. 2) SQL 언어는 MySQL과 상호 작용하는 열쇠이며 CRUD 작업을 지원합니다. 3) MySQL의 작동 원리에는 클라이언트/서버 아키텍처, 스토리지 엔진 및 쿼리 최적화가 포함됩니다. 4) 기본 사용에는 데이터베이스 및 테이블 작성이 포함되며 고급 사용량은 Join을 사용하여 테이블을 결합하는 것과 관련이 있습니다. 5) 일반적인 오류에는 구문 오류 및 권한 문제가 포함되며 디버깅 기술에는 구문 확인 및 설명 명령 사용이 포함됩니다. 6) 성능 최적화에는 인덱스 사용, SQL 문의 최적화 및 데이터베이스의 정기 유지 보수가 포함됩니다.

MySQL : 초보자가 마스터하는 필수 기술MySQL : 초보자가 마스터하는 필수 기술Apr 18, 2025 am 12:24 AM

MySQL은 초보자가 데이터베이스 기술을 배우는 데 적합합니다. 1. MySQL 서버 및 클라이언트 도구를 설치하십시오. 2. SELECT와 같은 기본 SQL 쿼리를 이해하십시오. 3. 마스터 데이터 작업 : 데이터를 만들고, 삽입, 업데이트 및 삭제합니다. 4. 고급 기술 배우기 : 하위 쿼리 및 창 함수. 5. 디버깅 및 최적화 : 구문 확인, 인덱스 사용, 선택*을 피하고 제한을 사용하십시오.

MySQL : 구조화 된 데이터 및 관계형 데이터베이스MySQL : 구조화 된 데이터 및 관계형 데이터베이스Apr 18, 2025 am 12:22 AM

MySQL은 테이블 구조 및 SQL 쿼리를 통해 구조화 된 데이터를 효율적으로 관리하고 외래 키를 통해 테이블 ​​간 관계를 구현합니다. 1. 테이블을 만들 때 데이터 형식을 정의하고 입력하십시오. 2. 외래 키를 사용하여 테이블 간의 관계를 설정하십시오. 3. 인덱싱 및 쿼리 최적화를 통해 성능을 향상시킵니다. 4. 데이터 보안 및 성능 최적화를 보장하기 위해 데이터베이스를 정기적으로 백업 및 모니터링합니다.

MySQL : 주요 기능 및 기능이 설명되었습니다MySQL : 주요 기능 및 기능이 설명되었습니다Apr 18, 2025 am 12:17 AM

MySQL은 웹 개발에 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 주요 기능에는 다음이 포함됩니다. 1. 다른 시나리오에 적합한 InnoDB 및 MyISAM과 같은 여러 스토리지 엔진을 지원합니다. 2.로드 밸런싱 및 데이터 백업을 용이하게하기 위해 마스터 슬레이브 복제 기능을 제공합니다. 3. 쿼리 최적화 및 색인 사용을 통해 쿼리 효율성을 향상시킵니다.

SQL의 목적 : MySQL 데이터베이스와 상호 작용합니다SQL의 목적 : MySQL 데이터베이스와 상호 작용합니다Apr 18, 2025 am 12:12 AM

SQL은 MySQL 데이터베이스와 상호 작용하여 데이터 첨가, 삭제, 수정, 검사 및 데이터베이스 설계를 실현하는 데 사용됩니다. 1) SQL은 Select, Insert, Update, Delete 문을 통해 데이터 작업을 수행합니다. 2) 데이터베이스 설계 및 관리에 대한 생성, 변경, 삭제 문을 사용하십시오. 3) 복잡한 쿼리 및 데이터 분석은 SQL을 통해 구현되어 비즈니스 의사 결정 효율성을 향상시킵니다.

초보자를위한 MySQL : 데이터베이스 관리를 시작합니다초보자를위한 MySQL : 데이터베이스 관리를 시작합니다Apr 18, 2025 am 12:10 AM

MySQL의 기본 작업에는 데이터베이스, 테이블 작성 및 SQL을 사용하여 데이터에서 CRUD 작업을 수행하는 것이 포함됩니다. 1. 데이터베이스 생성 : createAbasemy_first_db; 2. 테이블 만들기 : CreateTableBooks (idintauto_incrementprimarykey, titlevarchar (100) notnull, authorvarchar (100) notnull, published_yearint); 3. 데이터 삽입 : InsertIntobooks (Title, Author, Published_year) VA

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.