无论是采用GDB调试impala或者尝试修改impala源码,前提都是需要本地环境编译impala,这篇文章详细的分享一下impala编译方法以及编译过程遇到的棘手的问题:

前言:

impala官方的git上其实是有impala编译的步骤的,但是在后来的git版本迭代中,被藏在了一个诡异的地方,https://github.com/cloudera/Impala/tree/v1.2.2,虽i然官方给出了步骤,但该博文并不是官方的一个简单翻译,其中涵盖了很多我加入的细节提醒和遇到的bug以及错误的解决方式,建议大家注意红色字体部分的内容。

impala目前已经是1.3.1版本,but,我前段时间编译的时候git hub上最新的release依然是1.2.2,所以为了怕版本不兼容问题以及不稳定出现的各种诡异bug,这篇博文也是基于1.2.2的源码进行编译的:

Building Cloudera Impala on CentOS 6.2

安装前准备

安装需要的组件

sudo yum install boost-test boost-program-options libevent-devel automake libtool flex bison gcc-c++ openssl-devel \

make cmake doxygen.x86_64 glib-devel boost-devel python-devel bzip2-devel svn libevent-devel cyrus-sasl-devel \

wget git unzip openldap-devel db4-devel

编译boost 1.46.1

Note: Impala requires Boost 1.4.2 or later.

由于boost版本太低导致的错误,

error: looser throw specifier for boost::rv<T>::~rv() [with T = impala::TNetworkAddress]

CentOS 6.2系统默认yum源中的boost和boost-devel版本是1.41,但是impala编译需要1.4.2以上的版本,因此需要做的是自己重新编 译boost,我用的是boost 1.46.1版本。

#删除已安装的boost和boost-devel
yum remove boost
yum remove boost-devel
#下载boost
#可以去(http://www.boost.org/users/history/)下载boost,选择指定版本
#下载后解压缩
tar xvzf boost_1_46_0.tar.gz
mv boost_1_46_0 /usr/local/
cd /usr/include
./bootstrap.sh

#编译boost:

第一种方法:

Boost在编译的时候应该使用命令,否则会出现找不到mt库的问题

./bjam --layout=tagged --mt install

mt库主要是boost多线程库,默认编译并不会编译出这些多线程的库文件,所以需要指定参数--layout=tagged。

第二种方法:

Boost绝对是个大坑,我换了台机器,采用上述命令,依然缺少libboost的相关包,应该是找不到libboost_datetime*的lib包,无奈,我采用完全编译的方式,重新编译boost:

./bjam --build-type=complete --layout=tagged --mt install

注意: Ubuntu 12.04 (and later) requires the libevent1-dev package to work with Thrift v0.9

Install LLVM

按照流程做即可,注意要在多台机器上编译安装Impala的话,只用在一台机器上执行下面绿色的部分,再把llvm分发到多台机器上执行后面红色部分的指令就可以了,没必要每个机器都通过svn下载一遍源代码,很费时。

wget http://llvm.org/releases/3.3/llvm-3.3.src.tar.gz

tar xvzf llvm-3.3.src.tar.gz

cd llvm-3.3.src/tools

svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_33/final/ clang

cd ../projects

svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_33/final/ compiler-rt

cd ..

./configure --with-pic

make -j4 REQUIRES_RTTI=1

sudo make install

提醒:一定不要忘了编译完的安装,即使是4个线程同时编,依然需要一段时间才能编完,这之后看到编译顺利完成,很容易忘记执行安装命令,转而做下面的步骤

LLVM请务必使用3.3版本,严格按照这个顺序装,否则会有各种莫名其妙的错误。

Install the JDK

Make sure that the Oracle Java Development Kit 6 is installed (not OpenJDK), and that JAVA_HOME is set in your environment.

Install Maven

按照步骤,设置一下环境变量即可,

Maven是为了后面build impala源代码 fe部分用的。

wget http://www.fightrice.com/mirrors/apache/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz

tar xvf apache-maven-3.0.4.tar.gz && sudo mv apache-maven-3.0.4 /usr/local

官网坑之一:该站点根本没有这个资源,没有maven3.0.4的资源,故wget 是失败的

正确的路径,我选择了3.0.5版本,命令如下:

http://www.interior-dsgn.com/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz

Add the following three lines to your .bashrc:

export M2_HOME=/usr/local/apache-maven-3.0.4

export M2=$M2_HOME/bin

export PATH=$M2:$PATH

And make sure you pick up the changes either by logging in to a fresh shell or running:

source ~/.bashrc

Confirm by running:

mvn -version

and you should see at least:

Apache Maven 3.0.4...

编译 Impala

Clone the Impala repository

克隆impala git

(此处可以直接下载源代码,解压到指定目录即可)

git clone https://github.com/cloudera/impala.git

运行配置impala环境变量的脚本

cd impala

. bin/impala-config.sh

Confirm your environment looks correct:

编译前检查你的环境是否正确:

下载需要的第三方库:

cd thirdparty

./download_thirdparty.sh

注意这里其中一个包cyrus-sasl-2.1.23可能下载失败,可以自行搜索(CSDN里面就有)下载下来然后解压缩到thirdparty 文件夹,最好是在执行完download_thirdparty.sh之后做这一步,因为download_thirdparty.sh会把所有目录下下 载下来的tar.gz给删除掉。

友情提醒:如果你是从别的已经安装好的机器,copy这两个压缩包或者解压文件夹到你的机器,要注意删除之前编译的缓存CMakeCache文件,不然会影响新的安装过程

Build Impala

cd ${IMPALA_HOME}

./build_public.sh -build_thirdparty

该脚本主要包括编译三部分的命令,第一部分是编译安装第三方库,第二部分是编译c++部分(be端),第三部分是用maven编译java部分(fe端)。

第一次build_thirdparty 彩色部分出现后如果失败,后面就不用加-build_thirdparty了,节省时间

结尾语(启动impala服务)

编译成功后,会有一个二进制的impalad在该目录下:

${IMPALA_HOME}/be/build/debug/service.

启动impalad服务:

${IMPALA_HOME}/bin/start-impalad.sh -use_statestore=false

Note that the start-impalad.sh script sets some environment variables that are necessary for Impala to run successfully.

The Impala Shell

The Impala shell is a convenient command-line interface to Cloudera Impala. To run from a source repository, do the following:

${IMPALA_HOME}/bin/impala-shell.sh

启动impala_shell需要用到的python:

#第一次执行impalad_shell可能会报错,这里需要安装python的两个包:thrift和prettytable,使用easy_install即可
easy_install prettytable
easy_install thrift

Python

easy_install,很方便的工具命令!

配置和启动

在配置、启动、使用Impala的时候可能遇到很奇葩的问题;

问题1Hive和Hadoop使用的版本

CDH对版本的依赖要求比较高,为了保证Impala正常运行,强烈建议使用Impala里面thirdparty目录中自带的Hadoop(native lib已经编译好的)和Hive版本。

Hadoop的配置文件在$HADOOP_HOME/etc/hadoop中,要注意的是需要启用native lib

#修改hadoop的core-site.xml,除了这个选项之外,其他配置和问题2中的core-site.xml一致

<property>

<name>hadoop.native.lib</name>

<value>true</value>

<description>Should native hadoop libraries, if present, be used.</description>

</property>

问题2Impala的配置文件位置

Impala默认使用的配置文件路径是在bin/set-classpath.sh中配置的,建议把CLASSPATH部分改成

CLASSPATH=\

$IMPALA_HOME/conf:\

$IMPALA_HOME/fe/target/classes:\

$IMPALA_HOME/fe/target/dependency:\

$IMPALA_HOME/fe/target/test-classes:\

${HIVE_HOME}/lib/datanucleus-core-2.0.3.jar:\

${HIVE_HOME}/lib/datanucleus-enhancer-2.0.3.jar:\

${HIVE_HOME}/lib/datanucleus-rdbms-2.0.3.jar:\

${HIVE_HOME}/lib/datanucleus-connectionpool-2.0.3.jar:

即要求Impala使用其目录下的Conf文件夹作为配置文件,然后创建一下Conf目录,把3样东西拷贝进来:core-site.xml、hdfs-site.xml、hive-site.xml。

core-site.xml的配置,下面几个选项是必须要配置的,

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://10.200.4.11:9000</value>

</property>

<property>

<name>dfs.client.read.shortcircuit</name>

<value>true</value>

</property>

<property>

<name>dfs.client.use.legacy.blockreader.local</name>

<value>false</value>

</property>

<property>

<name>dfs.client.read.shortcircuit.skip.checksum</name>

<value>false</value>

</property>

</configuration>

hdfs-site.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

<name>dfs.block.local-path-access.user</name>

<value>${your user}</value>

</property>

<property>

<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>

<value>true</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>${yourdatadir}</value>

</property>

<property>

<name>dfs.client.use.legacy.blockreader.local</name>

<value>false</value>

</property>

<property>

<name>dfs.datanode.data.dir.perm</name>

<value>750</value>

</property>

<property>

<name>dfs.client.file-block-storage-locations.timeout</name>

<value>5000</value>

</property>

<property>

<name>dfs.domain.socket.path</name>

<value>/home/extend/cdhhadoop/dn.8075</value>

</property>

</configuration>

最后是hive-site.xml,这个比较简单,指定使用DBMS为元数据存储即可(impala必须和hive共享元数据,因为impala无 法create table);Hive-site.xml使用mysql作为metastore的说明在很多地方都可以查到,配置如下:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://10.28.0.190:3306/impala?createDatabaseIfNotExist=true</value>

<description>JDBC connect string for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

<description>Driver class name for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>root</value>

<description>username to use against metastore database</description>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>root</value>

<description>password to use against metastore database</description>

</property>

</configuration>

记得把mysql-connector的jar包给拷贝到hive的lib里面去,同样也要拷贝给impala ( 拷贝至$IMPALA_HOME/fe/target/dependency)

启动Impala

 

#启动单机impala service

${IMPALA_HOME}/bin/start-impalad.sh -use_statestore=false

#启动impala shell

${IMPALA_HOME}/bin/impala-shell.sh

然后impala-shell就可以连接到localhost进行查询了;注意,这里只是单机查询,可以用来验证你的Impala是否正常work 了;

如何启动一个Impala集群:

Impala实际上由两部分组成,一个是StateStore,用来协调各个机器计算,相当于Master,然后就是Impalad,相当于Slave,启动方法如下:

#启动statestore

#方法1,直接利用impala/bin下面的这个python脚本

#这个脚本会启动一个StateStore,同时启动-s个数量的Impala Service在本机

$IMPALA_HOME/bin/start-impala-cluster.py -s 1 –log_dir /home/extend/impala/impalaLogs

#方法2,手动启动StateStore

$IMPALA_HOME/be/build/debug/statestore/statestored -state_store_port=24000

#启动impala service

#在每个编译安装了impala的节点上执行命令

#参数-state_store_host指定启动了stateStore的机器名

#-nn即namenode,指定hadoop的namenode

#-nn_port是namenode的HDFS入口端口号

$IMPALA_HOME/bin/start-impalad.sh -state_store_host=m11 -nn=m11 -nn_port=9000

正常启动之后,访问http://${stateStore_Server}:25010/ 可以看到StateStore的状态,其中的subscribers页面可以看到已经连接上的impala service node;

 启动impala-shell

$IMPALA_HOME/bin/impala-shell.sh

#启动之后可以随便连接一个impala service

connect localhost

#连接上之后就可以执行show tables之类的操作了

#需要注意的是,如果hive创建表或更新了表结构,impala的节点是不知道的

#在impala-shell中键入invalidate metadata 来更新元数据信息

#或者重启所有impala service

下期预告:impala-hbase-scan的源码级分析。

cloudera impala编译 安装 配置 启动的更多相关文章

  1. haproxy1.7编译安装配置

    #haproxy1.7编译安装配置#高可用.负载均衡 使用 #haproxy1.7编译安装配置 #centos7 x86_64 #高可用.负载均衡 使用 #下载 #http://www.haproxy ...

  2. azkaban编译安装配置文档

    azkaban编译安装配置文档 参考官方文档: http://azkaban.github.io/azkaban/docs/latest/ azkaban的配置文件说明:http://azkaban. ...

  3. nginx的编译安装以及启动脚本编写

    Nginx的编译安装和启动脚本的编写 Nginxd的功能强大,可以实现代理.负载均衡等企业常用的功能.下面介绍一下nginx的编译安装方法: 1. 下载 官方下载地址:http://nginx.org ...

  4. blfs(systemd版本)学习笔记-编译安装配置dhcpcd

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! dhcpcd项目地址:http://www.linuxfromscratch.org/blfs/view/stable-syst ...

  5. heartbeat 编译安装配置

    一.heartbeat介绍 heartbeat是HA高可用集群的一个重要组件,heartbeat实现了资源转移和心跳信息传递.它的常用组合方式为heartbeat v1,heartbeat v2+cr ...

  6. Linux下安装配置启动RabbitMQ

    Linux版本:Centos 7RabbitMQ依赖erlang所以需要先安装erlang以及他需要的环境 安装erlang http://www.erlang.org/downloads 拿最新的版 ...

  7. CentOS 7.4下源码编译安装配置LAMP环境详解

    CentOS 7.4搭建LAMP,LAMP:Linux.Apache.MySQL.PHP. 目录:第一部分 准备工作第二部分 安装Apache服务第三部分 安装MySQL服务第四部分 搭建PHP运行环 ...

  8. Linux下编译安装配置MariaDB数据库

    说明:操作系统:CentOS 6.6  64位MariaDB版本:mariadb-5.5.33aMariaDB数据库存放目录:/data/mysql准备:一.配置防火墙,开启3306端口vi /etc ...

  9. Visual Studio 2015编译安装配置QT5.5.1(含QTWEBKIT)

    尽管QT5.5.1和VisualStudio 2015都已经发布很久了,但是QT项目组视乎不会为QT5.5.1专门发布预编译的QT5.5.1 for windows(2015)版本的,也不会专门发布V ...

随机推荐

  1. react-native Android 全面屏手机 底部留有一大块黑屏

    解决方案:在AndroidManifest.xml 中 配置 <meta-data android:name="android.max_aspect" android:val ...

  2. cocos2d-x 3.0 场景切换特效汇总

    cocos2d-x 3.0中场景切换特效比較多,并且游戏开发中也常常须要用到这些特效.来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  3. 25个经典的Spring面试问答

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  4. android应用中插入admob广告

    Step One  登陆admob,注册用户 直接登陆http://www.admob.com/,用google的账号登陆 Step Two 登陆admob后,在站点和应用程序选项中 选择并添加and ...

  5. 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题

    我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSE ...

  6. 【JQuery Easy UI】后台管理系统的简单布局分享

    重要说明:本博已迁移到 石佳劼的博客.有疑问请到 文章新地址 留言..! 近期做的一个简单的后台管理系统,当中用到了JQuery Easy UI框架,对于撸主这样的把控件能摆整齐就谢天谢地的码农来说, ...

  7. vbox克隆虚拟机,网卡启动报错“Device eth0 does not seem to be present”

    vbox克隆虚拟机,网卡启动报错"Device eth0 does not seem to be present". 须要看以下三个地方:确保文件名称,设备名.mac地址都一致. ...

  8. maven+eclipse+mac+tomcat 多模块发布

    之前项目中有用到过maven,但是没运行过web的maven,所以这里记录一下. 项目的结构: ---master  //parent ---web-project // ---client-proj ...

  9. 不同手机根据坐标计算控件、图片的像素,px 与 dp, sp换算公式?

    参考该帖子:http://www.cnblogs.com/bluestorm/p/3640786.html PPI = Pixels per inch,每英寸上的像素数,即 "像素密度&qu ...

  10. 在多点环境下使用cas实现单点登陆及登出

    CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...