注:老规矩,不泄露公司信息
5 kettle与Hadoop
5.1 mysql与hive数据操作
5.1.1 mysql到hive
对于将关系型数据库的数据转移到hive第一想法就是直接将mysql源表的数据通过kettle抽取直接到hive目标表。流程是先使用“表输入”组件配置好数据库连接,将源表数据拿出来,然后使用“表输出”配置好hive数据库连接,将拿到的数据加载进在hive中建好的目标表中。Kettle转换脚本如图5.1所示。
图5.1 mysql到hive抽取
测试结果:读取源表数据成功,往hive表写数据慢,一条数据十分钟,不具备实用性。
原因:kettle对关系型数据库直接到nosql数据库的支持不是特别好。
5.1.2 mysql先到hdfs再进hive
为了解决直接将mysql 数据抽取到hive表中慢的问题。可以先将mysql数据以text文件的形式写到hdfs上,然后使用hive的load数据的命令将数据加载到事先建好的hive表中。Kettle脚本如图5.2所示。sql脚本如图5.3所示。
图5.2 mysql到hdfs到hive的流程
图5.3 hive目标表load数据的sql
首先,本地执行报错,错误是Could not close the output stream for file "hdfs://spark:***@xxxxx:xxxx/user/Administrator/orders4.txt".查明原因是由于kettle和hadoop集群不是在同一个网段造成的。在hadoop集群上配置好kettle的远程服务(见2.7节),kettle脚本采用远程执行的方式抽数成功。如图5.4所示。
图5.3 作业远程执行
5.1.3 hive-mysql
直接从hive数据库的源表中直接将数据抽取的mysql目标表的模式。同样是采用“表输入”和“表输出”的模式。
测试结果:快速可行。
5.2 hive-hive
此操作的目的是验证对hive数据库中表的清洗操作是否可行。采用“表输入”和“表输出”的结构,连接没有问题,但是,同样会存在直接往hive表中写数据慢的问题。
但是,解决这个问题可以建立一个job,使用执行sql脚本的方式来实现。
5.3 mysql-Hbase 数据操作(慢)
5.3.1 mysql-hbase
由于hbase的响应速度与效率是hive的10倍以上的数量级,因此对于hbase的数据迁移的操作也是必要的。Kettle作业采用“表输入”和“HbaseOutput”的模式,如图5.4所示。
图5.4 mysql到hbase的数据迁移
Hbase组件的配置信息如图5.5-5.6所示。
图5.5 连接配置
图5.6 映射编辑
图5.5是配置的连接hbase所需要的hadoop集群、配置文件hbase-site.xml、表名等信息。图5.6配置的是源表到目标表的映射关系和目标表的字段类型与列簇等信息。
测试报错:1.找不到节点名称UnknownHost exception
2.识别Host之后,找不到节点
解决方式:1.在windows上配置hosts文件,写入集群ip和主机名
2.在hbase-site.xml的路径前加file:///,表示是从本地寻找。
注意:传输数据优化
1. 写入hbase之前,建表的时候要进行预分区
2. 预读mapping
3. 加大写入缓存
4. 修改hbase配置文件/conf/hbase-site.xml,将hbase的堆内存增加到3GB(根据硬件资源)
结果:传输速度低,优化之前200条/秒,优化后1700条/秒。
5.3.2 hbase-mysql
转换采用“HbaseInput”和“表输出”的模式实现数据抽取。如图5.7所示。
图5.7 hbase到mysql取数
HbaseInput的配置信息入图5.8-5.9所示。
图5.8 Hbase查询配置
测试结果:快速有效。
5.4 mysql-phoenix(慢)
Apache Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问。Apache Phoenix会将用户编写的sql查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端。数据表的元数据存储在HBase的表中被会标记版本号,所以进行查询的时候会自动选择正确的schema。直接使用HBase的API,结合协处理器(coprocessor)和自定义的过滤器的话,小范围的查询在毫秒级响应,千万数据的话响应速度为秒级。安装见http://blog.csdn.net/m_signals/article/details/53086602。
首先将phoenix安装目录下的phoenix-*-client.jar和phoenix-core*.jar还有guava-13.0.jar(网上下载)复制到kettle的lib文件夹下。然后,配置phoenix数据库连接,链接类型选择Generic database,自定义链接URL: jdbc:phoenix:xxxxxxxxx:/hbase,自定义驱动类名称:org.apache.phoenix.jdbc.PhoenixDriver。如图5.9所示。
图5.9 phoenix数据库连接
将mysql的数据通过phoenix写入hbase中,转换脚本见图5.10。同样的通过phoenix将hbase里面的数据往mysql里面写采取同样的脚本模式。
图5.10 向hbase写数脚本
注意:
1. 当把连接phoenix必须的phoenix-*-client.jar放入kettle的lib目录后,会影响kettle直接对hbase的连接。
2. 传输速度低,速度1750条/秒。
同样,将hbase的数据通过phoenix取出来,写到mysql中只是一个相反的过程。但是测试结果显示,速度不理想,结果见图5.11。
图5.11 phoenix-mysql测试结果
性能分析:由于hbase是按列存储,这是 它的优势,测试对象orders表存在60+列,虽已经预先创建了6个列簇,但是取数性能依旧不理想。
5.5 Kettle提交Spark作业
目标:kettle使用“spark sbumit”控件对spark实现操作。不直接利用kettle编写scala程序,而是利用打好的jar包来操作spark。Job脚本见图5.12,图5.13为“spark submit”的设置信息。
图5.12 kettle操作spark
图5.13 spark submit的设置