回顶部

联系方式

0571-89852485

工作日 9:00-21:00

  or  

让我们联系您

在线客服

联系方式

格式不正确
格式不正确
格式不正确
联系方式只能为手机号码或邮箱
格式错误

提交成功

感谢您对网易大数据的支持,我们会尽快与你取得联系

完成

手把手教你搭建hadoop+hive测试环境(新手向)

2017-10-11     作者:唐雕龙
本篇文章仅限本站分享,如需转载,请联系网易获取授权。
欢迎技术交流和讨论:bigdata@service.netease.com

面向新手的hadoop+hive学习环境搭建,加对我走过的坑总结,避免大家踩坑。
对于hive相关docker,并没有官方的docker,第三方维护经过测试各种不靠谱,所以才想到自己搭建一套,然后后期在整理成docker上传~~~

基础环境:

  1. 公司云主机debain8.8 (不像docker,所以对系统内核无要求)

    1. 前置安装:

      1.1 jdk8(hive要求jdk7以上,千万不要jdk9!!!!!详情见末尾作死一)   1.2 hadoop 2.7.X以上   1.3 mysql或者postgresql(作为hive metastore的数据库)

    2. 安装hadoop:

    1.安装metastore所用到数据库
      对于mysql或者postgresql就偷懒直接docker pull 然后docker run了一个出来。毕竟仅仅作为hive元信息储存角色。
     docker pull mysql:5.7
     docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=XXX -d mysql:5.7
    
    2.jdk版本升级。
      官方下载jdk8的二进制包,使用whichjava查看系统自带java目录下载好的二进制包直接解压后编辑etc/profile文件设置java相关的环境变量.
     export JAVA_HOME=/xx/xx/jdk8
     export PATH=$JAVA_HOME/bin:$PATH
     export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

      编辑完后记得source /etc/profile,接着运行java -version确认是否成功
    3.增加hadoop安装用户
      官方建议增加hadoop用户组以及hadoop用户,我也建议这样做,但是公司云主机的话我就直接用我们有数的公共账号。
    4.安装ssh服务器
      hadoop使用到了ssh,所以需要
     apt-get install openssh-server
    
    然后测试
     ssh localhost  #会生成.ssh文件夹
    
    并且配置ssh无密码登陆
     cd /home/XXXX/.ssh/   #XX为你的用户名,比如有数账号是youdata,XXX就是youdata
     ssh-keygen -t rsa       # 一路按回车就可以
     cat ./id_rsa.pub >> ./authorized_keys    # 加入授权
    
    在执行一下ssh localhost 确保配置成功。
    5.hadoop服务安装
    直接找到官方下载url,wget下来我用的是:
     wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
    
    顺便也把hive下载下来吧
     wget http://mirror.bit.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz
    
    下载过后解压即可,最好选择挂载的比较大云硬盘上。然后记得对你的安装用户给权限。
     sudo chown -R hadoop ./hadoop     #hadoop为用户,第二个为解压后的文件夹名
    
    然后进入hadoop目录下,执行
     ./bin/hadoop version
    
    如果成功就说明下载的hadoop是可用的。 接下来修改hadoop配置达到单机伪分布式启动.所谓伪分布式就是在单机上以分离的java进程运行,节点同时扮演NameNode和DataNode,读取的是HDFS中的文件。
    6.hadoop伪分布式配置
    Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
      6.1. core-site.xml修改:
    <configuration>
    <property>
         <name>hadoop.tmp.dir</name>
         <value>file:/usr/local/hadoop/tmp</value>
    </property>
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://localhost:9000</value>
    </property>
    </configuration>
    
    其中目录同样推荐放在空间较大的盘上。并且确保用户有权限,所以最好用当前用户建一个~~
      6.2. hdfs-site.xml修改:
    <configuration>
    <property>
         <name>dfs.replication</name>
         <value>1</value>
    </property>
    <property>
         <name>dfs.namenode.name.dir</name>
         <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
         <name>dfs.datanode.data.dir</name>
         <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
    </configuration>
    
    同样的,这两个文件目录最好自己指定并且用当前用户建,指定的好处是避免误删导致hadoop需要重新format.
    7.初始化hadoop节点
    配置完后在hadoop目录下执行
     ./bin/hdfs namenode -format
    
    成功后可以看到Exitting with status 0
    坑一: 启动时候提示:ssh: Could not resolve hostname xxx,设置hadoop环境变量即可解决
     export HADOOP_HOME=/usr/local/hadoop
     export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    
    坑二:hadoop无法启动原因定位:启动时会提示形如 DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out”,其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;
    8.hadoop服务启动
    启动hadoop执行:
    ./sbin/start-dfs.sh
    
    启动成功后执行jps,可以看到
    youdata@hzadg-youdata-test:/srv/nbs/0/hadoop$ jps
    35664 SecondaryNameNode
    52310 Jps
    35320 NameNode
    35485 DataNode
    
    会出现 “NameNode”、”DataNode” 和 “SecondaryNameNode” 要关闭hadoop执行
    ./sbin/stop-dfs.sh
    
    额外的启动Yarn:YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性 上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。 编辑/etc/hadoop/mapred-site.xml
    <configuration>
    <property>
         <name>mapreduce.framework.name</name>
         <value>yarn</value>
    </property>
    </configuration>
    
    接着修改yarn-site.xml
    <configuration>
    <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
    </property>
    </configuration>
    
    然后启动mapreduce即上面的
    ./sbin/start-dfs.sh  # 启动MapReduce
    ./sbin/start-yarn.sh # 启动YARN
    ./sbin/mr-jobhistory-daemon.sh start historyserver #开启历史服务器,才能在Web中查看任务运行情况
    
    YARN 有个好处是可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster 至此hadoop安装完毕,接下来安装hive.

    3. 安装hive:

    1.对hive基本介绍
    metadata: 即元数据。元数据包含用Hive创建的database、table等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。 Metastore:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。 然后对于metastore有三种配置方式:
    1.内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接
    2.本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。
    3.本地元存储和远程元存储的区别是:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。
    2.hive配置
    hive配置文件位于解压目录下的conf里 1.修改hive-env.sh
    export JAVA_HOME=/opt/java ##Java路径
    export HADOOP_HOME=/opt/hadoop ##Hadoop安装路径
    export HIVE_HOME=/opt/hive ##Hive安装路径
    export HIVE_CONF_DIR=/opt/hive/conf ##Hive配置文件路径
    
    2.创建hdfs目录并赋予权限
    hdfs dfs -mkdir -p /user/hive/warehouse
    hdfs dfs -mkdir -p /user/hive/tmp
    hdfs dfs -mkdir -p /user/hive/log
    hdfs dfs -chmod g+w /user/hive/warehouse
    hdfs dfs -chmod g+w /usr/hive/tmp
    hdfs dfs -chmod g+w /usr/hive/log
    
    3.修改hive-site.xml 将 hive-site.xml 文件中以下几个配置项的值设置成上一步中创建的几个路径,同样建议放于空间较大的盘上
    <configuration>
     <property>
         <name>hive.exec.scratchdir</name>
         <value>/user/hive/tmp</value>
     </property>
     <property>
         <name>hive.metastore.warehouse.dir</name>
         <value>/user/hive/warehouse</value>
     </property>
     <property>
         <name>hive.querylog.location</name>
         <value>/user/hive/log</value>
     </property>
    </configuration>
    
    4.增加metastore使用到的数据库相关连接信息的配置,修改hive-site.xml
    <configuration>
     <property>
           <name>javax.jdo.option.ConnectionURL</name>
           <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncodig=UTF-8&useSSL=false</value>
     </property>
     <property>
           <name>javax.jdo.option.ConnectionDriverName</name>
           <value>com.mysql.jdbc.Driver</value>
     </property>
     <property>
           <name>javax.jdo.option.ConnectionUserName</name>
           <value>hive</value>
     </property>
     <property>
         <name>javax.jdo.option.ConnectionPassword</name>
         <value>hive</value>
     </property>
    </configuration>
    
    运行Hive 在命令行运行 hive 命令时必须保证以下两点: HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。
    MySQL jdbc jar包添加到 $HIVE_HOME/lib 目录下。 然后在hive目录下,执行
     ./bin/schematool -dbtype mysql -initSchema
    
    执行成功后就可以执行hive看成功了吗
     ./bin/hive
    
    启动hive服务则是
     ./bin hive --service hiveserver2 &
    
    测试用beeline连接,如果出现类似
    org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hadoop is not allowed to impersonate anonymous
    
    就是你这个用户不允许伪装为 anonymous(hive的默认用户,默认配置可以查看)。 修改hadoop的core-site.xml文件增加
    <configuration>
     <property>
           <name>hadoop.proxyuser.XXX.hosts</name>
           <value>*</value>
     </property>
     <property>
           <name>hadoop.proxyuser.XXX.groups</name>
           <value>*</value>
     </property>
    </configuration>
    
    即可,XXX是你的用户名,然后重启hadoop. 至此,hadoop+hive测试环境就已经搭建完成。 额外的:

    作死一:好奇使用jdk9

    因为jdk9还不成熟,并且我直观上对之前老版本编译出的jar包有些不兼容,比如
    Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader,
    
    这个还能搜到原因,是因为jdk9的 将URLClassLoader 作为系统的ClassLoaders的superclass导致,所以之前用到他两转化的都会出错需要重写代码。 又或者:
    java.lang.Integer (jdbc-type="", sql-type="") cant be mapped for this datastore. No mapping is available.
    
    在使用mysql作为metastore时候报错,使用到的mysqljdbc为:mysql-connector-java-5.1.42.jar 这个错误完全搜不到原因,不过看报错是java类型到sql映射出错。所以猜测仍然是jdk9对之前版本的某些jar或者之前jdk的某些用法不支持。 后来更换mysqljdbc版本到6.06仍然这个错误。后来更换jdk版本就不再出错。。。。。所以,现在先别作死生产环境用java9......

    发这篇文章主要是面向新手以及对我踩过的一些坑的总结。希望对小白们有所帮助。不要走我的老路!!!