一、前言
Cloudera于近日释放了Impala 1.0版本,新的版本实现与Hadoop的完全整合,支持ANSI-92 SQL所有子集。Hive更是再次躺枪——在与Hive的对比中,Impala并发客户端处理的速度上甚至超越了单机Hive!
在去年10月刘江总编的报道中,我们首次认识了Impala这只高脚羚——其主要分布在东非,在Dremel的启发下开发。文章中还指出Impala不再使用缓慢的Hive+MapReduce批处理,而是通过与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或者HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。其架构如下图所示:
5月1日,Cloudera释放了Impala 1.0版本;对比旧版本,新的版本基于社区回馈和现实世界中不同的负载做出了修改,其根本的设计理念是与Hadoop无缝的整合——共同使用一个存储池、元数据模型、安全框架以及系统资源集。这种整合允许Impala用户从成本、灵活性、以及Hadoop交互式SQL查询中获利,并且能让Hadoop用户在MapReduce和其它的框架上做更好的SQL查询。最终达到所有的数据都可以做交互式分析以及做其它类型的处理,免去了ETL过程。
注:impala只提供64位系统RPM安装包,所以,请务必安装64位Linux操作系统。本手册安装基于64位CentoOS 6.4
安装基本环境介绍:(本次安装实验基于两台装有64位CentOS 6.4的虚拟机进行)
Master:cdh1,IP192.168.1.70
Slave:cdh2,IP192.168.1.71
JDK:jdk-7u21-linux-x64
MYSQL:MySQL-server-community-5.1.54-1.rhel5.x86_64
MySQL-client-community-5.1.54-1.rhel5.x86_64
二、JDK安装
从官网下载Linux 64痊JDK(本文选取的是64位解压版)
下载地址:http://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-linux-x64.tar.gz
本文下载到/opt/解压tar –zxvf jdk-7u21-linux-x64.tar.gz
配置环境变量
Vi /etc/profile,在文件末尾处加入
export JAVA_HOME=/opt/jdk1.7.0_21
export PATH=$JAVA_HOME/bin:$PATH
保存退出
然后source /etc/profile让环境变量生效,验证安装是否成功
[root@cdh1 ~]#java -version
java version"1.7.0_21"
Java(TM) SERuntime Environment (build 1.7.0_21-b11)
Java HotSpot(TM)64-Bit Server VM (build 23.21-b01, mixed mode)
三、hadoop-2.0.0-cdh4.2.0安装
3.1创建hadoop用户
在cdh1和cdh2分别创建hadoop用户.
useradd hadoop
passwd hadoop 6yhn7ujm
3.2配置SSH无密码访问
3.2.1修改主机名与配置host访问
1、分别修改master和slave /etc/sysconfig/network内容如下
cdh1:
NETWORKING=yes
HOSTNAME=cdh1
cdh2:
NETWORKING=yes
HOSTNAME=cdh2
2、修改两台现的/etc/hosts将IP与主机名相对应
vi /etc/hosts
cdh1:
192.168.42.128 cdh1
192.168.42.129 cdh2
cdh2:
192.168.42.128 cdh1
192.168.42.129 cdh2
重新启动计算机,使主机名生效
3.2.2生成密钥
两台机分别生成密钥
su hadoop切换到hadoop用户下
ssh-keygen -t rsa -f ~/.ssh/id_rsa
一路回车。
hadoop需要cdh1->cdh2的无密码访问和cdh1到cdh1的无密码访问(因为本次实验secondaryNamenode为cdh1)
cdh1 ->cdh2:
cdh1 : scp id_rsa.pub hadoop@cdh2:/home/hadoop/.ssh/cdh1.pub
cdh2 : cat cdh1.pub >> authorized_keys
cdh1 : chmod 644 id_rsa.pub
cdh2 : chmod 644 authorized_keys
cdh1 : chmod 700 ~/.ssh
上叙完成cdh1->cdh2的无密码访问,同理,在cdh1的~/.ssh/下
cat id_rsa.pub >> authorized_keys
chmod 644 id_rsa.pub
chmod 644 authorized_keys
chmod 700 ~/.ssh
完成cdh1到cdh1的无密码访问
3.3安装hadoop-2.0.0-cdh4.2.0
1、从cloudera官网下载hadoop-2.0.0-cdh4.2.0.tar.gzhttp://archive.cloudera.com/cdh4/cdh/4/hadoop-2.0.0-cdh4.2.0.tar.gz
使用hadoop用户将下载文件解压到安装目录,本文目录:/home/clodaera/hadoop-2.0.0-cdh4.2.0
本节定义HADOOP_HOME = /home/clodaera/hadoop-2.0.0-cdh4.2.0
并在/home/下建立hadoop_file,将文夹件授予给hadoop,用来设置hadoop相关目录
2、修改配置文件
在cdh1上
hadoop_home/etc/hadoop下
修改core-site.xml,加入如下配置
<property>
<name>fs.default.name</name>
<value>hdfs://cdh1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop_file/tmp</value>
</property>
修改hdfs-site.xml
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop_file/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop_file/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
修改yarn-site.xml
<property>
<name>yarn.resoucemanager.address</name>
<value>cdh1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>cdh1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>cdh1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>cdh1:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
设置环境变量:
修改/etc/profile 在最尾处加入如下内容
export HADOOP_HDFS_HOME=/home/hadoop/clodaera/hadoop-2.0.0-cdh4.2.0
export YARN_HOME=/home/hadoop/clodaera/hadoop-2.0.0-cdh4.2.0
export HADOOP_HOME=/home/hadoop/clodaera/hadoop-2.0.0-cdh4.2.0
su source /etc/profile,生效环境变量
3、将/home/clodaera/hadoop-2.0.0-cdh4.2.0整个目录及其内容传输到cdh2上,目录结构可同cdh1,并按cdh1所讲的修改和生效环境变量。
4、启动hadoop
启动之前,应先格式化文件系统
hadoop_home/bin下
./hadoop namenode -format
格式化成功后
在cdh1上,hadoop_home/sbin下。执行
错误是:The authenticity of host 192.168.0.xxx can't be established.
以前和同事碰到过这个问题,解决了,没有记录,这次又碰到了不知道怎么处理,还好有QQ聊天记录,查找到一下,找到解决方案:
执行ssh -o StrictHostKeyChecking=no 192.168.0.xxx 就OK
./start-all.sh来启动hadoop所有进程:(启动成功,输入如下信息)
cdh1:starting namenode, logging to /home/clodaera/hadoop-2.0.0-cdh4.2.0/logs/hadoop-hadoop-namenode-cdh1.out
cdh2:starting datanode, logging to/home/clodaera/hadoop-2.0.0-cdh4.2.0/logs/hadoop-hadoop-datanode-cdh2.out
Startingsecondary namenodes [0.0.0.0]
0.0.0.0:starting secondarynamenode, logging to /home/clodaera/hadoop-2.0.0-cdh4.2.0/logs/hadoop-hadoop-secondarynamenode-cdh1.out
starting yarndaemons
startingresourcemanager, logging to/home/clodaera/hadoop-2.0.0-cdh4.2.0/logs/yarn-hadoop-resourcemanager-cdh1.out
cdh2: startingnodemanager, logging to /home/clodaera/hadoop-2.0.0-cdh4.2.0/logs/yarn-hadoop-nodemanager-cdh2.out
若启动不成功:可查看日志分析出错原因
hadoop_home/logs/下
hadoop-hadoop-namenode-cdh1 关于hdfs namenode日志
hadoop-hadoop-secondarynamenode-cdh1关于hdfs secondarynamenode日志
yarn-hadoop-resourcemanager-cdh1.logyarn resourcemanager日志
同理,在cdh2上,也有相对应的日志信息
启动成功后,也可以通过浏览器访问:
http://192.168.1.70:8088/cluster
四、Mysql安装
由于本次实验采用MYSQL作为HIVE存储元,本次采用RPM安装MYSQL
1、建议以rpm方式安装,必须同时具备服务端和客户端两个rpm安装包;本文以rpm方式进行安装;
2、以mysql5.1.54安装为例,准备好rpm安装包
服务端:MySQL-server-community-5.1.54-1.rhel5.x86_64.rpm
客户端:MySQL-client-community-5.1.54-1.rhel5.x86_64.rpm
4.1安装开始
1、检查是否已经安装mysql
[root@localhost~]# rpm -qa|grep -i mysql
MySQL-server-community-5.1.54-1.rhel5
MySQL-client-community-5.1.54-1.rhel5
如果有显示则先卸载该mysql,如:
[root@localhost~]#rpm –e --nodeps MySQL-server-community-5.1.54-1.rhel5
[root@localhost~]#rpm –e --nodeps MySQL-client-community-5.1.54-1.rhel5
[root@localhost ~]# rm –rf /var/lib/mysql/
如果还有其他一些mysql包,用rpm命令卸载不了,可用yum命令强制卸载:
[root@localhost~]#yum remove mysql
2、新建mysql用户
[root@localhost ~]# useraddmysql
[root@localhost ~]# passwdmysql
3、创建以下三个目录
[root@localhost ~]# mkdir -p/home/mysql/mysqlLog/mysql-bin
[root@localhost ~]# mkdir -p /home/mysql/mysqldata/
[root@localhost ~]# mkdir -p /home/mysql/loggroup/
[root@localhost ~]# chown -R mysql:mysql /home/mysql
4、上传rpm安装包和my.cnf到服务器,如/home/mysql/下;将my.cnf拷贝至/etc/下:
[root@localhost mysql]# cpmy.cnf /etc
5、安装rpm包
[root@localhost mysql]# rpm-ivhMySQL-server-community-5.1.54-1.rhel5.x86_64.rpm
[root@localhost mysql]# rpm-ivhMySQL-client-community-5.1.54-1.rhel5.x86_64.rpm
如无错误提示且mysql启动成功则表示mysql安装成功
4.2安装后的配置
1、定制密码1qaz2wsx(根据自己需要修改)
[root@localhost mysql]# /usr/bin/mysqladmin -u root password 'root’
2、为数据库配置远程连接权限
--root用户登陆数据库
[root@localhost mysql]#mysql -u root -p root
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');
--采用授权法
--1、以用户名:root密码:1qaz2wsx从任何主机连接到mysql服务器
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;
--使配置生效
mysql>FLUSH PRIVILEGES;
3、查看数据引擎
mysql>show engines;
4、数据库安装目录
mysql数据库安装完成后,默认的安装目录为:/var/lib/mysql
4.3、设置开机启动
[root@localhost mysql]# echo “service mysql start” >> /etc/rc.d/rc.local
五、hive-0.10.0-cdh4.2.0安装
5.1、下载软件
从http://archive.cloudera.com/cdh4/cdh/4/hive-0.10.0-cdh4.2.0.tar.gz下载HIVE
本试验装HIVE安装在cdh1上,上传HIVE到/home/clodaera/.并解压
hive_home=/home/clodaera/hive-0.10.0-cdh4.2.0
5.2、修改HIVE配置文件
进入hive_home/conf/
将目录下的所有文件分别重命名,文件名去掉.template,
修改hive-default.xml为hive-site.xml
修改hive-site.xml内容,使HIVE用mysql作为存储元
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for aJDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for aJDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use againstmetastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use againstmetastore database</description>
</property>
在hive-site.xml中找到并修改上面四个属性。
特别提醒:官方的配置文件有些地方有语法错误,比如<description></description>这种没有配对出现,若没修改好,则启动时会报错,建议找出修改,若找不到,就在启动HIVE的时候,根据报错去修改。
3、加入HIVE的环境变量:在/etc/profile中加入以下
exportHIVE_HOME=/home/clodaera/hive-0.10.0-cdh4.2.0
exportHIVE_CONF_DIR=/home/clodaera/hive-0.10.0-cdh4.2.0/conf
4、加入连接驱动
将mysql连接驱动(本文采用mysql-connector-java-5.1.21.jar)复制到hive_home/lib目录下。
5.3、启动HIVE
进入hive_home/bin下
./hive
可以启动HIVE
Logging initializedusing configuration infile:/home/clodaera/hive-0.10.0-cdh4.2.0/conf/hive-log4j.properties
Hive historyfile=/tmp/hadoop/hive_job_log_hadoop_201306111624_1853532378.txt
SLF4J: Classpath contains multiple SLF4J bindings.
SLF4J: Foundbinding in [jar:file:/home/clodaera/hadoop-2.0.0-cdh4.2.0/share/hadoop/common/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Foundbinding in[jar:file:/home/clodaera/hive-0.10.0-cdh4.2.0/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Seehttp://www.slf4j.org/codes.html#multiple_bindings for an explanation.
hive>
测试
执行HQL create table hivtest(id int ,name string);
若有成功创建,在mysql中,会创建一个hive的数据库,进行如相操作,可查看HIVE创建的表:
六、impala 1.0.1安装
Impala由以下几块组成:
State Store:对应进程为statestored(笔者这里使用的Impala版本为1.0.1)
用于协调各个运行impalad的实例之间的信息关系,Impala正是通过这些信息去定位查询请求所要的数据。换句话说,state store的作用主要为跟踪各个impalad实例的位置和状态,让各个impalad实例以集群的方式运行起来。
与HDFS的NameNode不一样,虽然State Store一般只安装一份,但一旦State Store挂掉了,各个impalad实例却仍然会保持集群的方式处理查询请求,只是无法将各自的状态更新到State Store中,如果这个时候新加入一个impalad实例,则新加入的impalad实例不为现有集群中的其他impalad实例所识别(事实上,经笔者测试,如果impalad启动在statestored之后,根本无法正常启动,因为impalad启动时是需要指定statestored的主机信息的)。然而,State Store一旦重启,则所有State Store所服务的各个impalad实例(包括state store挂掉期间新加入的impalad实例)的信息(由impalad实例发给state store)都会进行重建。
Impalad:对应进程为impalad(核心进程,数据的计算就靠这个进程来执行)
该进程应运行在DataNode机器上(建议每个DataNode机器运行一个impalad,官方的意思似乎这种建议是必须的),每个impalad实例会接收、规划并调节来自ODBC或Impala Shell等客户端的查询。每个impalad实例会充当一个Worker,处理由其它impalad实例分发出来的查询片段(query fragments)。客户端可以随便连接到任意一个impalad实例,被连接的impalad实例将充当本次查询的协调者(Ordinator),将查询分发给集群内的其它impalad实例进行并行计算。当所有计算完毕时,其它各个impalad实例将会把各自的计算结果发送给充当Ordinator的impalad实例,由这个Ordinator实例把结果返回给客户端。每个impalad进程可以处理多个并发请求。
Impala shell:这是一个客户端工具
该客户端工具提供一个交互接口,供使用者发起数据查询或管理任务,比如连接到impalad。这些查询请求会传给JDBC这个标准查询接口。说白了,就是一个命令行客户端。日后你便是通过它来查询数据的。
6.1 impala安装下载
从http://archive.cloudera.com/impala/redhat/6/x86_64/impala/1/RPMS/x86_64/
下载该地址下的所有rpm包
从http://archive.cloudera.com/impala/redhat/6/x86_64/impala/1/RPMS/noarch/
下载bigtop-utils-0.4+300-1.cdh4.0.1.p0.1.el6.noarch.rpm
另外,安装需要libevent-1.4.13-4.el6.x86_64.rpm
可从http://rpm.pbone.net/index.php3?stat=26&dist=79&size=67428&name=libevent-1.4.13-4.el6.x86_64.rpm下载
若安装中还需要其它rpm包,可到http://rpm.pbone.net/搜索下载
6.2 impala安装
1、在datanodet和hive节点分别安装如下RPM包
rpm –ivh文件名
impala-1.0.1-1.p0.888.el6.x86_64.rpm
impala-server-1.0.1-1.p0.888.el6.x86_64.rpm
impala-state-store-1.0.1-1.p0.888.el6.x86_64.rpm
impala-shell-1.0.1-1.p0.888.el6.x86_64.rpm
libevent-1.4.13-4.el6.x86_64.rpm
bigtop-utils-0.4+300-1.cdh4.0.1.p0.1.el6.noarch.rpm
2、修改配置文件:
对于每台机的impala安装完成后。默认配置文件目录位于/etc/impala/conf
将cd1上的hive-site.xml、core-site.xml、hdfs-site.xml
三个文件复制到该目录下,并修改
hive-site.xml
在datanode的/etc/impala/conf/hiv-site.xml中修改
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.1.70:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for aJDBC metastore</description>
</property>
将mysql地址修改为mysql所在主机的IP
在所有主机/etc/impala/conf/hdfs-site.xml中加入如下配置
<property>
<name>dfs.client.use.legacy.blockreader.local</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>750</value>
</property>
<property>
<name>dfs.block.local-path-access.user</name>
<value>impala</value>
</property>
<property>
<name>dfs.client.file-block-storage-locations.timeout</name>
<value>3000</value>
</property>
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
3、impala启动会加载默认配置
修改每台机的/etc/default/impala(红色部分为要修改部分)
IMPALA_STATE_STORE_HOST=192.168.1.70
IMPALA_STATE_STORE_PORT=24000
IMPALA_BACKEND_PORT=22000
IMPALA_LOG_DIR=/var/log/impala
IMPALA_STATE_STORE_ARGS="-log_dir=${IMPALA_LOG_DIR} -state_store_port=${IMPALA_STATE_STORE_PORT}"
IMPALA_SERVER_ARGS="\
-log_dir=${IMPALA_LOG_DIR} \
-state_store_port=${IMPALA_STATE_STORE_PORT} \
-use_statestore \
-state_store_host=${IMPALA_STATE_STORE_HOST}\
-be_port=${IMPALA_BACKEND_PORT}"
ENABLE_CORE_DUMPS=false
LIBHDFS_OPTS=-Djava.library.path=/usr/lib/impala/lib
MYSQL_CONNECTOR_JAR=/home/clodaera/hive-0.10.0-cdh4.2.0/lib/mysql-connector-java-5.1.21.jar
IMPALA_BIN=/usr/lib/impala/sbin
IMPALA_HOME=/usr/lib/impala
HIVE_HOME=/home/clodaera/hive-0.10.0-cdh4.2.0
#HBASE_HOME=/usr/lib/hbase
IMPALA_CONF_DIR=/etc/impala/conf
HADOOP_CONF_DIR=/home/clodaera/hadoop-2.0.0-cdh4.2.0/etc/hadoop
HIVE_CONF_DIR=/home/clodaera/hive-0.10.0-cdh4.2.0/conf
#HBASE_CONF_DIR=/etc/impala/conf
在第一次启动impalad的时候,你可能会遇到impalad报类似找不到JDBC数据库驱动(假设为MySQL)的问题,其实是因为impalad默认使用的数据库驱动包的位置为:/usr/share/java/mysql-connector-java.jar,该配置默认由/etc/default/impala文件中的MYSQL_CONNECTOR_JAR项指定,读者可在~/.bash_profile文件中修改为自己的驱动文件路径,如下为笔者在~/.bash_profile中添加的项:
export MYSQL_CONNECTOR_JAR=/home/clodaera/hive-0.10.0-cdh4.2.0/lib/mysql-connector-java-5.1.21.jar,别忘了修改后执行一下source ~/.bash_profile来是修改生效
6.3启动impala
在hive所在节点启动statestored(默认端口为24000)
statestored-state_store_port=24000
如果statestore正常启动,可以在/tmp/statestored.INFO查看。如果出现异常,可以查看/tmp/statestored.ERROR定位错误信息。
在所有impalad节点上:
impalad -state_store_host=cdh1 -nn= cdh1 -nn_port=9001 -hostname=cdh2
如果impalad正常启动,可以在/tmp/ impalad.INFO查看。如果出现异常,可以查看/tmp/impalad.ERROR定位错误信息。
启动后,在hive使用impala-shell可进入impala shell
并使用connect xxx.xxx.xxx.xxx连接到impala
多个impala则执行多次connect
本实验connect 192.168.1.71
七、测试
分别在hive和impala中测试selectcount(1) from hivetest;
7.1 hive查询测试
7.2 impala查询测试