hadoop集群安装以及Hive、sqoop的使用

一 Hadoop的安装

1. 软件清单

  1. Linux系统使用CentOS6.4-x64,Ubuntu较之CentOS个人感觉内存消耗更大,操作有时会卡顿。故改为使用CentOS。
  2. jdk-7u79-linux-x64.gz
  3. hadoop-1.2.1-bin.tar.gz
  4. apache-hive-1.2.1-bin.tar.gz
  5. MySQL-client-5.7.4_m14-1.el6.x86_64.rpm
  6. MySQL-server-5.7.4_m14-1.el6.x86_64.rpm
  7. scala-2.11.7.tgz
  8. spark-1.5.2-bin-hadoop1-scala2.11.tgz
  9. sqoop-1.4.6.bin__hadoop-1.0.0.tar.gz

2. 操作系统安装

略过

集群中各台机器安装一样的系统。root用户登录系统,避免繁琐的权限问题。

修改主机名:

vim /etc/sysconfig/network
HOSTNAME=master

其他机器分别改为slave1,slave2…

修改host:

vim /etc/hosts

分别添加集群中各节点的ip地址以及主机名。
重启所有机器。

3. SSH安装

查看SSH是否安装,启动ssh服务并设为开机自启。
具体操作见 :
http://jingyan.baidu.com/article/3ea51489f9efbf52e61bba05.html

cd ~/.ssh  # 如果没有该目录,先执行一次ssh localhost
ssh-keygen -t rsa   # 一直按回车就可以

所有的集群机器全部按上述设置。

scp id_rsa.pub root@master:/.ssh/id_rsa.pub.slave1  #slave1上执行
scp id_rsa.pub root@master:/.ssh/id_rsa.pub.slave2  #slave2上执行
cp id_rsa.pub authorized_keys   #以下语句均在master上执行
cat id_rsa.pub.slave1>>authorized_keys
cat id_rsa.pub.slave2>>authorized_keys
scp authorized_keys root@slave1:/.ssh/authorized_keys
scp authorized_keys root@slave2:/.ssh/authorized_keys

至此,集群各主机之间ssh免密码登录以及完成。测试是否成功。

ssh master
ssh slave1
ssh slave2

如不需密码即可登录任意其他主机,则代表设置成功。

4. 关闭Linux防火墙

`service iptables stop` (关闭防火墙,但重启会再次启动)

`chkconfig iptables off`    (开机不启动)

集群各机器均需关闭

余下所有的操作步骤只需在master上进行,然后复制文件到其他机器即可。

5. 安装JDK

卸载系统自带的OpenJDK

`rpm -qa | grep java`   #查看java有关的软件,会显示相关软件名称。
`rpm -e --nodeps +软件名`  #卸载全部的软件。

jdk的安装目录为/usr/lib/java

mkdir /usr/lib/java #若提示已有此文件夹则略过
cd  /usr/lib/java
wget http://114.213.234.104/x64_Linux/jdk-7u79-linux-x64.gz #下载JDK
tar -zxvf jdk-7u79-linux-x64.gz #解压jdk

修改环境变量

vim /etc/profile

在文件最后加上

export JAVA_HOME=/usr/lib/java/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin

使环境变量生效

source /etc/profile

测试jdk是否安装成功

java -version

正确执行则代表jdk安装完成。复制文件到其他机器

scp /usr/lib/java/* root@slave1:/usr/lib/java/
scp /etc/profile root@slave1:/etc/profile
scp /usr/lib/java/* root@slave2:/usr/lib/java/
scp /etc/profile root@slave2:/etc/profile

在slave1和slave2上分别执行

source /etc/profile
java -version

测试jdk是否正确安装。

6. hadoop安装

hadoop安装在/usr/local/hadoop目录下

mkdir /usr/local/hadoop
cd /usr/local/hadoop
wget http://114.213.234.104/x64_Linux/hadoop-1.2.1-bin.tar.gz
tar -zxvf hadoop-1.2.1-bin.tar.gz

配置hadoop

mkdir /usr/local/hadoop/hadoop-1.2.1/tmp        #如有,则不需创建
mkdir /usr/local/hadoop/hadoop-1.2.1/hdfs
mkdir /usr/local/hadoop/hadoop-1.2.1/hdfs/data
mkdir /usr/local/hadoop/hadoop-1.2.1/hdfs/name
cd /usr/local/hadoop/hadoop-1.2.1/conf/

修改core-site.xml

vim core-site.xml

修改为:


    
        fs.default.name
        hdfs://master:9000
    
    
        hadoop.tmp.dir
        /usr/local/hadoop/hadoop-1.2.1/tmp
    

修改hdfs-site.xml

vim hdfs-site.xml

修改为:


    
        dfs.replication
        3                #指定hdfs中文件存储的副本数,综合考虑文件安全和存储空间个人建议为2或3,如果存储空间足够当然大一点好
    
    
        dfs.name.dir
        /usr/local/hadoop/hadoop-1.2.1/hdfs/name
    
    
         dfs.data.dir
         /usr/local/hadoop/hadoop-1.2.1/hdfs/data
    

修改mapred-site.xml

vim mapred-site.xml

修改为:


    
        mapred.job.tracker
        http://master:9001
    

修改hadoop-env.sh

vim hadoop-env.sh

找到export JAVA_HOME语句,将前面的#号注释符删掉,改为

export JAVA_HOME=/usr/lib/java/jdk1.7.0_79

修改masters:

vim masters

内容修改为

master

修改slaves:

vim slaves

内容修改为

master
slave1
slave2

注意:我们这里将master即作为namenode也作为计算节点,为了更多的利用好我们的计算资源。

利用scp命令将hadoop的所有文件复制到其他机器的相同目录下。

之后在master上格式化namenode

cd /usr/local/hadoop/hadoop-1.2.1/bin/
./hadoop namenode -format

输入Y完成格式化

7. 启动hadoop

cd /usr/local/hadoop/hadoop-1.2.1/bin/
./start-all.sh

在master上输入jps命令查看启动的进程:

4115 NameNode
4238 DataNode
4620 TaskTracker
4481 JobTracker
4380 SecondaryNameNode
21007 Jps

在slave上输入jps命令查看启动的进程:

2797 DataNode
14297 Jps
2906 TaskTracker

在浏览器里输入master:50070(如果使用非集群中的机器访问,需要修改hosts)
Live Nodes显示为集群中的机器数,DeadNode为0则表示集群启动成功。

如果启动之后发现少了Datanode等进程,检查是否配置好ssh免密码登录,是否关闭防火墙。然后清除以下文件:

rm -r /tmp/hadoop*
rm -r /usr/local/hadoop/hadoop-1.2.1/tmp/*
rm -r /usr/local/hadoop/hadoop-1.2.1/hdfs/data/*
rm -r /usr/local/hadoop/hadoop-1.2.1/hdfs/name/*

所有机器都要删除这些文件,然后重启格式化namenode再启动,正常情况下是可以解决问题的。

至此hadoop集群安装完成。

二 Hive的安装

首先明确几点:

  1. Hive是数据仓库(DW),Hbase是数据库(DB)
  2. Hive是基于hdfs的,数据存储为hdfs上的文本内容(类似表的二维结构),而不是RDBMS的一张张二维数据表。但是Hive屏蔽了这些,对用户而言,就可以看做是一张张的二维表
  3. Hive只需要安装在集群中的任何一台机器上即可,不需要所有机器都安装
  4. Hive是支持JDBC的,尽管不是支持JDBC的所有特性,但是大多数是可以正常使用的
  5. Hive不是数据库,不要用来做行级别的事务处理,Hive是做数据仓库的,用来批处理,适用于大规模数据
  6. Hive其实只是提供了一个把SQL语句翻译为MapReduce程序的引擎而已,真正执行的还是MapReduce程序
  7. Hive的SQL语句和MySQL的SQL语句很相似,可以参照
  8. Hive可以使用远程的mysql存储元数据,即metastore

明确了所有的这些之后,我们进行Hive安装。
这里,我是将mysql作为远程的metastore安装在slave2上,hive安装在master上。

1. metastore的准备

首先在slave2上安装好mysql,具体安装教程参考
http://blog.csdn.net/qing_gee/article/details/49495253

mysql中新建一个数据库,名为hive,字符集必须使用latin-1,否则后面启动hive会出错。mysql新建一个用户hive,密码为hive,允许从所有主机远程访问,并对数据库hive有所有的权限。(mysql权限问题不在这里详述)

2. Hive的安装

Hive安装在/usr/local/hive目录下

mkdir /usr/local/hive
cd /usr/local/hive
wget http://114.213.234.104/x64_Linux/apache-hive-1.2.1-bin.tar.gz
tar -zxvf apache-hive-1.2.1-bin.tar.gz

修改环境变量

vim /etc/profile

加上

export HIVE_HOME=/usr/local/hive/apache-hive-1.2.1-bin

PATH变量末尾加上

:$HIVE_HOME/bin

配置hive

cd /usr/local/hive/apache-hive-1.2.1-bin
cp hive-env.sh.template hive-env.sh
vim hive-env.sh

将HADOOP_HOME修改为:

HADOOP_HOME=/usr/local/hadoop/hadoop-1.2.1

指定Hive的配置文件夹

export HIVE_CONF_DIR=/usr/local/hive/apache-hive-1.2.1-bin/conf

再修改hive-site.xml

cp hive-default.xml.template hive-site.xml
vim hive-site.xml

清空所有内容,添加以下内容:




    
        javax.jdo.option.ConnectionURL
        jdbc:mysql://mysql服务器所在的slave2的ip地址:3306/hive
    
    
        javax.jdo.option.ConnectionDriverName
        com.mysql.jdbc.Driver
    
    
        javax.jdo.option.ConnectionUserName
        hive
    
    
        javax.jdo.option.ConnectionPassword
        hive
    

再讲mysql-jdbc的jar包添加到hive目录下的lib文件夹中。
至此Hive已经配置完成了。

3. 启动Hive

在任意目录下输入

hive

即进入hive的client,默认情况下Hive会有一个名为default的数据库。输入SQL语句看是否能正确返回结果。如:

show databases;
show tables;

退出hive的client,输入

exit;

大部分的操作语句和mysql的client是保持一致的。

4. Hive的JDBC

启动hive服务器:

hiveserver2 &

然后即可在任意主机通过jdbc操作hive了。附上Maven的依赖包


    org.apache.hive
    hive-jdbc
    1.2.1



    org.apache.hadoop
    hadoop-common
    2.7.1

附上JDBC程序(省略了所有try-catch语句):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCHive {

    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    public static void main(String[] args) throws Exception {

        Class.forName(driverName);

        Connection con = DriverManager.getConnection(
            "jdbc:hive2://hiveserver所在机器ip地址:10000/default", "root", "填linuxroot用户密码即可");
        Statement stmt = con.createStatement();
        String tableName = "test";
        stmt.execute("drop table if exists " + tableName);
        stmt.execute("create table " + tableName + " (key int, value string)");
        System.out.println("Create table success!");
        // show tables
        String sql = "show tables '" + tableName + "'";
        System.out.println("Running: " + sql);
        ResultSet res = stmt.executeQuery(sql);
        if (res.next()) {
            System.out.println(res.getString(1));
        }

        // describe table
        sql = "describe " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1) + "\t" + res.getString(2));
        }

        sql = "select * from " + tableName;
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(
                String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
        }

        sql = "select count(1) from " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }
        stmt.close();
        con.close();
    }

}

5. 利用sqoop互导mysql和hive的数据

sqoop仅需安装在hive所在节点即可。

sqoop的安装目录为/usr/local/sqoop,下载 sqoop-1.4.6.bin__hadoop-1.0.0.tar.gz并解压.

mkdir /usr/local/sqoop
cd /usr/local/sqoop
wget http://114.213.234.104/x64_Linux/sqoop-1.4.6.bin__hadoop-1.0.0.tar.gz
tar -zxvf sqoop-1.4.6.bin__hadoop-1.0.0.tar.gz
cd /usr/local/sqoop/sqoop-1.4.6.bin__hadoop-1.0.0/conf/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh

修改如下:

export HADOOP_COMMON_HOME=/usr/local/hadoop/hadoop-1.2.1
export HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-1.2.1
export HIVE_HOME=/usr/local/hive/apache-hive-1.2.1-bin

sqoop配置完成。

将mysql的数据导入的hive中可以使用以下语句

cd /usr/local/sqoop/sqoop-1.4.6.bin__hadoop-1.0.0/bin
./sqoop import --connect jdbc:mysql://mysql服务器ip:3306/mysql数据库名 --username mysql用户名 --password mysql密码 --table 需要导出的mysql表名 --fields-terminated-by "\t" --lines-terminated-by "\n" --hive-import --hive-overwrite --create-hive-table --hive-table hive数据库名.hive表名(无需新建hive表,会自动创建) --delete-target-dir

将hive数据导入到mysql中:

./sqoop export --connect jdbc:mysql://mysql服务器ip:3306/mysql数据库名 --username mysql用户名 –-password mysql密码 --table  需要导入的mysql表名(需提前建好字段与hive表字段对应的表) --columns culumn1,column2,column3 --export-dir hive的表所对应的hdfs中文件路径,一般为/user/hive/warehouse/数据库名.db/表名 --input-fields-terminated-by '\t' --input-lines-terminated-by '\n'

你可能感兴趣的:(hadoop)