APP下载

Java EE企业级应用向Hadoop平台迁移的技术研究*

2013-03-13郭庆

自动化与信息工程 2013年6期
关键词:数据量企业级调用

郭庆

(京华信息科技股份有限公司)

0 引言

企业级应用指的是支持企业、事业单位或者政府等机构各项业务运作的软件系统[1]。企业级应用主要负责显示、操作和存储大量复杂数据,并对这些数据进行支持和自动化[2]。随着社会的进步和网络技术的发展,众多企业和组织为了使业务能够与供应商、合作伙伴乃至最终用户更紧密地联系在一起,纷纷将企业级应用推向互联网。但面对海量的业务数据处理时,传统企业级应用架构在扩展性上遇到了瓶颈。近年迅速发展成熟起来的Hadoop平台以其高效和易扩展等特性受到高度关注,将企业级应用迁移到Hadoop平台成为应对海量数据处理技术挑战的新思路。本文围绕Java EE企业级应用迁移到Hadoop平台展开研究,分析比较各种技术方法,并根据实际应用情况提出相应的迁移策略。

1 Java EE企业级应用架构

Java平台企业版(Java Platform Enterprise Edition,Java EE),是Sun公司为企业级应用推出的标准平台,现属于Oracle公司[3]。Java EE自1998年发布以来得到了迅速地发展,已成为企业级应用的主流技术平台之一。以Java Pet Store[4]为代表,典型的Java EE企业级应用最主要的功能是围绕业务数据进行存储、操作和显示。整个系统一般可分为Web层、业务逻辑层和企业信息系统层(Enterprise Information Systems Tier)。应用运行在Java EE平台提供的容器中,容器为应用的每个层次提供了相应的功能支持,见表1。

表1 Java EE技术与系统层次的对应关系

容器提供的 API和运行环境的支持使得应用的代码实现更统一,为应用迁移提供了较清晰的切入点。

2 Hadoop平台功能

Hadoop[5]是由 Apache开源组织的一个分布式计算框架,设计用于在大量(廉价的)硬件设备上构建一个具有高可靠性和良好扩展性的集群系统,以分布式处理大数据集。Hadoop2.0包含以下模块:

1) Hadoop通用模块:支持其它Hadoop模块的通用工具集;

2) Hadoop分布式文件系统(HDFS):支持对应用数据高吞吐量访问的分布式文件系统;

3) Hadoop YARN:用于作业调度和集群资源管理的框架;

4) Hadoop MapReduce:基于YARN的大数据并行处理系统。

除了Hadoop本身,还有一大批以Hadoop为基础发展起来的开源项目,它们是Hadoop平台功能的补充和扩展,集合在一起形成了Hadoop生态系统[6]。

3 迁移技术

从前面的叙述可见,Hadoop平台的功能是针对大数据集存储和操作而设计的,因此本文研究的迁移是指在保持Java EE企业级应用业务功能不变的前提下,将其业务数据转移到Hadoop中存储,并使应用通过Hadoop实现对业务数据的访问和操作。

3.1 数据迁移

对于典型的Java EE企业级应用,业务数据的存储方式主要有2种:存放在关系型数据库中;以文件的形式存放在文件系统中。

3.1.1 关系型数据库迁移

考虑到迁移后数据查询和操作的便捷性及性能,对关系型数据库的数据迁移一般不直接存放到HDFS中,而是迁移到Hbase[7]、Canssandra[8]等分布式数据库中。以Hbase为例,从关系型数据库迁入数据有以下几类方法:

1) 直接调用Hbase的API

Hbase客户端包已提供了必要的方法,可编写Java程序进行调用,程序逻辑如下:

① 通过JDBC读出关系型数据库中的数据。

② 假设Hbase里已建立了对应的表。创建org.apache.hadoop.hbase.client.HTable类的实例,并连接到Hbase:

HTable table = new HTable(org.apache.hadoop.hbase.HBaseConfiguration.create(), 〈表名〉);

③ 创建org.apache.hadoop.hbase.client.Put类的实例,并将要写入Hbase的数据放入实例内:

Put p = new Put(〈主键值〉);

p.add(〈列族名〉, 〈列名〉,〈版本号〉, 〈值〉);

④ 将数据写入Hbase:

table.put(p);

使用这种方法迁移数据可以完成迁移过程,满足各种特殊需求。但是,当迁移的数据量大时,该方法的性能较低,且有一定的编码工作量。

2) 使用“Hadoop生态系统”中各项目提供的工具

Sqoop[9]是一个用于在Hadoop和关系型数据库之间传输数据的工具,对主流的关系型数据库如MySQL、Oracle等均能支持。使用Sqoop进行数据迁移的过程如下:

① 安装Sqoop,并在sqoop-env.sh中加入Hadoop集群的配置参数:

HADOOP_COMMON_HOME=〈Hadoop 安装路径〉

HADOOP_MAPRED_HOME=〈Hadoop MapReduce安装路径〉

HBASE_HOME=〈Hbase安装路径〉

② 复制hadoop的 core包以及关系型数据库的JDBC驱动包到sqoop-lib目录下。

③ 使用 sqoop-import命令进行数据迁移。命令格式如下:

./sqoop-import --connect 〈JDBC Url〉 --table 〈源表名〉 --hbase-create-table --hbase-table 〈Hbase表名〉--column-family 〈列族名〉 --hbase-row-key 〈键字段名〉 --split-by 〈字段名〉 --username 〈数据库用户名〉--P 〈数据库密码〉 --compression-codec 〈压缩方式〉–z

其中:

--connect 〈JDBC Url〉:指定要迁移数据的来源数据库;

--table 〈源表名〉:指定源数据库中要迁移数据的表;--hbase-create-table:表示要在HBase中建立表;--hbase-table 〈Hbase表名〉:指定数据要复制到Hbase中的目标表名称;

--column-family 〈列族名〉:指定要在目标表中建立的列族名称;

--hbase-row-key 〈键字段名〉:指定源数据表的哪个字段作为目标表的键;

--split-by 〈字段名〉:指定根据源数据表的哪个字段对源数据进行区域切分;

--compression-codec 〈压缩方式〉:指定压缩方式;

-z:表示采用压缩方式。

采用该方法迁移数据,其迁移过程使用MapReduce实现了分布并行,当迁移数据量较大时有较好的性能表现。

3) 其它方法

一些软件产品基于分布式数据库作了进一步封装,可将数据迁移到这些产品上,间接实现数据到分布式数据库的迁移。

例如开源项目Honeycomb[10],它是一个以Hbase为后端的MySQL存储引擎,能够使MySQL用Hbase存储数据,用户可以通过MySQL用SQL语言访问数据。使用MySQL+Honeycomb进行数据迁移的方法如下:

① 安装MySQL+Honeycomb。

② 在Hbase的配置文件hbase-site.xml中增加以下配置:

③ 修改Honeycomb的配置文件honeycomb.xml,将hbase.zookeeper.quorum节点的内容改为与Hbase相同的配置。

④ 启动 MySQL+Honeycomb,并在 MySQL中建立与源数据表相同结构的表:

create table 〈表名〉 (……表结构……) character set utf8 collate utf8_bin engine=honeycomb;

⑤ 使用MySQL迁移工具或其它ETL工具将源数据库的数据复制到 MySQL+Honeycomb中对应的表里。

3.1.2 文件迁移

Hadoop客户端包里的 org.apache.hadoop.fs.FileSystem类提供了必要的方法,可调用于编写Java程序,程序逻辑如下:

1) 获取 org.apache.hadoop.fs.FileSystem 类的实例:

FileSystem fs = FileSystem.get(〈HDFS URI〉,new org.apache.hadoop.conf.Configuration ());

2) 获取输出流:

fs.create(new org.apache.hadoop.fs.Path(〈HDFS 路径〉), true);

3) 打开源文件获取输入流,读取数据并写入到输出流中。

迁移时要记录好迁移前后文件路径的对应关系,以便修改应用进行访问。

3.2 数据访问逻辑迁移

应用数据迁移到Hadoop平台后,访问方式也发生了改变,需要相应修改应用对数据的访问逻辑。

3.2.1 关系型数据访问

“Hadoop生态系统”中的一些开源项目为用户提供了类似 SQL语言的数据访问方式,降低了应用迁移的难度。下面列出几个项目和 SQL语言的主要差异以及迁移要点:

1) Hive[11]

通过Hive访问数据有2个途径:一是通过Hive提供的 JDBC驱动类 org.apache.hadoop.hive.jdbc.HiveDriver进行访问;二是通过 Hive客户端类org.apache.hadoop.hive.service.HiveClient进行访问。

将SQL语句修改为Hive提供的查询语言HiveQL需要:

① 查询语句中对列取别名必须加上关键字“as”;② 表内连接查询必须用关键字“join”;

③ “in”子查询改为使用“left semi join”。例如:

④ 插入语句按以下语法修改:

⑤ Hive暂不支持事务,需要把事务相关的代码去除。

2) Phoenix[12]

应用可通过 Phoenix提供的 JDBC驱动类com.salesforce.phoenix.jdbc.PhoenixDriver对数据进行访问。应用需要调整的地方包括:

① Phoenix暂不支持表连接查询和嵌套子查询,需将SQL拆成多条分别执行;

② Update和Insert合并成Upsert,语法如下:Upsert into 〈表名〉 (〈列名 1〉,〈列名 2〉,……)values (〈值 1〉,〈值 2〉,……);

③ Phoenix暂不支持事务,需要把事务相关的代码去除;

3) Honeycomb

应用可通过MySQL提供的JDBC驱动类com.mysql.jdbc.Driver对数据进行访问。应用需要调整的地方包括:

① Honeycomb目前只支持UTF-8编码,应用需要相应更改;

② Honeycomb对数据表名大小写敏感,应用需要相应更改;

③ Honeycomb暂不支持事务,需要把事务相关的代码去除。

3.2.2 文件访问

Hadoop客户端包里的 org.apache.hadoop.fs.FileSystem类为用户访问HDFS中的文件提供了必要的方法,修改应用程序:

1) 将调用 java.io.File类的地方改为调用org.apache.hadoop.fs.FileSystem类相应的方法,涉及的文件路径改为HDFS中的路径;

2) 将使用 java.io.FileInputStream 的地方改为使用org.apache.hadoop.fs.FileSystem的open()方法获取输入流;

3) 将使用java.io.FileOutputStream的地方改为使用 org.apache.hadoop.fs.FileSystem 的 create()或append()方法获取输出流。

在实际迁移过程中,为降低代码修改的工作量,可以编写代理类分别继承于 java.io.File、java.io.FileInputStream和java.io.FileOutputStream,由代理类完成对Hadoop客户端包相关类的调用,然后通过动态代理或通过 ASM[13]框架修改字节码,替换掉应用中对 java.io.File、java.io.FileInputStream 和 java.io.FileOutputStream类的调用。

4 技术分析

通过前面叙述的各种技术方法能够实现将典型的Java EE企业级应用功能迁移到Hadoop平台上,但实施成本、约束条件和迁移效果等有所不同。各方法的简要对比如表2、表3所示。

表2 关系型数据库迁移技术对比

表3 关系型数据访问逻辑迁移技术对比

对于文件迁移的方法,一般都是通过调用Hadoop客户端包里提供的org.apache.hadoop.fs.FileSystem等类实现,在此不作展开比较。

5 迁移策略

在迁移时,需结合应用本身的实际情况以及各种迁移方法的特点,确定合理的迁移策略,力图使迁移达到代价最小化和收益最大化。迁移策略应遵循以下几个步骤制定:

1) 评估应用的数据量

Hadoop平台进行分布式计算时要产生跨多机数据流处理的开销,当处理的数据量较小时,这种开销的占比是不可接受的。因此,对数据量未达到TB级的功能应考虑不作迁移,以获得更佳的性能。对数据量较大的应用继续进行下一步判断。

2) 确定是否拥有应用系统源代码

是否拥有应用系统源代码决定了迁移工作开展的深度。若不具有应用系统源代码,应选择不需要大量修改应用系统代码的迁移技术方案:对结构化数据采用 Honeycomb进行迁移,对文件数据采用动态代理替换应用原有的访问逻辑。对于拥有源代码的应用系统继续进行下一步判断。

3) 平衡应用性能要求与迁移成本

在数据量极大的场景下,各种迁移技术的性能表现不一,总的来说迁移工作量较小的技术其性能也相对较差。针对不同的性能成本比要求,采用的迁移策略如表4所示。

6 迁移实例

以某OA系统为例子验证Java EE企业级应用迁移到Hadoop平台的可行性。进行迁移前已获得该系统的源代码,分析其数据访问逻辑结果如下:

1) 对结构化数据的访问兼容MySQL;

2) 文件数据分为业务数据和配置文件2类;

3) 系统存在用户上传文件的功能,该功能使用Apache的commons-fileupload.jar实现。

针对应用的特点采用如下迁移方法:

表4 性能成本比与迁移策略

1) 对结构化数据采用MySQL+Honeycomb进行迁移;

2) 调用Hadoop客户端包里的org.apache.hadoop.fs.FileSystem类将文件数据中的业务数据复制到HDFS中,并记录复制前后的目录对应关系;

3) 编写代理类,分别继承于java.io.File、java.io.FileInputStream、java.io.FileOutputStream、java.io.FileReader和java.io.FileWriter,覆盖其中的公有方法,将对文件系统的访问改为对 org.apache.hadoop.fs.FileSystem类相应方法的调用;

4) 对文件数据中的业务数据的访问逻辑通过ASM框架修改字节码替换为对代理类的访问;

5) 对文件数据中的配置文件的访问逻辑不作更改;

6) 对Apache的commons-fileupload.jar中读写临时文件的逻辑不作更改,仅将 write方法中对java.io.FileOutputStream类的调用通过ASM框架修改字节码替换为对代理类的访问。

修改完成后运行系统,确认结构化数据均存放在Hbase中,业务数据文件均正确存放在HDFS中,应用系统各功能运行正常,说明Java EE企业级应用迁移到Hadoop平台是可行的。

7 结语

Hadoop平台及相关的开源项目为应用迁移提供了丰富的支持,借助本文列举的各种技术方法能够实现将典型的Java EE企业级应用迁移到Hadoop平台上。但同时应注意到各种迁移技术均有其优缺点,在实际进行应用迁移时,要充分考虑应用数据量、性能要求和迁移工作量等因素,选择合适的技术方案,保障迁移的成功,使 Java EE企业级应用真正享受到

Hadoop平台的强大功能。

[1]Gartner Group: IT Glossary - enterprise application software[EB/OL]. [2014-02-13]. http://www.gartner.com/it-glossary/enterprise-application-software.

[2]Martin Fowler: Patterns of Enterprise Application Architecture[M]Addison-Wesley Educational Publishers Inc, 2002.

[3]Java Community Process: JSR-000342 JavaTM Platform,Enterprise Edition 7 (Final Release) [EB/OL]. [2014-02-13].https://www.jcp.org/aboutJava/communityprocess/final/jsr342/index.html.

[4]Oracle Corporation: The Java Pet Store Referance Application[EB/OL].[2014-02-13]. http://www.oracle.com/technetwork/java/index-136650.html.

[5]Apache Foundation: Apache Hadoop [EB/OL]. [2014-02-13].http://hadoop.apache.org.

[6]Kai Wähner: Spoilt for Choice – How to choose the right Big Data / Hadoop Platform [EB/OL]. 2013.9 [2014-02-13].http://www.infoq.com/articles/BigDataPlatform.

[7]Apache Foundation: Apache Hbase [EB/OL]. [2014-02-13].http://hbase.apache.org.

[8]Apache Foundation: Apache Cassandra [EB/OL]. [2014-02-13].http://cassandra.apache.org.

[9]Apache Foundation: Apache Sqoop [EB/OL]. [2014-02-13].http://sqoop.apache.org.

[10]Altamira Corp: Honycomb [EB/OL]. [2014-02-13].https://github.com/altamiracorp/honeycomb.

[11]Apache Foundation: Apache Hive [EB/OL]. [2014-02-13].http://hive.apache.org.

[12]Apache Foundation: Apache Phoenix [EB/OL]. [2014-02-13].http://phoenix.incubator.apache.org.

[13]E. Kuleshov: Using the ASM Framework to Implement Common Java Bytecode Transformation Patterns:proceedings of the Sixth International Conference on Aspect-Oriented Software Development, Vancouver, Canada,March 2007[C/OL]. [2014-02-13]. http://asm.ow2.org/current/asm-transformations.pdf.

猜你喜欢

数据量企业级调用
企业级BOM数据管理概要
基于大数据量的初至层析成像算法优化
高刷新率不容易显示器需求与接口标准带宽
宽带信号采集与大数据量传输系统设计与研究
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
加快推动企业级SaaS云服务体系化发展
基于慕课网的“企业级应用开发”课堂教学改革探索
HP企业级性能SSD PCI—E 3.0×16通道方案
利用RFC技术实现SAP系统接口通信