专栏首页将R与Cloudera Impala集成,以实现Hadoop上的实时查询

将R与Cloudera Impala集成,以实现Hadoop上的实时查询

介绍

Cloudera Impala支持Hadoop数据集上的低延迟交互式查询,这些数据集可以存储在Hadoop分布式文件系统(HDFS)或Hadoop的分布式NoSQL数据库HBase中。Impala的想法是使用Hadoop作为存储引擎,但远离MapReduce算法。相反,Impala使用分布式查询,这是一种从大规模并行处理数据库继承而来的概念。因此,Impala支持类SQL语言的查询(与Apache Hive相同),但可以比Hive更快地执行查询,将它们转换为MapReduce。您可以在之前的文章中找到有关Impala的更多详细信息。

R语言是最受欢迎的开源统计计算和图形软件之一。它可以处理各种数据源,从逗号分隔的文件(csv)到由URL引用到关系数据库的网页内容到NoSQL(例如MongoDB或Cassandra)以及Hadoop

由于通用的Impala ODBC驱动程序,R也可以与Impala集成。该解决方案将提供在Hadoop数据集上运行的快速交互式查询,然后可以在R内进一步处理或使数据可视化。

Cloudera Impala ODBC驱动程序

如下图所示,Impala运行在存储在HDFS或HBase中的数据集的顶部,用户可以通过多种方式与它交互。

一种选择是使用作为impala软件包一部分的impala-shell,并提供命令行界面。其他选择是使用Hue(Cloduera的Hadoop用户体验产品),这是一个基于Web浏览器的UI,提供查询编辑器以及能够针对Pig,Hive或Impala运行查询的其他功能。第三种选择是使用ODBC驱动程序并连接一些着名的流行BI工具Impala。

Cloudera为一些最受欢迎的领先分析和数据可视化工具(如Tableau,QlikView或Microstrategy)提供接口。它还可以提供通用的ODBC驱动程序,可用于连接各种工具。在这篇文章中,我们将会使用ODBC来演示如何集成R和Cloudera Impala。

安装R,RStudio服务器,Impala ODBC和RODBC

这篇文章介绍了 Impala安装。要在Linux环境中安装R(使用Fedora 19做为样例),我们需要执行以下命令:

# Install EPEL package - EPEL stands for Extra package for Enterprise Linux
$ sudo rpm -ivh http://mirror.chpc.utah.edu/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

$ sudo yum install R
================================================================================
 Package                Arch           Version               Repository    Size
================================================================================
Updating:
 R                      x86_64         3.0.2-1.el6           epel          20 k
Updating for dependencies:
 R-core                 x86_64         3.0.2-1.el6           epel          46 M
 R-core-devel           x86_64         3.0.2-1.el6           epel          90 k
 R-devel                x86_64         3.0.2-1.el6           epel          19 k
 R-java                 x86_64         3.0.2-1.el6           epel          20 k
 R-java-devel           x86_64         3.0.2-1.el6           epel          20 k
 libRmath               x86_64         3.0.2-1.el6           epel         116 k
 libRmath-devel         x86_64         3.0.2-1.el6           epel          24 k

Transaction Summary
================================================================================
Upgrade       8 Package(s)

R附带一个命令行解释器,但如果你想有一个更方便的开发环境,你可能更喜欢使用RStudio。RStudio有一个桌面版本以及一个基于Web浏览器的替代品,称为RStudio Server。他们可以从RStudio网站免费下载。我们将在这篇文章中使用RStudio Server。

要安装RStudio Server,您需要执行以下命令:

$ sudo yum install --nogpgcheck rstudio-server-0.97.551-x86_64.rpm

================================================================================
 Package           Arch   Version         Repository                       Size
================================================================================
Installing:
 rstudio-server    x86_64 0.97.551-1      /rstudio-server-0.97.551-x86_64  96 M
...

Transaction Summary
===================================================================
Install       3 Package(s)

为确保Impala ODBC驱动程序可以正常工作,并且可以在R中安装RODBC软件包(它将在本文后面展示),您还需要安装unixODBC和unixODBC-devel软件包:

$ sudo yum install unixODBC
$ sudo yum install unixODBC-devel

最后,您必须安装Cloudera Impala ODBC驱动程序。您可以从Cloudera网站下载,在这篇文章编写时,最新版本是2.5(驱动程序文件名为ClouderaImpalaODBC-2.5.5.1005-1.el6.x86_64.rpm)。要安装Impala ODBC驱动程序,需要在下载驱动程序后运行以下命令:

$ yum --nogpgcheck localinstall ClouderaImpalaODBC-2.5.5.1005-1.el6.x86_64.rpm

Impala ODBC驱动程序需要正确配置几个文件(驱动程序包中嵌入了需要编辑并复制到正确目录的模板文档)。这两个关键配置文件分别是odbc.init和cloudera.impalaodbc.ini。

odbc.ini应该看起来像这样:

[Impala]
# Description: DSN Description.
# This key is not necessary and is only to give a description of the data source.
Description=Cloudera ODBC Driver for Impala (64-bit) DSN

# Driver: The location where the ODBC driver is installed to.
Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so

# Values for HOST, PORT, KrbFQDN, and KrbServiceName should be set here.
# They can also be specified on the connection string.
HOST=localhost
PORT=21050
Database=default

在cloudera.impalaodbc.ini配置文件中,我们有以下设置:

#SimbaDN / unixODBC
ODBCInstLib = libodbcinst.so

另外,我们需要定义如下的环境变量:

$ export LD_LIBRARY_PATH=/usr/local/lib:/opt/cloudera/impalaodbc/lib/64
$ export ODBCINI=/etc/odbc.ini
$ export SIMBADN=/etc/cloudera.impalaodbc.ini

最后一步是为R安装RODBC软件包。您可以使用R命令行工具执行此操作:

$ R
>install.packages("RODBC")

使用R和Impala分析Hadoop数据集

现在我们准备开始使用R和Impala分析我们的Hadoop数据集。我们将演示他们如何使用股票价格信息一起工作。您可以从http://finance.yahoo.com(股票代码:GOOG)下载Google股票价格。下载表格文件后,您需要从文件中删除第一行(标题),然后使用Hadoop文件系统shell(HDFS Shell)将其加载到HDFS中。

$ hadoop fs -mkdir /user/cloudera/stock
$ hadoop fs -put google.csv /user/cloudera/stock
$ hadoop fs -ls /user/cloudera/stock
Found 1 items
-rw-r--r--   3 cloudera cloudera     126379 2013-11-22 12:22 /user/cloudera/stock/google.csv

现在我们可以登录到Impala Shell来创建我们的表。Impala有类SQL的查询语言,所以您可以使用熟悉的’CREATE TABLE‘命令。外部命令标明物理数据文件不在Impala中进行管理; 即使删除表格,这些文件也会保存在HDFS目录中。

在创建表之后,我们可以运行’SHOW TABLES‘语句来验证表可以从Impala访问。我们也可以从impala-shell 运行一条’SELECT‘语句来显示股票表中的几行。

$ impala-shell
[localhost.localdomain:21000] > create external table stock (stock_date string, stock_open float, stock_high float, stock_low float, stock_close_ float, stock_volume int, stock_adjclose float) row format delimited fields terminated by ',' lines terminated by '\n' location '/user/cloudera/stock/';
...
[localhost.localdomain:21000] > show tables;
Query: show tables

+-------+
| name  |
+-------+
| stock |
+-------+
Returned 1 row(s) in 0.01s
[localhost.localdomain:21000] > select * from stock limit 3;
...
+------------+-------------------+-------------------+-------------------+-------------------+--------------+-------------------+
| stock_date | stock_open        | stock_high        | stock_low         | stock_close_      | stock_volume | stock_adjclose    |
+------------+-------------------+-------------------+-------------------+-------------------+--------------+-------------------+
| 2013-11-21 | 1027              | 1038.31005859375  | 1026              | 1034.069946289062 | 1091800      | 1034.069946289062 |
| 2013-11-20 | 1029.949951171875 | 1033.359985351562 | 1020.359985351562 | 1022.309997558594 | 963700       | 1022.309997558594 |
| 2013-11-19 | 1031.719970703125 | 1034.75           | 1023.049987792969 | 1025.199951171875 | 1116400      | 1025.199951171875 |
+------------+-------------------+-------------------+-------------------+-------------------+--------------+-------------------+
Returned 3 row(s) in 0.37s

下一步是启动R命令行工具。为了在R上运行相同的Impala SELECT语句,我们需要从R执行以下命令:

$ R
> library("RODBC");
> conn <- odbcConnect("Impala")
> result <- sqlQuery(conn, "select * from stock limit 3")
> result
  stock_date stock_open stock_high stock_low stock_close_ stock_volume
1 2013-11-21    1027.00    1038.31   1026.00      1034.07      1091800
2 2013-11-20    1029.95    1033.36   1020.36      1022.31       963700
3 2013-11-19    1031.72    1034.75   1023.05      1025.20      1116400
  stock_adjclose
1        1034.07
2        1022.31
3        1025.20

如上所述,如果您想要使用更加便捷的R环境以及诸如调试,包管理,文件系统导航等各种高级功能,那么RStudio是一个很好的选择。如果您安装了RStudio Server,它可以作为桌面应用程序或通过Web浏览器运行。如果是第二个选项,可以通过http://hostname:8787访问RStudio,并且可以使用您的Linux用户名和密码进行登录。

在从浏览器访问RStudio之前,您还需要在您的主目录中的.Renviron文件中设置以下环境变量:

$ cat .Renviron 
LD_LIBRARY_PATH=/usr/local/lib:/opt/cloudera/impalaodbc/lib/64
ODBCINI=/etc/odbc.ini
SIMBAINI=/etc/cloudera.impalaodbc.ini

现在您可以登录到RStudio并执行与我们在命令行工具中相同的R命令,请参见下图。

您还可以绘制数据集的图形表示,如下所示。该图显示了2013年Google股票价格的线形图:

生成此图的实际R命令如下所示:

> library("RODBC");
> conn <- odbcConnect("Impala")
> result <- sqlQuery(conn, "select stock_date, stock_close from stock where stock_date > '2013' order by stock_date asc limit 300")
> result
    stock_date stock_close
1   2013-01-02      723.25
2   2013-01-03      723.67
3   2013-01-04      737.97
...

> plot(result$stock_close, lwd="1", xlab="Days", ylab="Price (USD)")
> lines(result$stock_close, lwd="2")
> axis(1, result$stock_date, labels=result$stock_date)

结论

Cloudera Impala是一项令人兴奋的新技术,可以在Hadoop环境中提供实时的交互式查询。它支持ODBC接口,这使它可以与许多流行的商业智能工具和统计软件(如R. Together R和Impala)进行集成,为数据分析师高效处理海量数据集提供了一个很好的组合,并且它还可以支持图形化表示结果集。

本文的版权归 Nikoace 所有,如需转载请联系作者。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在Docker中开发Java 8 Spring Boot应用程序

    在本文中,我将向您展示如何使用Java 8开发和运行简单的Spring Web应用程序,而无需在本地计算机上安装Java 8。

    Nikoace
  • Docker的企业级部署

    Docker现在十分热门。这个开源项目向全世界展示了软件容器化的力量。引用维基百科的话,“Docker使用Linux内核的资源隔离功能,允许独立的容器在一个Li...

    Nikoace
  • Redis(6)——zset有序集合

    有序集合保留了集合不能有重复成员的特性,有序集合的元素可以排序,但是它和列表使用索引下标作为排序不同,有序集合给每个元素设置一个分数score 作为排序的依据。

    羊羽shine
  • Github 项目推荐 | 在线新闻评论分析数据集——SOCC

    SOCC 是一个用于分析在线新闻评论的语料库,该语料库里包含了大量的新闻及相关的新闻评论。库中搜集的文章都是评论文章,不是纯的新闻资讯,它比当前任何可用的新闻评...

    AI研习社
  • 基于非递归算法的汉诺塔游戏之Python实现

    本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和...

    Python小屋屋主
  • DAY95:阅读Managing Data Visibility and Concurrent CPU

    Until now it was assumed that for SM architectures before 6.x: 1) any active ker...

    GPUS Lady
  • golang语言的办公工作流的包

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • 一文搞懂蓝绿发布、灰度发布和滚动发布

    应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。

    kirito-moe
  • 一文搞懂蓝绿发布、灰度发布和滚动发布

    应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。

    我的小碗汤
  • h5标签入门

    RobinsonZhang

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动