1. 安装环境
硬件:三台PC,配置 Intel i5 4 Core CPU, 16G memory, 2T 硬盘
软件: 两台PC为ubuntu 14.04, 一台为ubuntu 16.04 ; hadoop-2.8.0, hive-1.2.2, mysql 5.5.55, jdk-8u131-linux-x64.tgz (1.8.0_131)
机器分配: 一台ubutn 14.04的主机作maste, 其他作slave
登陆帐号:方便期间,三台机器上都创建用户名/密码为 hadoop/hadoop 的帐号
2. 各种问题及解决办法
2.1. 从master通过ssh登陆slave后,.bashrc中增加的环境变量没起作用, 直接在slave上 echo .bashrc中export的变量是正常的
问题原因: 创建hadoop帐号时,默认的shell 是/bin/sh 而不是/bin/bash ,导致ssh 登陆后根本不会执行.bashrc中的设置。
echo $SHELL 可查看当前的shell 或 vim /etc/passwd 查看用户hadoop的最后一个字段。
不同登陆方式执行的配置脚本不同,主要涉及login shell 和non-login shell 的区别,简单说区别如下,
“login shell” 代表用户登入, 比如使用 “su -“ 命令,或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式.
该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般在 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件, 或把.bashrc中的内容放在.profile中;
而 no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell.该模式下是不会自动去运行任何的profile文件.
解决办法:原因知道了,解决就容易了。
a. 修改 hadoop 用户的shell为/bin/bash; /// 创建时设置 如,useradd -m -g hadoop hadoop -s /bin/bash ,或 sudo vim /etc/passwd 中修改,或 chsh
b. .bashrc中的声明语句放在.profile中或在.profile增加.bashrc的调用, 后者更方便,同时满足两种登陆方式。
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
补充: 两种登陆方式的更多区别,见 https://wido.me/sunteya/understand-bashrc-and-profile/
2.2 帐号hadoop 没有执行sudo 的权限
解决办法: 修改//etc/sudoers 的400权限为640后或 sudo chmod u+w /etc/sudoers后,sudo vim /etc/sudoers 增加 hadoop ALL=(ALL:ALL) ALL
或使用系统提供的工具修改,避免发生意外: sudo visudo /etc/sudoers 后增加上面hadoop 一行
注意: 安全期间,这个文件的权限是400即任何人是只读的,修改前不能随便该为775等大权限的,否则连sudo 都不能执行,一定要谨慎。
2.3 sudo 失效
修改/etc/sudoers文件权限过大后like 775 ,再执行sudo命令会报如下错误,sudo 失效。
sudo echo $PATH
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
解决办法:
a. 如果记得root 密码,切换成root用户后把权限改成640
b. 如果不记得root密码或没设置过root密码,比较杯具,可以参照下文找回root密码后再修改 http://jingyan.baidu.com/article/c843ea0b9e851077931e4aea.html
2.4 Hadoop 启动相关
2.4.1 hadoop 启动时提示JAVA_HOME没设置
解决办法:JAVA_HOME确实在.bashrc/.profile中设置了,echo $JAVA_HOME时也是对的。可能hadoop本身也需要设,最后在 hadoop/etc/hadoop/hadoop-env.sh 中
增加 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
2.4.2 master上NameNode启动失败
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /home/hadoop/bigdata/data/hadoop/tmp/dfs/name is in an inconsistent state:storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:322)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:210)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:1012)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:691)
at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:634)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:695)
at org.apache.hadoop.hdfs.server.namenode.NameNode.
at org.apache.hadoop.hdfs.server.namenode.NameNode.
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1603)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1671)
2017-06-12 15:06:31,419 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2017-06-12 15:06:31,420 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
问题原因:/home/hadoop/bigdata/data/hadoop/tmp/dfs/name 是我们在hadoop core-site.xml中设置的每个节点上的临时文件夹目录名字,权限不足或多次启动失败后通过kill -9 kill 掉java程序后此目录下的.lock文件还在,导致下次再启动时访问不到而失败。
解决办法:首先,确保此hadoop帐号对此目录有读写权限;再就是,每次启动时确保没有.lock文件或删除此目录 rm -fr/home/hadoop/bigdata/data/hadoop/tmp/dfs/name.
解决后在master上执行jps 可看到NameNode进程is running.
2.4.3 master上启动SecondaryNameNode 失败
java.net.ConnectException: Call From master/ to master:9000 failed on connection exception: java.net.ConnectException:Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:801)
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:732)
同时,master上执行 ssh -v localhost也报如下错误:
debug1: ssh_exchange_identification: WARN: Connectiong not allowed.
ssh_exchange_identification: read: Connection reset by peer
看来是本机的问题。通过 ps -ef | grep ssh 查看只有ssh client在运行,sshd (ssh server)还没运行。
问题原因:ubuntu 中默认是不安装ssh-server的,也就不会运行。
解决办法:sudo apt-get install openssh-server ; ps -ef | grep ssh 确保sshd 已运行,即下行:
root 1179 1 0 09:29 ? 00:00:00 /usr/sbin/sshd -D
2.4.5 slave 上启动YARN时 NodeManager启动失败
FATAL org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices: Failed to initialize mapreduce-shuffle
java.lang.IllegalArgumentException: The ServiceName: mapreduce-shuffle set in yarn.nodemanager.aux-services is invalid.The valid service name should only contain a-zA-Z0-9_ and can not start with numbers
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.serviceInit(AuxServices.java:114)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl.serviceInit(ContainerManagerImpl.java:262)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.serviceInit(NodeManager.java:357)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:636)
at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:684)
很明显,这是因为配置yarn-site.xml 时,没注意对应value的格式要求,把yarn.nodemanager.aux-services的值使用了非法字符“-”, 正常值“a-zA-Z0-9_ and can not start with numbers“。
解决办法:修改mapreduce-shuffle中间的"-"为下划线“_", i.e. mapreduce_shuffle. 每个地方都要小心,再小心!!!
至此,Hadoop 已经能再master/slave机器上跑起来了。 分别运行jps 可以查看状态和进程。
$ hdfs fdsadmin -report // 可查看HDFS状态
2.5 HIVE/Mysql启动相关
2.5.1 缺少mysql JDBC Driver
解决办法:到mysql 官网下载 mysql-connector-xxx.jar 或 sudo apt-get install libmysql-java ;
安装后jar包将被放在 /usr/share/java/下,like mysql-connector-java-5.1.28.jar and its soft link.
把这个jar包拷贝到 $HIVE_HOME/lib下即可。
注意: hive-site.xml 中配置JDBC Driver时的值要写正确。
2.5.2 再metastore所在的master上启动metastore失败
metadata.Hive (Hive.java:
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)
Caused by: MetaException(message:Could not connect to meta store using any of the URIs provided. Most recent failure: org.apache.thrift.transport.TTransportException: java.net.ConnectException:拒绝连接 (Connection refused)
at org.apache.thrift.transport.TSocket.open(TSocket.java:187)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:421)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.
问题原因:hive-site.xml中配置了metastore保存在远端mysql 中,通过thrift://master:9083提供服务。怀疑可能与mysql 访问权限有关。
本地通过 mysql -hlocalhost -uxx -pxx 可以正常访问,但通过mysql -hmaster -uxx -pxx 访问失败 // xx 为mysql 中设置的username and password.
显然,与mysql的配置有关. 默认情况下,mysql 仅侦听localhost.
解决办法: 注掉/etc/mysql/my.cnf中 bind_address=127.0.0.1
2.5.3 slave 上启动hiveserver2失败
[main]: server.HiveServer2 (HiveServer2.java:startHiveServer2(376)) - Error starting HiveServer2 on attempt 1, will retry in 60 seconds
java.lang.RuntimeException: Error applying authorization policy on hive configuration: java.lang.IllegalArgumentException: java.NET.URISyntaxException:Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bhive.session.id%7D_resources
at org.apache.hive.service.cli.CLIService.init(CLIService.java:114)
at org.apache.hive.service.CompositeService.init(CompositeService.java:59)
at org.apache.hive.service.server.HiveServer2.init(HiveServer2.java:100)
at org.apache.hive.service.server.HiveServer2.startHiveServer2(HiveServer2.java:345)
问题原因:配置hive-site.xml 时,其中的system:java.io.tmpdir没有设置有效值。
解决办法: 创建hive的临时目录,如 $HIVE_HOME/iotmp , 找到hive-site.xml 中的system.:java.io.tmpdir, 并替换为所创建的hive 临时目录,主要有从下两个配置项:
2.5.4 hive命令行执行SQL语句时报错 “Illegal character in scheme name at index 0: file://home/hadoop/bigdata/hbas...."
居然是hive/hive-site.xml中配置的这段文本中没太注意格式,每个file:///之间不能有空格,有空格就会报这个错;同时这里file:后面是三个///。
重要的事情说三遍,不能有空格,三个///,不能有空格,三个///,不能有空格,三个///。
至此,整体环境已经配置完成,命令行中启动hive已经可以看到 hive> , 即将进入HIVE的神奇世界, YEAH!!!
3. HIVE 基本操作
准备:touch hive.txt , input some formated value like hive test \n 111\t hello \n 222 \t world\n ...
实际上,在$HIVE_HOME/examples/files已有很多实验用的数据源文件,queries目录下有现成的各种SQL query语句示例。
hive > create database hive1 (id int, name string) row format delimited fields terminated by '\t';
hive > show tables;
hive > show databases;
hive > load data local inpath '/home/hadoop/hive/hive.txt' overwrite into table hive1; /// load hive.txt into db hive1
hive > select * from hive1;
hive >
致谢:
环境得以搭建完成,受益于遇到问题时从网上查的相关资源,这里不一一罗列,个别问题在几篇的基础上整理后解决。
完成此文,为便于自己后续回顾参考,也方便大家遇到问题时尽量通过一篇可以搞定!
后续进阶中如遇新问题,届时再补充!
后续参考:
1. 搭建hive的问题集锦: http://www.cnblogs.com/qifengle-2446/p/6424426.html