搭建Hadoop+Hive+Mysql遇到的坑及解决办法

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.(NameNode.java:898)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:877)
        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时的值要写正确。

javax.jdo.option.ConnectionDeriverName

com.mysql.jdbc.Deriver    // 这里是以com开头,不要因为是开源项目而写成org


2.5.2  再metastore所在的master上启动metastore失败

metadata.Hive (Hive.java:(168)) - Failed to access metastore. This class should not accessed in runtime.
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.(HiveMetaStoreClient.java:236)

问题原因: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 临时目录,主要有从下两个配置项:

 
    hive.exec.local.scratchdir
    /home/hadoop/bigdata/hive/iotmp
    Local scratch space for Hive jobs
 

 
    hive.downloaded.resources.dir
    /home/hadoop/bigdata/hive/iotmp/${hive.session.id}_resources
    Temporary local directory for added resources in the remote file system.
 


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.aux.jars.path
    file:///home/hadoop/bigdata/hbase/lib/hbase-common-1.2.6.jar,file:///home/hadoop/bigdata/hbase/lib/protobuf-java-2.5.0.jar,file:///home/hadoop/bigdata/hive/lib/hive-hbase-handler-1.2.2.jar,file:///home/hadoop/bigdata/hive/lib/zookeeper-3.4.6.jar
    The location of the plugin jars that contain implementations of user defined functions and serdes.


至此,整体环境已经配置完成,命令行中启动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 

你可能感兴趣的:(大数据)