搭建hive环境

1.安装java


$ sudo apt install openjdk-8-jdk

安装成功后,使用下面的命令来验证是否已经安装java

$ java -version

如果安装成功,则可以看到如下回应:


虽然是从apt安装的openjdk,但我们仍有必要设置一下java的环境变量,那么openjdk的位置在哪里呢?
经过网上查阅资料,发现是在/usr/lib/jvm/java-8-openjdk-amd64
那么我们修改/etc/profile或者~/.bashrc

bashrcprofile 的区别
profile
其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
bashrc
bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.

export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"

下面我统一先修改/etc/profile,在最后复制所有的环境变量到~/.bashrc
保存修改

source /etc/profile

2.安装hadoop


下载hadoop:hadoop清华镜像
提取hadoop到/usr/local

cd ~
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz
tar -zxvf hadoop-2.9.0.tar.gz
mv hadoop-2.9.0 /usr/local/hadoop/

配置hadoop环境变量

export HADOOP_HOME=/usr/local/hadoop-2.9.0
export HADOOP_MAPRED_HOME=$HADOOP_HOME 
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

验证hadoop环境变量是否设置成功

hadoop version

会得到类似这样的回应:



应用更改

source /etc/profile

3.配置Hadoop


进入hadoop目录

cd $HADOOP_HOME/etc/hadoop

为了使用java开发Hadoop的项目,必须用java在系统的位置替换JAVA_HOME值重置hadoop-env.sh文件中的java环境变量。修改为:

vi hadoop-env.sh
set JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"

core-site.xml

core-site.xml文件中包含的信息,如使用Hadoop实例分配给文件系统的存储器,用于存储数据的内存限制的端口号,以及读/写缓冲器的大小。

打开core-site.xml文件并在,标签之间添加以下属性。


    
      fs.default.name 
      hdfs://localhost:9000 
   

        
      hadoop.tmp.dir 
      file:///usr/local/hadoop-2.9.0/tmp 
   

hdfs-site.xml

hdfs-site.xml 文件中包含的信息,如复制数据的值,名称节点的路径,本地文件系统的数据节点的路径
我们假定有以下数据.

dfs.replication (data replication value) = 1

namenode path = //home/{logging user}/hdfsfile/namenode

datanode path = //home/{logging user}/hdfsfile/datanode

在用户目录新建hdfsfile目录,注意,不要在/usr/local/hadoop-2.9.0目录下面建,因为我就是吃了这个的亏,又去权限问题,nodenode死活启动不起来,按照网上的方案试了一遍都没有,最后还是放在用户目录解决了.
千万千万注意权限!!!!

打开这个文件,并在此文件中的标签之间添加以下属性。


    
      dfs.replication 
      1 
    
    
      dfs.name.dir 
      file:///home/{logging user}/hdfsfile/namenode 
    
    
      dfs.data.dir
      file:///home/{logging user}/hdfsfile/datanode 
   

yarn-site.xml
此文件用于配置yarn到Hadoop。打开yarn-site.xml文件,并在此文件中的标签之间添加以下属性。


    
      yarn.nodemanager.aux-services 
      mapreduce_shuffle 
   

mapred-site.xml

此文件用于指定我们正在使用的MapReduce框架。缺省情况下,包含 yarn-site.xml模板。缺省情况下,包含yarn-site.xml模板。首先,需要将文件从mapred-site.xml复制。模板mapred-site.xml文件使用以下命令。

$ cp mapred-site.xml.template mapred-site.xml

打开mapred-site.xml文件,并在在此文件中的标签之间添加以下属性。


    
      mapreduce.framework.name 
      yarn 
   

4.配置免密码登录ssh

用ssh-keygen创建公钥

ssh-keygen -t rsa

输入后,会提示创建.ssh/id_rsa、id_rsa.pub的文件,其中第一个为密钥,第二个为公钥。过程中会要求输入密码,为了ssh访问过程无须密码,可以直接回车 。

复制公钥到authrized_keys文件中

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

设置文件和目录权限
设置authorized_keys权限和~/.ssh目录权限

$ chmod 600 ~/.ssh/authorized_keys  
$ chmod 700 -R ~/.ssh  

设置本机免密码登陆

确保ssh-agent在运行

# start the ssh-agent in the background
eval $(ssh-agent -s) 

添加私钥到ssh-agent

ssh-add ~/.ssh/id_rsa

确认本机免密码登录是否成功

如果没有ssh-server就下一个

$ sudo apt install openssh-server -y

然后本地登陆

$ ssh localhost

5.验证hadoop安装


步骤I:namenode节点初始化并格式化
使用命令“hdfs namenode -format”设置名称节点如下。

hdfs namenode -format

预期的结果如下。


步骤 II: 验证Hadoop dfs

下面的命令用来启动dfs。执行这个命令将开始启动Hadoop文件系统。

$ start-dfs.sh

步骤 III : 验证Yarn脚本

下面的命令用来启动yarn脚本。执行此命令将启动yarn守护进程。

$ start-yarn.sh

其实以上两个可以用一个命令启动,但是,这种方法已经过时,官方不推荐.官方推荐的是按照上面的方式,分别启动

$ start-all.sh

验证启动是否成功

jps

看到如下这种就成功了,必须要有namenode,如果没有的话参照上面的顺序,重新格式化和检查是否是权限问题.


步骤 IV:在浏览器访问Hadoop

访问Hadoop的默认端口号为50070.使用以下网址,以获取浏览器Hadoop服务。

http://localhost:50070/

步骤 V: 验证集群的所有应用程序
访问集群中的所有应用程序的默认端口号为8088。使用以下URL访问该服务。

http://localhost:8088/

6.安装Hive

我们用的是Hive2.3.2:清华镜像,下载到用户目录

cd ~
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.3.2/apache-hive-2.3.2-bin.tar.gz
tar -zxvf apache-hive-2.3.2-bin.tar.gz
mv apache-hive-2.3.2-bin/ /usr/local/hive/

设置hive环境变量

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

修改环境变量

$ source /etc/profile

7. 配置hive

配置Hive用于Hadoop环境中,需要编辑hive-env.sh文件,该文件放置在 $HIVE_HOME/conf目录。下面的命令重定向到Hive config文件夹并复制模板文件:

$ cd $HIVE_HOME/conf
$ cp hive-env.sh.template hive-env.sh

通过编辑hive-env.sh文件添加以下行:

cd hive-env.sh

export HADOOP_HOME=/usr/local/hadoop

创建Hive数据文件目录
在HDFS中建立用于存储Hive数据的文件目录(/tmp 目录可能已经存在):

hadoop fs -mkdir /tmp
hadoop fs -mkdir /user
#我的登录用户是sym
hadoop fs -mkdir /user/${logging user}
hadoop fs -mkdir /user/${logging user}/warehouse
hadoop fs -chmod 777 /tmp
hadoop fs -chmod 777 /user/${logging user}/warehouse

以上命令在HDFS中建立了/tmp及/user/{logging user}/warehouse用于存放hive进行管理的数据文件。

Hive安装成功完成。现在,需要一个外部数据库服务器配置Metastore。我们使用mysql数据库。

8.安装mysql

通过apt安装mysql

$ sudo apt install mysql-server mysql-client

安装过程中会弹出一个框,叫你输入root密码,这里我输入的是root

下载mysql-connector-java

下载地址:(https://dev.mysql.com/downloads/connector/j/5.1.html)


我下载的是mysql-connector-java-5.1.45.tar.gz.解压后移动到 $HIVE_HOME/lib

cd ~
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz
tar -zxvf mysql-connector-java-5.1.45.tar.gz
sudo mv mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar $HIVE_HOME/lib

对root用户授权

$ mysql -u root -p
#进入mysql修改权限
mysql>grant all privileges on *.* to 'root'@'%' identified by 'root';
mysql>flush privileges;

修改 hive-site.xml

配置Metastore意味着,指定要Hive的数据库存储。可以通过编辑hive-site.xml 文件,在$HIVE_HOME/conf目录下可以做到这一点。首先,使用以下命令复制模板文件:

$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
gedit hive-site.xml #可以搜索,方便点

第一处(注释已经有的,在最上面加)

  
    javax.jdo.option.ConnectionURL  
    jdbc:mysql://localhost:3306/metastore_db?createDatabaseIfNotExist=true  
    JDBC connect string for a JDBC metastore  
    

第二处(修改)

  
    javax.jdo.option.ConnectionDriverName  
    com.mysql.jdbc.Driver  
    Driver class name for a JDBC metastore  
    

第三处(修改)

  
    javax.jdo.option.ConnectionUserName  
    root  
    Username to use against metastore database  
    

第四处(增加)

  
    javax.jdo.option.ConnectionPassword  
    root  
    password to use against metastore database  
    

第五处(修改)

 
    datanucleus.schema.autoCreateAll
    true
    
  

hive启动报错 java.net.URISyntaxException: Relative path in absolute URI: %7B
新建目录~/hive/iotmp

cd ~
mkdir ~/hive
mkdir ~/hive/iotmp

打开hive-site.xml,ctrl+F找到${system:Java.io.tmpdir}{system:user.name}
第一处

 
    hive.server2.logging.operation.log.location
    /home/sym/hive/iotmp/sym/operation_logs
    Top level directory where operation logs are stored if logging functionality is enabled
  

第二处

  
    hive.querylog.location
    /home/sym/hive/iotmp/sym
    Location of Hive run time structured log file
  

第三处

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

第四处

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

9.启动hive

使用schematool初始化元数据库为mysql,切记,这一步放在最开始做!
Hive 分布现在包含一个用于 Hive Metastore 架构操控的脱机工具,名为 schematool.此工具可用于初始化当前 Hive 版本的 Metastore 架构。此外,其还可处理从较旧版本到新版本的架构升级。

schematool -dbType mysql -initSchema --verbose

初始化成功后是该字样

sym@sym:~$ schematool -dbType mysql -initSchema --verbose
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.9.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:    jdbc:mysql://localhost:3306/metastore_db?createDatabaseIfNotExist=true
Metastore Connection Driver :    com.mysql.jdbc.Driver
Metastore connection User:   root
Wed Jan 10 10:32:02 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Connecting to jdbc:mysql://localhost:3306/metastore_db?createDatabaseIfNotExist=true
Wed Jan 10 10:32:03 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Connected to: MySQL (version 5.7.20-0ubuntu0.16.04.1)
Driver: MySQL Connector Java (version mysql-connector-java-5.1.45 ( Revision: 9131eefa398531c7dc98776e8a3fe839e544c5b2 ))
Transaction isolation: TRANSACTION_READ_COMMITTED
0: jdbc:mysql://localhost:3306/metastore_db> !autocommit on
Autocommit status: true
0: jdbc:mysql://localhost:3306/metastore_db> /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */
No rows affected (0.02 seconds)
...
...
Closing: 0: jdbc:mysql://localhost:3306/metastore_db?createDatabaseIfNotExist=true
beeline> 
beeline> Initialization script completed
Wed Jan 10 10:32:07 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
schemaTool completed

Hive启动报错Caused by MetaException message Version information not found in metastore

 
    hive.metastore.schema.verification
    false

启动hive metastore

$ hive --service metastore &

Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /home/sym/metastore_db.

后台已经有了一个derby实例,hive默认是使用derby数据库的,但是derby不支持多用户,所以我们上面已经切换到了mysql.对于这个问题:

  • 首先检查,$HIVE_HOME目录下的,如果发现有derby.log和metastore_db文件,就说明这时hive的数据库仍是derby,把它俩删除.
  • 如果仍然不行.就关闭hive metastore.
#启动metastore服务
hive --service metastore & 

#启动hiveserver服务
hive --service hiveserver2 & 

关闭的命令是
nohup hive --service metastore > metastore.log 2>&1 & jobs查看后台任务 kill %id关闭后台任务
nohup hive --service hiveserver2 > hiveserver2 .log 2>&1 & jobs查看后台任务 kill %id关闭后台任务

Exception in thread "main" org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.

这种情况表明端口被占用了.

查看端口使用情况,使用netstat命令:
查看已经连接的服务端口(ESTABLISHED)

netstat -a

查看所有的服务端口(LISTEN,ESTABLISHED)

netstat -ap

查看指定端口,可以结合grep命令:

netstat -ap | grep 8080

也可以使用lsof命令:

lsof -i:9083

若要关闭使用这个端口的程序,使用kill + 对应的pid

kill -9 PID号

ps:kill就是给某个进程id发送了一个信号。默认发送的信号是SIGTERM,而kill -9发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。

看到一下字样代表启动成功


这种方式是前台运行方式,后台运行方式还待我试一试.
新建一个terminal,启动mysql(后面可以加入开机自启),输入hive启动hive

sudo service mysql start #需要输密码

然后启动hive

hive

测试hive是否启动成功

show tables;

10.编译TPC-H

TPC-H:TPC-H是TPC提供的一个benchmark,用来模拟一个现实中的商业应用,可以生成一堆虚构的数据,且自带一些查询,可以导入到各种数据库中来模拟现实需求,检查性能。

下载TPC-H

去官网下载最新的tpc-h.我下载的时候的最新版本是TPC-H_Tools_v2.17.3.zip.点击下面的红色方框的连接跳转到下载页面,首先需要填写自己的个人信息,下载连接会发送到你填写的邮箱,注意,下载连接只能下载一次.如果失败,需要重新填写个人信息(太尼玛坑爹了!!!!)


填写个人信息,对了,这里的验证码分为左右两部分,需要全部输入(还是坑爹!!!!!)

将我们下载的zip文件解压.我重命名之后,进入当前文件夹,目录结构如下:

修改makefile

我们进入dbgen目录,找到makefile.suite



修改103~112行左右改为这个样子

CC      = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
#                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, 
#                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
# Current values for WORKLOAD are:  TPCH
DATABASE = MYSQL
MACHINE = LINUX
WORKLOAD = TPCH

改动的地方分别是:
设定C语言编译器为gcc(如果你用的是其他的编译器就改成其他对应名字)
DATABASE设为MYSQL(注意注释里写的提供的数据库格式没有mysql,所以等一下要自己写一个格式,见步骤3)
MACHINE = LINUX 和 WORKLOAD = TPCH 就不用说啥意思了……
改好之后保存为makefile,这样才好用make命令。

修改tpcd.h

之前说了官方的生成程序没有mysql的格式,所以我们要自己写一个,打开tpcd.h,找一个空白的地方写上.

#ifdef MYSQL
#define GEN_QUERY_PLAN  ""
#define START_TRAN      "START TRANSACTION"
#define END_TRAN        "COMMIT"
#define SET_OUTPUT      ""
#define SET_ROWCOUNT    "limit %d;\n"
#define SET_DBASE       "use %s;\n"
#endif

生成dbgen

接下来make,生成数据生成脚本dbgen

cp makefile.suite makefile
make

这个过程中会有一些关于数据类型的警告,一般可以无视。
make完dbgen目录下之后就会多出很多.o(等到你所有事都干完确定这些没有用了不想留着就make clean,或者直接整个文件夹删掉……)和一个叫dbgen的文件.

生成tbl数据文件

接下来要用dbgen生成数据,一共会生成8个表(.tbl)。
查看README里面有命令行参数解说,这里我们在dbgen目录下使用下面的命令:

./dbgen -s 1

-s 1 表示生成1G的数据 (如果你之前曾经尝试过生成数据,最好先make clean,再重新make,接着到这步加上-f覆盖掉)
生成之后可以用head命令检查一下tbl们,会看到每一行都有一些用“|”隔开的字段。

下载TPC-H_on_Hive

官网地址:(https://issues.apache.org/jira/browse/HIVE-600)
下载TPC-H_on_Hive_2009-08-14.tar.gz,然后使用tar -zxvf命令解压.


进入TPC-H_on_Hive目录.如下:

导入tbl数据到hadoop

在dbgen目录复制前面生成的8个tbl文件到TPC-H_on_Hive/data目录

sym@sym:~/2.17.3/dbgen$ cp *.tbl /home/sym/TPC-H_on_Hive/data/

进入data目录,执行./tpch_prepare_data.sh


我们可以看一下tpch_prepare_data.sh的内容

不难看出,执行这个文件可以在HDFS上建立每个表的目录,然后加载数据就行啦.

运行基准测试tpc-h
运行tpch_benchmark.sh即可

root@sym:~/TPC-H_on_Hive# ./tpch_benchmark.sh

启动顺序

既然上面所有的步骤都没有问题,那么恭喜你,只要按照我接下来的步骤运行一遍,就可以开始hive的tpc-h性能测试了.(假定你刚开机)

start-all.sh

sudo service mysql start

hive --service metastore &

###新建一个terminal,进入TPC-H_on_Hive目录
./tpch_benchmark.sh

看到这个,慢慢等着就好了


跑完了22条测试

查看log,看一下出错原因:Caused by: java.lang.OutOfMemoryError: Java heap space

hive调优

参考教程

  • github教程:创建ssh key,并添加到ssh-agent
  • 易百教程:如何安装hive
  • TPC-H数据导入MySQL教程
  • TPC-H数据导入MySQL教程(施工中) - Joyee
  • Running TPC-H queries on Hive
  • 使用TPC-H对Hive测试

调优教程

  • 参数
  • MapReduce任务参数调优和说明
  • Hive性能优化
  • 总结:Hive性能优化上的一些总结
  • hive调优
  • Hive使用性能调优

    dfs.name.dir
    file:/home/hadoop/hadoop/namenode


    dfs.data.dir
    file:/home/hadoop/hadoop/datanode

你可能感兴趣的:(搭建hive环境)