展颜小盆友离开我已经一个礼拜了,今天晚上就要回来了。在这漫长的、无聊的等待中,研究了一下SAP Sybase
IQ15.4如何连接Apache Hadoop的问题。
1.SAP
Sybase IQ15.x对大数据的支持
Hadoop在大数据领域很火。它是Apache的一个开源项目,主要由MepReduce
framework与分布式文件系统(HDFS)组成。利用Hadoop提供的MepReduce
Framework以及HDFS,使用廉价的硬件堆积起来就可以处理海量的非结构化数据。但Hadoop与传统的RDBMS相比,Hadoop更适合批量处理非结构化数据,而在事务处理方面存在短板。因此Hadoop是传统RDBMS的一个补充,并不会取代传统RDBMS。
SAP Sybase
IQ15.x以来加入了许多对大数据的支持,例如IQ15.0支持VLDB分区;IQ15.1新增了数据库内分析(In-Database
Analytics);IQ15.2增加了Text index,可以对非结构化数据进行分词,进行高效检索;IQ15.3支持PlexQ
MPP架构,一个查询负载可以分担到多个IQ节点上去。到了Sybase
IQ15.4,IQ则可以对接Hadoop,并且支持native的MapReduce API。IQ
15.4对接Hadoop的方法有如下几种:
Client Side Federation:使用客户端工具,例如Quest Toad
for Cloud,可以同时查询Sybase IQ15.4和Hadoop,并且两者数据可以做关联查询
Load Hadoop Data into Sybase IQ column store:
Apache的ETL工具SQOOP已经得到Sybase认证,使用它可以将Hadoop中的数据加载到Sybase IQ中
Join HDFS data with Sybase IQ data on the
fly:使用Sybase IQ15.4的新功能Table
UDF,可以获取HDFS中的数据,并且可以像其普通数据表一样进行SQL查询,这些数据可以与IQ中的其他数据作Join
Combine results of Hadoop MR jobs with Sybase IQ data
on the fly:使用Sybase IQ15.4的新功能Table UDF触发Hadoop的MapReduce
Job,并且获取其结果集,这些结果集可以与IQ中的数据作Join。
本例使用上述的第三种方法做测试。
2.Hadoop的安装
Hadoop安装方式有单节点模式、Pseudo-Distributed Operation、Cluster
Setup。本次安装使用Cluster Setup。Hadoop由若干节点组成,其中一个NameNode(Master),
若干DataNode(Slave)。在这些节点上会执行MapReduce
Jobs,Jobs包括一个JobTracker和若干TaskTracker,Jobs的协调分配是由JobTracker来完成的。本次测试用两台Linux主机:
10.129.97.110,shx64a,
作为NameNode,DataNode,以及跑JobTracker,TaskTracker,既做Master又做Slave
10.129.97.109, shx64b, 作为DataNode,
以及跑TaskTracker,作为Slave
安装过程很简单:
两台机器上分别增加hadoop用户
从Apache网站上获取最新的Hadoop版本,使用hadoop用户分别在两台主机上安装,安装目录保持一致
Hadoop在发起Job的时候,会使用ssh调用其它节点的java进程。因此需要配置ssh,使得master在不使用密码的情况下远程调用各个slave节点的命令。Master节点使用hadoop账号:
ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >>
~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
copy
id_dsa.pub文件到各个slave节点的hadoop账号的~/.ssh/下,重命名为master.pub,在各个slave节点使用hadoop账号:
cat ~/.ssh/master.pub >>
~/.ssh/authorized_keys
chmod go-w $HOME $HOME/.ssh
chmod 600 $HOME/.ssh/authorized_keys
chown whoami
$HOME/.ssh/authorized_keys
测试在master节点上使用ssh执行远程slave节点的命令,确保能够成功
修改master节点的hadoop配置文件,内容如下:
[hadoop@shx64a hadoop-1.0.2]$ cat conf/core-site.xml
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl”
href=”configuration.xsl”?>
<!– Put site-specific property overrides in this
file. –>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://shx64a:9000</value>
</property>
</configuration>
[hadoop@shx64a hadoop-1.0.2]$ cat conf/hdfs-site.xml<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl”
href=”configuration.xsl”?>
<!– Put site-specific property overrides in this
file. –>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
[hadoop@shx64a hadoop-1.0.2]$ cat conf/mapred-site.xml<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl”
href=”configuration.xsl”?>
<!– Put site-specific property overrides in this
file. –>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>shx64a:9001</value>
</property>
</configuration>
修改conf/master和conf/slaves文件如下:
[hadoop@shx64a conf]$ cat mastersshx64a
[hadoop@shx64a conf]$ cat slavesshx64b
shx64a
将上述修改复制到所有Slave节点
scp -r ./conf 10.129.97.109:/home/hadoop/hadoop-1.0.2/
启动Hadoop
bin/hadoop namenode -format
bin/start-dfs.sh
bin/start-mapred.sh
一切顺利的话,将成功启动Hadoop。
状态检查
使用
<img src="/oldimg/50/https://www.ut163.com/wp-content/uploads/2019/08/20190827124524-15.jpg" alt="SAPSybaseIQ15.4connecttoApacheHadoop” />
有两个TaskTrackers节点:
<img src="/oldimg/50/https://www.ut163.com/wp-content/uploads/2019/08/20190827124524-91.jpg" alt="SAPSybaseIQ15.4connecttoApacheHadoop” />
HDFS中的目录内容:
<img src="/oldimg/50/https://www.ut163.com/wp-content/uploads/2019/08/20190827124524-32.jpg" alt="SAPSybaseIQ15.4connecttoApacheHadoop” />
bin/hadoop fs -put conf input
bin/hadoop jar hadoop-examples-*.jar grep input output
‘dfs[a-z.]+’
bin/hadoop fs -cat output/*
1
dfs.replication
1
dfs.server.namenode.
1
dfsadmin
bin/hadoop fs -put test.txt input/test.txt
bin/hadoop jar hadoop-examples-1.0.2.jar wordcount input/test.txt
output2
bin/hadoop fs -cat output2/*
输出省略。
两个MapReduce例子都比较简单,源码见Hadoop示例。
下面的目标是能够从SybaseIQ中读取第一个MapReduce例子的输出结果。
3.在SAP Sybase
IQ15.x中访问Hadoop中的数据
在SybaseIQ15.4中如此操作:
START EXTERNAL ENVIRONMENT JAVA;
INSTALL JAVA NEW JAR ‘commons-configuration-1.6’ FROM FILE
‘/home/hadoop/hadoop-1.0.2/lib/commons-configuration-1.6.jar’;
INSTALL JAVA NEW JAR ‘commons-lang-2.4’ FROM FILE
‘/home/hadoop/hadoop-1.0.2/lib/commons-lang-2.4.jar’;
INSTALL JAVA NEW JAR ‘commons-logging-1.1.1’ FROM FILE
‘/home/hadoop/hadoop-1.0.2/lib/commons-logging-1.1.1.jar’;
INSTALL JAVA NEW JAR ‘hadoop-core-1.0.2’ FROM FILE
‘/home/hadoop/hadoop-1.0.2/hadoop-core-1.0.2.jar’;
INSTALL JAVA NEW JAR ‘udf’ FROM FILE
‘/home/hadoop/hadoop-1.0.2/lib/udf.jar’;
CREATE or REPLACE PROCEDURE hadoop()RESULT ( c1
INTEGER , c2 VARCHAR(255) ) EXTERNAL NAME
‘example.RowGenerator.rowGenerator2([Ljava/sql/ResultSet;)V’LANGUAGE
JAVA;
上述除了udf.jar以外都是hadoop自带的jar包,需要导入到IQ的运行环境中。udf.jar是访问Hadoop
HDFS的java程序编译后的class文件.源代码参见:
https://skydrive.live.com/redir.aspx?cid=cec8f5c16b84b612&resid=CEC8F5C16B84B612!151&parid=CEC8F5C16B84B612!141
上述代码中访问HDFS部分借鉴了网络上共享的某些代码。
在IQ中访问Hadoop中的数据,需要使用IQ15.4的一个New Feature——Table UDF。上面的
CREATE or REPLACE PROCEDURE hadoop()RESULT ( c1 INTEGER , c2
VARCHAR(255) ) EXTERNAL NAME
‘example.RowGenerator.rowGenerator2([Ljava/sql/ResultSet;)V’LANGUAGE
JAVA;
使用Java语言创建了一个Table
UDF,访问Hadoop数据的过程封装在外部example.RowGenerator.rowGenerator2中。
如此以来,我们就可以在SybaseIQ中访问Hadoop中的数据了:
(DBA)> select * from hadoop() where
c2=’dfsadmin’
c1
c2
———————————————————————————————-
1dfsadmin
(1 rows)
Execution
time: 0.082 seconds
4
结语
SybaseIQ15.4到Hadoop,虽然走通了,但该方法适用于访问Hadoop中较小数据量的场景。如果要访问的HDFS中的数据量较大时,采用该方法未必效率最高。可以使用第一节介绍的四种方法中的第二种,使用ETL工具将Hadoop的MapReduce的结果数据加载到IQ中,这样既可以利用Hadoop海量非结构化处理的优势,也利用了SybaseIQ15.4列数数库的加载速度快、压缩比高、OLAP分析速度快的优势。