鄙人最近准备离职,所以把之前工作中积累的一些东西整理下发上来,其中一部分发在公司内刊上,一部分是组内交流文档,标“原创”的都是本人原创,转载请注明谢谢!
Impala这个东西在我们实践应用中还是不错的,查询速度可以,就是稳定性一般,做好监控的话没有问题。我们装的是配套CDH5u3的2.1版本,装其他版本不是不可以,只不过cloudera不保证一定可用,需要自己解决一些坑,如果有明确需求要使用新特性的,就装最新版本。比如CDH5u3配套的Spark是1.2,但我们自己装的就是1.6的。本篇提供的安装方法是基于rpm的,缺点是需要装一堆依赖的东西(如hadoop等即使你已有但不是通过rpm装的),从官网下源码独立装也可以。另外里面的IP是我们自己集群的IP,需换成读者自己的。
参考文档:
http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_noncm_installation.html
http://blog.csdn.net/zhong_han_jun/article/details/45563505
1、下载impala软件包
要下载和hadoop主版本匹配的包,我们应下CDH5.3适用的包
http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.3.0/
下完后,可以在本地构建yum源来安装,也可以拷到每台机器后直接rpm安装,这里采用的是后一种方式。
]
2、impala主机包分发
这里把impala-state-store和impala-catalog所在的机器称为impala主机。参考文献中impala主机用的是namenode,考虑到namenode内存占用可能会比较大,我们没有选择namenode,而是选择10.100.10.15。
将下载的软件包中除impala-server-2.1.0+cdh5.3.0+0-1.cdh5.3.0.p0.32.el6.x86_64.rpm和impala-shell-2.1.0+cdh5.3.0+0-1.cdh5.3.0.p0.32.el6.x86_64.rpm的其余软件包拷贝到此机器的/software/impala/下。
3、impala从机包分发
这里把impala-server和impala-shell所在的机器称为impala从机,除10.100.10.15以外的所有datanode都当作从机。
将下载的软件包中除impala-state-store-2.1.0+cdh5.3.0+0-1.cdh5.3.0.p0.32.el6.x86_64.rpm和impala-catalog-2.1.0+cdh5.3.0+0-1.cdh5.3.0.p0.32.el6.x86_64.rpm的其余软件包拷贝到此机器的/software/impala/下。
以下4-6步需要在所有主机、从机上执行:
4、安装软件包(以下所有命令如果提示没权限的,前面加sudo)
cd /software/impala
rpm -ivh --nodeps *.rpm
全部装完后再检查下机器上有没有python,没有的话执行:
yum install python
因为安装包会向/usr/bin/下加入hadoop、hive等的快捷方式,会定位到新安装的hadoop、hive目录,而我们想继续用原来的,只需要将/usr/bin/下的快捷方式改名即可:
cd /usr/bin
mv hadoop-0.20 hadoop-0.20.bak
mv yarn yarn.bak
mv mapred mapred.bak
mv hdfs hdfs.bak
mv hadoop hadoop.bak
mv hbase hbase.bak
mv hiveserver2 hiveserver2.bak
mv hive hive.bak
mv beeline beeline.bak
另外需要修复/usr/lib/impala/lib目录下5个错误的软链接:
cd /usr/lib/impala/lib
sudo ln -sf/usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-common.jarhadoop-mapreduce-client-common-2.5.0.jar
sudo ln -sf/usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient.jarhadoop-mapreduce-client-jobclient-2.5.0.jar
sudo ln -sf/usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-shuffle.jarhadoop-mapreduce-client-shuffle-2.5.0.jar
sudo ln -sf/usr/lib/hadoop-yarn/hadoop-yarn-client.jar hadoop-yarn-client-2.5.0.jar
sudo ln -sf/usr/lib/hadoop-yarn/hadoop-yarn-server-nodemanager.jarhadoop-yarn-server-nodemanager-2.5.0.jar
5、修改hdfs的配置文件
在/software/hadoop/etc/hadoop/hdfs-site.xml下增加以下配置,以启用shortcircuit read和blocks metadata功能(以下是正式环境中加好的文件):
在每个节点上创建/var/run/hadoop-hdfs,因为hdfs-site.xml文件的dfs.domain.socket.path参数指定了这个目录,并修改其权限和组归属,否则datanode无法启动:
mkdir /var/run/hadoop-hdfs (正常的话此目录已建好)
chmod 755 /var/run/hadoop-hdfs
chown hdfs:root /var/run/hadoop-hdfs
全部修改完后重启namenode,用hdfs账号登录10.100.10.6,执行:
/software/hadoop/sbin
./stop-dfs.sh
./start-dfs.sh
(注:网上教程中的方法都是将hadoop的hdfs-site.xml拷贝到impala配置目录下,只修改impala的那一份,这是有问题的,经测试shortcircuit read和blocks metadata两个功能都需要两者的hdfs-site.xml都有相关参数才行,否则会报错。
其中,hadoop的hdfs-site.xml中不配blocks metadata,impala执行查询时报警告:
WARNINGS: Backend 0:Unknown disk id. This will negatively affect performance.Check your hdfs settings to enable block location metadata.
Backend 1:Unknown disk id. This will negatively affect performance.Check your hdfs settings to enable block location metadata.
hadoop的hdfs-site.xml中不配shortcircuitread相关的3个参数,impala执行查询时报异常,但查询可以完成:
java.net.ConnectException: connect(2) error: No such file or directory when trying to connect to '/var/run/hadoop-hdfs/dn.50010'
at org.apache.hadoop.net.unix.DomainSocket.connect0(Native Method)
at org.apache.hadoop.net.unix.DomainSocket.connect(DomainSocket.java:250)
at org.apache.hadoop.hdfs.shortcircuit.DomainSocketFactory.createSocket(DomainSocketFactory.java:163)
at org.apache.hadoop.hdfs.BlockReaderFactory.nextDomainPeer(BlockReaderFactory.java:719)
at org.apache.hadoop.hdfs.BlockReaderFactory.createShortCircuitReplicaInfo(BlockReaderFactory.java:441)
at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.create(ShortCircuitCache.java:783)
at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.fetchOrCreate(ShortCircuitCache.java:717)
at org.apache.hadoop.hdfs.BlockReaderFactory.getBlockReaderLocal(BlockReaderFactory.java:394)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:305)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:574)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:797)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:851)
at org.apache.hadoop.fs.FSDataInputStream.read(FSDataInputStream.java:143)
W0722 09:47:57.458355 14437 ShortCircuitCache.java:808] ShortCircuitCache(0x6571120a): failed to load 1073745586_BP-1992671808-10.1.12.106-1425868259525
关于此情况的说明,apache的官方说“Short-circuit local reads need to beconfigured on both the DataNode and the client.”,参见http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ShortCircuitLocalReads.html)
6、建立impala配置文件链接
impala可复用hadoop和hive的配置文件,但需要位于指定目录,所以做软链接即可。
ln -s /software/hive/conf/hive-site.xml/etc/impala/conf/
ln -s /software/hive/conf/hive-env.sh/etc/impala/conf/
ln -s /software/hadoop/etc/hadoop/core-site.xml/etc/impala/conf/
ln -s /software/hadoop/etc/hadoop/hdfs-site.xml/etc/impala/conf/
7、修改impala配置文件
vi /etc/default/impala
主要就是改IP的地方,因为每台机器都一样,可以改好后统一上传覆盖原始文件。下面这个是例子:
(注:我们是使用默认的impala账号来启停impala服务,如果需要用其他账号,需要根据实际环境修改impala相关脚本文件/etc/init.d/impala-state-store、/etc/init.d/impala-server、/etc/init.d/impala-catalog,修改其中的SVC_USER参数。)
以下步骤在特定机器上执行:
8、复制mysql JDBC包(不一定需要这步,启动catalog报找不到mysql错的话才需要)
在10.100.10.15上执行即可:
cp/software/hive/lib/mysql-connector-java-5.1.18-bin.jar /var/lib/impala
9、启动主机上的impala服务
还是在10.100.10.15上执行:
service impala-state-store start
service impala-catalog start
正常的话应该/var/log/impala下ERROR日志里都正常。(catalogd.ERROR里可能有“DirectSQL failed, falling back to ORM”这样的异常,应该是hive元数据升级的遗留问题,目前没发现有什么影响)
10、启动从机上的impala服务
在其余datanode上执行:
service impala-server start
正常的话,运行impala-shell后能看到如下界面:
执行命令以加载hive元数据:
invalidate metadata;
11、配置Hue中使用impala
在Hue的服务器(我们是10.100.10.2),找到hue.ini,并修改impala所属的配置:
vi /software/hadoop-versions/hue-3.7.0-cdh5.3.0/desktop/conf/hue.ini
重新启动Hue服务:
ps -ef |grep hue|awk '{print $2}' |xargs kill -9
nohup /software/hue/build/env/bin/supervisor> supervisor.log &
然后在浏览器中访问http://10.100.10.2:8888进行验证。