大数据环境hadoop hive mahout调研文档
2016、8、17
李碧
HIVE安装(jdk,mysql,hadoop已安装完成) 10
调研环境
主机 | hadoop | hive | mahout |
10.0.6.80 | master | 已安装 | 已安装 |
10.0.6.81 | slave | 未安装 | 未安装 |
10.0.6.83 | slave | 未安装 | 未安装 |
HIVE
Hive HQL查询时间统计
查询语句 | 时间 (秒) | 表大小(行数) | 备注 |
create table tcp_stream(sip bigint,slen int,snum int,dip bigint, dlen int,dnum int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; | 0.755 | 438415 | 建立 元数据表 |
load data local inpath '/home/huangcaiyun/result.txt' into table tcp_stream; | 0.764 | 438415 | 加载数据到hive |
Create table srcip as select sip as ip,sum(slen) as sendlen,sum(snum) as sendnum,sum(dlen) as recvlen,sum(dnum) as recvnum from tcp_stream group by sip; | 23.925 | 83598 | 以源ip进行分组,统计源ip的发包大小,发包数,收包大小,收包数 |
create table dstip as select dip as ip,sum(dlen) as sendlen,sum(dnum) as sendnum,sum(slen) as recvlen,sum(snum) as recvnum from tcp_stream group by dip; | 22.652 | 46263 | 以目的ip进行分组,统计目的ip的发包大小,发包数,收包大小,收包数 |
create table test_ip as select ip,sum(sendlen) as sendlen,sum(sendnum) as sendnum,sum(recvlen) as recvlen,sum(recvnum) as recvnum from ( select ip,sendlen,sendnum,recvlen,recvnum from srcip union select ip,sendlen,sendnum,recvlen,recvnum from dstip)tmp group by ip; | 23.772 | 125772 | 子查询首先合并srcip表和dstip表,存储在tmp中,然后以ip进行分组,统计所有ip的发包大小,发包数,收包大小,收包数 |
insert overwrite local directory '/home/libi/result' row format delimited fields terminated by '\t' select * from test_ip; | 13.386 | 125772 | 将test_ip表的数据导出到本地目录 |
Select * from test_ip; | 0.062 | 125772 | 查询test_ip表 |
Hive表结构
Tcp_stream表结构,共6列
序号 | 字段名 | 字段类型 | 备注(一个流中) |
1 | sip | bigint | 源ip,以整形形式存储 |
2 | slen | int | 源ip发送的累计字节数 |
3 | snum | int | 源ip发送的累计包数 |
4 | dip | bigint | 目的ip,以整形存储 |
5 | dlen | int | 目的ip接收的累计字节数 |
6 | dnum | int | 目的ip接收的累计包数 |
Srcip,dstip,test_ip表结构
序号 | 字段名 | 字段类型 | 备注 |
1 | ip | bigint | IP |
2 | sendlen | bigint | 发送的字节数 |
3 | sendnum | bigint | 发送的包数 |
4 | recvlen | bigint | 接收的字节数 |
5 | recvnum | bigint | 接收的包数 |
hive命令
原数据存储位置:/home/huangcaiyun/result.txt,该文件格式是用’\t’分隔,共6列,总共638415行。统计结果文件存储在/home/libi/ip_test/result.txt中,该文件格式是用’\t’分隔,总共125772行。
Ø xshell登录服务器10.0.6.80,用户名root,密码111111
Ø cd /home/hadoop_hive/hadoop-2.7.2/sbin
Ø ./start-all.sh 进入hadoop目录,启动所有进程
Ø cd /home/libi 进入用户目录,使用hive
Ø Hive 进入hive
Ø create table tcp_stream(sip bigint,slen int,snum int,dip bigint, dlen int,dnum int)
Ø ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
Ø load data local inpath '/home/huangcaiyun/result.txt' into table tcp_stream;
Ø dfs -ls /user/hive/warehouse/tcp_stream;
Ø show database; 默认数据库default
Ø use default;
Ø show tables;
Ø Create table srcip as select sip as ip,sum(slen) as sendlen,sum(snum) as sendnum,sum(dlen) as recvlen,sum(dnum) as recvnum from tcp_stream group by sip; 从表tcp_stream导入数据,建立表srcip;
Ø Create table dstip as select dip as ip,sum(dlen) as sendlen,sum(dnum) as sendnum,sum(slen) as recvlen,sum(snum) as recvnum from tcp_stream group by dip; 从表tcp_stream导入数据,建立表dstip;
Ø Describe dstip; 查看表结构
Ø create table test_ip as select ip,sum(sendlen),sum(sendnum),sum(recvlen),sum(recvnum) from ( select ip,sendlen,sendnum,recvlen,recvnum from srcip union select ip,sendlen,sendnum,recvlen,recvnum from dstip)tmp group by ip;
建立源ip,目的ip的汇总表,当ip字段相同时,对应字段相加
Ø insert overwrite local directory '/home/libi/result' row format delimited fields terminated by '\t' select * from test_ip;
导出表test_ip的信息到本地目录/home/libi/ip_test/ ;
Mahout时间统计
Mahout原始数据说明
进行分类的原始数据格式为:IP地址、发送字节数、发送包数、接收字节数、接收包数。
聚类过程使用k-means的原因:
首先,k-means算法能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类。 其次,k-means为克服少量样本聚类的不准确性,该算法本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方。
命令 | 时间 (分钟) | 数据大小 (行数) | 功能 | 理由 |
bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
| 4.8966 | 125772 | 以行为单位,即ip,发包大小,发包数,收包大小,收包数,使用k-means算法聚类,得到相似的ip | 因为某一个用户可能会经常修改IP地址来达到避免监控,规避风险的目的,但是虽然IP地址改了,但是其流量规模应该类似 |
Mahout命令
Hadoop fs -cmd 等价于 hdfs dfs -cmd
访问hdfs文件系统
Ø xshell登录服务器10.0.6.80,用户名root,密码111111
Ø cd /home/hadoop_hive/hadoop-2.7.2/sbin
Ø ./start-all.sh 进入hadoop目录,启动所有进程
Ø cd /home/hadoop_hive/hadoop-2.7.2
Ø bin/hdfs dfs -mkdir -p /user/root
Ø bin/hdfs dfs -mkdir -p /user/root/testdata
在hdfs 上创建/user/root路径以及/user/root/testdata文件夹(注意,mahout默认输入路径为/user/root/testdata,但是hdfs系统没有/user/root路径,所以需要自行创建root文件夹)
Ø bin/hdfs dfs -put /home/libi/ip_test/ip.txt /user/root/testdata
(bin/hadoop dfs -put /home/libi/ip_test/ip.txt /user/root/testdata)
将数据上传到mahout默认目录
Ø Hadoop -fs -lsr /user/root/testdata
查看hdfs文件目录/user/root/testdata hdfs dfs -lsr /user/root/testdata
Ø Cd /home/mahout
Ø bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
使用k-means算法进行聚类
Ø cd /home/hadoop_hive/hadoop-2.7.2
Ø bin/hadoop fs –lrs /user/root/output
在hadoop路径下,可以看到一共进行了10次聚类,文件夹clusteredPoints文件夹存放的是最终结果,里面记录了每个向量及其对应所分的类,clusters-N记录第N次迭代后每个类的中心点,data是原始数据的sequence file格式文件。
Ø Cd /home/mahout
Ø mahout seqdumper –i /user/root/ouput/clusteredPoints
在mahout路径下,查看聚类结果clusteredPoints
附录
参考文档:
https://chu888chu888.gitbooks.io/hadoopstudy/content/Content/4/chapter0402.html
Hadoop安装前配置
修改hostname
vi /etc/sysconfig/hostname
hostname=hyXX
使hostname生效
hostname hyXX
如
[root@hy83 home]# hostname hy81
修改hosts
vi /etc/hosts (80,81,83)
10.0.6.80 hy80
10.0.6.81 hy81
10.0.6.83 hy83
时间同步
ntpdate hy83(80,81)
83为配置的ntp服务器
参考文档:http://www.aboutyun.com/thread-11397-1-2.html
安装JDK
集群所有的机器都需要执行此操作
1.1下载jdk压缩包,在系统中我们是jdk1.8.0_91
1.2 tar -xvfz jdk-8u91-linux-x64.tar.gz
1.3更新环境变量
Vim /etc/profile
export JAVA_HOME=/home/zhangpeng/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile //使配置文件生效
java –version 查看到Java版本就表明安装成功了
配置master到slave的SSH免密钥登录
默认SSH服务均已安装
在mater机器上
cd ~/.ssh/
生成公钥和私钥
ssh-keygen -t rsa -P ""
将公钥追加到文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然后在master上将id_rsa.pub拷贝到slave的/home/目录下
scp ~/.ssh/id_rsa.pub root@slave1:/home
在slave机器上执行
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys
Hadoop的安装
先在master机器上装好hadoop后,通过sftp或者scp直接拷贝到slave上
在每台机器上mkdir /home/hadoop_home/tmp用作hadoop-tmp-dir
2.1下载hadoop安装包,此处是hadoop-2.7.2.tar.gz
2.2tar -xvfz hadoop-2.7.2.tar.gz
2.3更新环境变量
Vim /etc/profile
export HADOOP_HOME=/home/hadoop_hive/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
2.4更新hadoop-env.sh
Cd/home/hadoop_hive/hadoop-2.7.2/etc/hadoop //以下的文件都在此当前文件下
Vim hadoop-env.sh
export JAVA_HOME=/home/zhangpeng/jdk1.8.0_91
//加入java的安装路径
2.5配置slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
2.5.1文件slaves
cd /home/hadoop_hive/hadoop-2.7.2/etc/hadoop/
sudo vim slaves
hy80
hy81
hy83
2.5.2文件 core-site.xml 改为下面的配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hy80:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop_hive/tmp</value>
</property>
</configuration>
2.5.3文件 hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hy80:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop_hive/tmp dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop_hive/tmp/dfs/data</value>
</property>
</configuration>
2.5.4文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hy80:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hy80:19888</value>
</property>
</configuration>
2.5.5文件 yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hy80</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.7将配置好的hadoop文件copy到另一台slave机器上
scp -r hadoop-2.7.2/root@10.0.6.83:/home/hadoop_hive
2.8在master节点(hy80)上格式化namenode:
cd /home/hadoop_hive /hadoop-2.6.0/
./bin/hdfs namenode –format
2.9、启动hdfs,yarn:
cd /home/hadoop_hive /hadoop-2.6.0/
./sbin/start-all.sh
查看集群状态
./bin/hdfs dfsadmin –report
查看hdfs:http://10.0.6.80:50070/
查看RM:http://10.0.6.80:8088/
HIVE安装(jdk,mysql,hadoop已安装完成)
参考文档:https://chu888chu888.gitbooks.io/hadoopstudy/content/Content/8/chapter0807.html
HIVE与mysql装在master机器上
1.安装mysql(默认已经安装)
2.创建hive meta数据库 赋予权限
mysql –u root
mysql>create user ‘hive’@’localhost’ identified by ’hive’;
mysql>grant all privileges on *.* to hive@"%" identified by "hive" with grant option;
mysql>flush privileges;
3.测试
mysql –uhive –phive –hamster
mysql>exit;
4. 添加hive环境变量
export HIVE_HOME=/home/hadoop_hive/apache-hive-2.1.0-bin
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${HIVE_HOME}/lib
5. 修改$(HIVE_HOME)/conf下的几个template模板并重命名为其他
配置hive-env.sh文件,指定HADOOP_HOME
HADOOP_HOME=/usr/local/hadoop
修改hive-site.xml文件,指定MySQL数据库驱动、数据库名、用户名及密码,修改的内容如下所示:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hy80:3306/hive?createDatabaseIfNotExist=true</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>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/hadoop_hive/tmp</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name> <value>/home/hadoop_hive/tmp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
修改hive/bin下的hive-config.sh文件,设置JAVA_HOME,HADOOP_HOME
export JAVA_HOME=/home/zhangpeng/jdk1.8.0_91
export HADOOP_HOME=/home/hadoop_hive/hadoop-2.7.2
export HIVE_HOME=/home/hadoop_hive/apache-hive-2.1.0-bin
下载mysql-connector-java-5.1.27-bin.jar文件,并放到$HIVE_HOME/lib目录下,可以从Mysql的官方网站下载,但是记得一定要解压呀,下载的是一个tar.gz文件
初始化meta数据库
进入之前需要初始化数据库
schematool -initSchema -dbType mysql
测试hive shell
hive show databases;
show tables;
HIVE额外命令
hive不支持用insert语句一条一条的进行插入操作,也不支持update操作。数据是以load的方式加载到建立好的表中。数据一旦导入就不可以修改。
insert into table srcip select * from dstip;
alter table dst_ip change column dip ip string;
insert overwrite table src_ip select * from dst_ip;
from test_table
insert overwrite table test_insert1
select key
insert overwrite table test_insert2
select value;
对多个表进行插入操作:insert的时候,from子句即可以放在select子句后面,也可以放在 insert子句前面。
mahout安装
1.1下载压缩包,下载路径为http://mirror.bit.edu.cn/apache/mahout/0.12.2/,
下载版本为apache-mahout-distribution-0.12.2.tar.gz,存储路径为/home/mahout/apache-mahout-distribution-0.12.2。注意,mahout只需要在Hadoop集群的NameNode节点上安装一个即可,其他数据节点上不需要安装。
1.2解压缩文件到当前路径
1.3配置环境变量:vim /etc/profile
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export MAHOUT_HOME=/opt/mahout-distribution-0.9
export MAHOUT_CONF_DIR=${MAHOUT_HOME}/conf
export MAHOUT_LOCAL=
export PATH=${PATH}:${MAHOUT_HOME}/conf:${MAHOUT_HOME}/bin
export CLASSPASS=${CLASSPATH}:${MAHOUT_HOME}lib
1.4执行source/etc/profile命令,使环境变量立即生效
1.5执行命令bin/mahout。若列出一些算法,则成功,如图:
Mahout测试
2.1启动hadoop
在hadoop路径下的sbin文件夹下执行./start-all.sh命令,启动hadoop。
2.2下载测试用例
Synthetic_control.data数据集下载地址
http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data,存储地址为/home/data/syntheticcontrol.data
2.3使用命令bin/hdfs dfs -mkdir -p /user/root和bin/hdfs dfs -mkdir -p /user/root/testdata在hdfs 上创建/user/root路径以及/user/root/testdata文件夹(注意,mahout默认输入路径为/user/root/testdata,但是hdfs系统没有/user/root路径,所以需要自行创建root文件夹)
2.4将测试数据上传到hdfs系统中。
bin/hdfs dfs -put /home/data/synthetic_control.data /user/root/testdata
2.5进入到mahout路径下,使用下面命令使用kmeans算法进行聚类测试。
bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
2.6查看聚类结果。
运行结束后显示的结果如下所示:
在hadoop路径下输入指令:
bin/hadoop fs–lrs /user/root/output,列出hdfs系统中/user/root/output路径下的输出结果如下图所示。可以看到一共进行了10次聚类,文件夹clusteredPoints文件夹存放的是最终结果,里面记录了每个向量及其对应所分的类,clusters-N记录第N次迭代后每个类的中心点,data是原始数据的sequence file格式文件。
2.7在mahout存储路径下输入 mahoutseqdumper –i/user/root/ouput/clusteredPoints命令,查看clusteredPoints中的最终结果如下图所示。
clusteredPoints将按照原始数据样本的顺序,展示每个样本分别属于哪个类别,其中key后面的值是类别编号,value后面的值是数据点。
Mahout聚类
1. 删除测试数据
进入Hadoop目录,使用命令bin/hdfs dfs–rm /user/root/testdata/ synthetic_control.data
2 将数据上传到hdfs系统中。
bin/hdfs dfs -put /home/libi/ip_test/ip.txt /user/root/testdata
3 进入到mahout路径下,使用下面命令使用kmeans算法进行聚类测试。
bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
程序共运行了4.8966分钟,如下图所示:
4 查看聚类结果。
运行结束后屏幕显示的结果如下所示:
在hadoop路径下输入指令:
bin/hadoop fs–lrs /user/root/output,列出hdfs系统中/user/root/output路径下的输出结果如下图所示。可以看到一共进行了10次聚类,文件夹clusteredPoints文件夹存放的是最终结果,里面记录了每个向量及其对应所分的类,clusters-N记录第N次迭代后每个类的中心点,data是原始数据的sequence file格式文件。
5 在mahout存储路径下输入 mahoutseqdumper –i/user/root/ouput/clusteredPoints命令,查看clusteredPoints中的最终结果如下图所示。
其中Key后面的值是该数据对应的聚类中心的编号,对应在源文件的哪一行,wt表示权重,distance表示到中心距离,vec中第一组数值表示ip地址,第二组数值表示该ip地址收发的字节数,第三组数值表示收发的包数。数据前的“0”,“1”,“2”等标号表示该组数值在原数据中的列数。经过统计,K值一共有6个,编号分别为20356 30968 42375 72244 93988 118705,其对应数据为:
987343137 0 0 7668 7
1094142577 0 0 86713 124
1744573060 0 0 1812 4
2043495260 0 0 6 2
3029971136 0 0 457 1
3702552199 0 0 3081600 2140
使用下列命令可以将每一类的点列出来
mahout clusterdump –i /user/root/output/clusters-10-final –p /user/root/output/clusteredPoints –o /home/data/final.txt
其中n为某类的样本数目,c为各类各属性的中心,r为各类属性的半径。