略过
集群中各台机器安装一样的系统。root用户登录系统,避免繁琐的权限问题。
修改主机名:
vim /etc/sysconfig/network
HOSTNAME=master
其他机器分别改为slave1,slave2…
修改host:
vim /etc/hosts
分别添加集群中各节点的ip地址以及主机名。
重启所有机器。
查看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
如不需密码即可登录任意其他主机,则代表设置成功。
`service iptables stop` (关闭防火墙,但重启会再次启动)
`chkconfig iptables off` (开机不启动)
集群各机器均需关闭
余下所有的操作步骤只需在master上进行,然后复制文件到其他机器即可。
卸载系统自带的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是否正确安装。
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完成格式化
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安装。
这里,我是将mysql作为远程的metastore安装在slave2上,hive安装在master上。
首先在slave2上安装好mysql,具体安装教程参考
http://blog.csdn.net/qing_gee/article/details/49495253
mysql中新建一个数据库,名为hive,字符集必须使用latin-1,否则后面启动hive会出错。mysql新建一个用户hive,密码为hive,允许从所有主机远程访问,并对数据库hive有所有的权限。(mysql权限问题不在这里详述)
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已经配置完成了。
在任意目录下输入
hive
即进入hive的client,默认情况下Hive会有一个名为default的数据库。输入SQL语句看是否能正确返回结果。如:
show databases;
show tables;
退出hive的client,输入
exit;
大部分的操作语句和mysql的client是保持一致的。
启动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();
}
}
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'