大数据Hadoop、Slurm平台

安 装 配 置 手 册

河北科技大学理学院

王子元

2018年6月

绪论

本人本科毕业设计选的是《数学系大数据环境建设》课题,实验集群采用四台惠普工作站做为节点服务器,采用一台虚拟机和3台真机作为实验环境,下文的整个配置记录全部真实有效,虽说这只是我的本科毕业设计的附件,但没有半点水分。系统完全按照刀片式服务器集群来部署,更加真实的模拟了华为刀片服务器集群的运行环境。另外有两个主要的创新之处:一、配置了时间服务器,使集群对时精准到0.05秒,精确度远远高于集群要求的时间误差3秒。二、制作了一个基于Python的自动化脚本,将绝大多数的集群操作命令集合在其中,实现半自动化集群管理操作,极大地降低的普通用户对集群操作学习的成本。 感谢周长杰老师的提供的参考依据,感谢李国刚老师、阎晨光老师的对硬件设备的支持,为我实验的顺利进行保驾护航,感谢白晓刚学长对我Slurm过程的帮助。我的本科毕业设计,虽然最后仅以4分之差没有拿到优秀,但是在公开答辩时,我得到了答辩组所有老师的认可,能够做到这样我也算满足了,这三个月的努力没白费。本人作为数学系信息与计算科学专业的学生,我感觉目前自己对整个计算机生态的理解并不比计算机系的差,而我个人认为未来的计算机发展方向是人工智能、机器学习,所以我又选择的了攻读数学系的研究生,我相信未来会在数学和计算机这个交叉方向取得一些成绩。

目录

hadoop web管理地址... 3

Linux篇... 3

HDFS篇... 7

MapReduce篇... 14

zookeeper篇... 24

Hbase篇... 25

Hive篇... 36

Slurm篇... 41

NTP时间服务器篇... 43

Python脚本篇... 45

hadoop web管理地址

1 HDFSWeb管地址

http://192.168.1.201:50070/

2 MapReduceWeb管理地址

http://192.168.1.201:8088/

3 HBaseWeb管理地址

http://192.168.1.201:16010/

4 HiveWeb管理地址

http://192.168.1.201:9999/hwi/

Linux篇

一 常用命令

which java    which查看文件所在位置

which javac

rm -rf /usr/bin/java  rm-rf 强制删除

rm -rf /usr/bin/javac

ln -s $JAVA_HOME/bin/javac /usr/bin/java    链接位置

ln -s $JAVA_HOME/bin/javac /usr/bin/javac

netstat -an | grep 10000

ps -aux | grep 'metastore'

ifconfig      查看ip

hostname

service iptables stop

chkconfig iptables off

service network restart  重启网卡

source /etc/profile

vi

scp

cd

ll

ls

reboot

poweroff

二 操作系统安装配置

1 规划IP地址:

Router 192.168.1.1

Linux

master   192.168.1.200

slave01  192.168.1.201

slave02  192.168.1.202

slave03  192.168.1.203

2.制作U盘启动盘

2.1通过软碟通制作好U盘启动工具

准备 U盘(8G)、rhel-server-7.0-x86_64-dvd.iso、UltraISO软碟通软件

2.2 在电脑上安装上UltraISO软碟通软件

2.3 将准备好的U盘插入电脑,双击UltraISo图标,选择继续试用

2.4 选择文件--打开

2.5 启动--写入映像..

2.6 选择自己U盘,点击 写入 (在写入之前,系统先格式化U盘,请提前做好备份),等待一段时间(等待时间由电脑配置决定)

2.linux 7.0 安装步骤

2.1选择界面第一个(Install Red Hat Enterprise Linux 7.0)开始安装

2.2 选择中文和简体中文(中国),点击继续

2.3.1 选择软件选择,选择左侧带GUI的服务器。右侧为系统自带的的环境附加选项,若有需要,可以自行选择。之后,点击完成

2.3.2点击安装位置,选择硬盘,点击完成。然后会弹出对话框,点击回收空间——全部删除——回收空间

2.3.3点击网络和主机名,输入主机名(如master,slave01,slave02,slave03)点击完成;第二步,

配置网络

选择自动连接、允许所有用户使用

选择IPV4设置

方法选择手动

添加网卡并配置:地址192.168.1.xxx 掩码255.255.255.0 网关192.168.1.1

DNS 192.168.1.1,114.114.114.114

应用

3.3点击网络和主机名,输入主机名(如master,slave01,slave02,slave03)点击完成。

3.4点击开始安装,选择root密码,输入hadoop

3.5安装完成后重启,选择为许可信息,同意许可协议,完成,点击完成配置

3.6点击前进

3.7输入hadoop密码,进入界面化linux系统,等待弹出对话框,点击前进——前进——点击 Start using Red Hat Enterprise Linux Server 此时安装完成。

4 配置终端快捷方式

选择应用程序—系统工具—设置—键盘—快捷键—自定义快捷键,点击“+”号,名字:terminal

命令:gonme-terminal ,应用。点击terminal,按ctrl+t,关掉窗口。自己键盘输入:ctrl+t,弹出命令窗口,设置完成

6 配置Red Hat 7.0防火墙(需要切换到root帐户)

查看防火墙状态 systemctl status firewalld

关闭防火墙 systemctl stop firewalld

永久关闭防火墙 systemctl disable firewalld

7 检查网络互通是否正常

ping 192.168.1.1

ping 192.168.1.20x

8 查看Red Hat系列的系统版本

cat /etc/redhat-release

9 配置Red Hat hosts (需要切换到root帐户)

vim /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.200 master

192.168.1.201 slave01

192.168.1.202 slave02

192.168.1.203 slave03

用ping命令检查主机名通讯是否正常(e.g. ping master)

三 配置  ssh 互信

1 生成密钥 ·····

ssh1-keygen

一路回车

2 把公钥发给所有机器

ssh-copy-id master

ssh-copy-id slave01

中间要输入yes和密码hadoop

3 用ssh命令检查是否互信成功

ssh master

ssh slave01

不要求输入密码则成功

4 备注:

生成的密钥在/home/hadoop/.ssh中,其中.ssh是隐藏的

authorized_keys为已经互信的机器公钥信息

四 安装xShellxFtp

1 在windows下安装,选择免费版本

在session管理窗口中,建立一个与linux主机同名的链接名,并配置主机IP

连接,输入用户名并保存,输入密码并保存,生成验证信息并保存

此时已经连接到Linux主机,可以用命令行操作我们安装好的CentOS了

2 安装 xFtp

在windows下安装,选择免费版本

不需要启动,我们使用时在xShell中用右数第八个图标启动,不需要用户名密码

五 安装配置 Redhat JDK

1在hadoop用户的根目录(/home/hadooop)创建文件夹app

2 从xShell启动xFtp

3 从windows本地上传jdk-8u121-linux-x64.tar.gz到app下

4 解压jdk-8u65-linux-x64.tar.g到app下

cd app

tar –zxvf jdk-8u65-linux-x64.tar.gz

cd ~

5配置环境变量(需要切换到root帐户)

5.1 gedit /etc/profile

5.2在最后增加两行

JAVA_HOME=/home/hadoop/app/jdk1.8.0_121

export PATH=$PATH:$JAVA_HOME/bin

6 把修改的环境变量生效

source /etc/profile

7 检测并配置jdk

7.1 检测jdk版本,应该为java  version "1.8.0_121",javac  1.8.0_121

java –version

javac –version

7.2 检查jdk位置,应该为~/app/jdk1.8.0_121/bin/java,~/app/jdk1.8.0_121/bin/javac

which java

which javac

7.3 如果不正确,则删除原有的java/javac,链接新的

rm -rf /usr/bin/java

rm -rf /usr/bin/javac

ln –s  $JAVA_HOME/bin/java  /usr/bin/java

ln –s  $JAVA_HOME/bin/javac  /usr/bin/javac

Eclipse安装配置

1 在windows下解压eclipse-jee-mars-2-win32-x86_64.zip

2 配置workspace

七 常用配置文件位置

1 主机名

/etc/sysconfig/network

2 主机IP配置信息

/etc/sysconfig/network-scripts/ifcfg-eth0

3 环境变量配置信息

/etc/profile

4 静态路由配置信息

/etc/hosts

HDFS篇

一 安装配置

1.1 从xShell启动xFtp

1.2 从windows本地上传hadoop-2.6.0.tar.gz到app下

1.3 解压hadoop-2.6.0.tar.gz到app下

cd app

tar –zxvf hadoop-2.6.0.tar.gz

cd ~

1.4修改配置文件app/hadoop-2.6.0/etc/hadoop/hadoop-env.sh,

找到

export JAVA_HOME=${JAVA_HOME}

替换为

export JAVA_HOME=/home/hadoop/app/jdk1.8.0_121

1.5修改配置文件app/hadoop-2.6.0/etc/hadoop/core-site.xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://master:9000</value>

</property>

<property>

<name>io.file.buffer.size</name>

<value>131072</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/hadoop/appdata/hadoop/tmp</value>

</property>

</configuration>

1.6修改配置文件hadoop-2.6.0/etc/hadoop/hdfs-site.xml

<configuration>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>master:9001</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>/home/hadoop/appdata/hadoop/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/home/hadoop/appdata/hadoop/dfs/data</value>

</property>

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

</configuration>

1.7 修改修改配置文件hadoop-2.6.0/etc/hadoop/mapred-site.xml

1.7.1复制mapred-site.xml.template,更名为mapred-site.xml

1.7.2 配置

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>master:10020</value>

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>master:19888</value>

</property>

</configuration>

1.8修改配置文件hadoop-2.6.0/etc/hadoop/yarn-site.xml

<configuration>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

<value>org.apache.hadoop.mapred.ShuffleHandler</value>

</property>

<property>

<name>yarn.resourcemanager.address</name>

<value>master:8032</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address</name>

<value>master:8030</value>

</property>

<property>

<name>yarn.resourcemanager.resource-tracker.address</name>

<value>master:8035</value>

</property>

<property>

<name>yarn.resourcemanager.admin.address</name>

<value>master:8033</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address</name>

<value>master:8088</value>

</property>

</configuration>

1.9修改配置文件hadoop-2.6.0/etc/hadoop/slaves

slave01

slave02

slave03

1.10 如果集群中其他机器没有配置,可以直接复制

scp –r app/hadoop-2.6.0 slave01:~/app/

HDFS 系统操作

2.1 格式化

~/app/hadoop-2.6.0/bin/hdfs namenode –format

注意:格式化只能操作一次并且在主节点格式化,如果需要再次格式化,需要把appdata/hadoop目录清空或者直接删除所有节点的appdata文件

2.2 启动

~/app/hadoop-2.6.0/sbin/start-all.sh

2.3 查看是否启动正确

2.3.1 查看日至输出

2.3.2 查看进程jps

2.3.2.1 master节点

NameNode

SecondaryNameNode

ResourceManager

2.3.2.2 datanode节点

DataNode

NodeManager

2.4 停止

app/hadoop-2.6.0/sbin/stop-all.sh

2.5 复制

scp –r ~/app/hadoop-2.6.0 slave01:~/app/

HDFS Shell操作

3.1创建目录

3.1.1创建单级目录

bin/hadoop dfs -mkdir /abc

3.1.2 创建多级目录

bin/hadoop dfs -mkdir -p /a/b/c

3.2查看目录的内容

bin/hadoop dfs -ls /

3.3上传文件,从linux系统把文件上传到HDFS

bin/hadoop dfs -put etc/hadoop/core-site.xml /

3.4 下载文件,从HDFS把文件下载到linux系统

bin/hadoop dfs -get /core-site.xml .

3.5 查看HDFS文件内容

bin/hadoop dfs -cat /core-site.xml

3.6 删除HDFS上的文件或目录

3.6.1 删除空的目录

bin/hadoop dfs -rmdir /a/b/c

3.6.2 删除文件

bin/hadoop dfs -rm /core-site.xml

3.6.3 递归删除目录(删除非空目录)

bin/hadoop dfs -rm -r /a

3.7 安全模式

bin/hdfs dfsadmin -safemode

hdfs dfsadmin [-safemode enter | leave | get | wait]

3.8检查整个文件系统的健康状况

bin/hdfs fsck /

Usage: fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

<path> 检查这个目录中的文件是否完整

-move 破损的文件移至/lost+found目录

-delete 删除破损的文件

-openforwrite 打印正在打开写操作的文件

-files 打印正在check的文件名

-blocks 打印block报告 (需要和-files参数一起使用)

-locations 打印每个block的位置信息(需要和-files参数一起使用)

-racks 打印位置信息的网络拓扑图 (需要和-files参数一起使用)

WEB操作

4.1 HDFS的Web管理地址

http://192.168.1.201:50070/

4.2 集群状态

4.3 集群DataNode状态

4.3 集群文件浏览

4.4 集群文件属性

API操作

5.1 启动eclipse

windows下双击eclipse图标

5.2 创建工程(testHadoop)

File->new-java project

5.3 在testHadoop工程下创建文件夹lib

5.4 导入hadoop hdfs api访问需要的jar包

5.4.1 windows本地winrar解压hadoop-2.6.0.tar.gz

5.4.2 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\common\*.jar,粘贴到lib

5.4.3 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\common\lib\*.jar,粘贴到lib

5.4.4 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\common\sources\*.jar,粘贴到lib

5.4.5 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\hdfs\*.jar,粘贴到lib

5.4.6 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\hdfs\lib\*.jar,粘贴到lib

5.4.7 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\hdfs\sources\*.jar,粘贴到lib

5.4.8 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\mapreduce\*.jar,粘贴到lib

5.4.9 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\mapreduce\lib\*.jar,粘贴到lib

5.4.10 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\mapreduce\sources\*.jar,粘贴到lib

5.4.11 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\yarn\*.jar,粘贴到lib

5.4.12 复制hadoop-2.6.0\ hadoop-2.6.0\share\hadoop\yarn\lib\*.jar,粘贴到lib

5.4.13 复制hadoop-2.6.0\hadoop-2.6.0\share\hadoop\yarn\sources\*.jar,粘贴到lib

5.5 选择lib下的所有 .jar文件,右击鼠标选择build path->add to build path,会在工程下自动生成Referenced Libraries

5.6 写API读写程序

5.6.1 在src上右击鼠标->new->Package,输入包名testHDFS

5.6.2 在testHDFS上右击鼠标->new->Class,输入类名TestHDFSAPI,选择 public static void main(String[] args),完成。

5.6.3 编写读文件程序

import java.io.IOException;

import java.io.InputStream;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileStatus;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.junit.Test;

public class TestHDFSAPI {

public static void main(String[] args){

Configuration conf=new Configuration();

try {

URI uri=new URI("hdfs://192.168.1.201:9000");

FileSystem fs= FileSystem.get(uri,conf);

InputStream inputStream=fs.open(new Path("/core-site.xml"));

int i;

while((i=inputStream.read())!=-1)

{

System.out.print((char)i);

}

fs.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

}

5.6.4 编写上传文件程序

Configuration conf=new Configuration();

try {

URI uri=new URI("hdfs://192.168.1.201:9000");

FileSystem fs= FileSystem.get(uri,conf);

Path src=new Path("d:/logwzy.txt");

Path dest=new Path("/");

fs.copyFromLocalFile(false, true,src,dest);

fs.close();

}

catch (Exception e) {

e.printStackTrace();

}

5.6.5 编写浏览HDFS根目录程序

Configuration conf=new Configuration();

try {

URI uri=new URI("hdfs://192.168.1.201:9000");

FileSystem fs= FileSystem.get(uri,conf);

FileStatus[] fileStatus=fs.listStatus(new Path("/"));

for(int i=0;i<fileStatus.length;i++)

{

FileStatus status=fileStatus[i];

System.out.println("文件名称:"+status.getPath());

System.out.println("复制因子:"+status.getReplication());

System.out.println("文件长度:"+status.getLen());

System.out.println("--------------------------");

}

fs.close();

}

catch (Exception e) {

e.printStackTrace();

}

5.7 运行程序

鼠标右击TestHDFSAPI类代码空白处,Run As->Java Application

MapReduce篇

MapReduce Web管理

1.1 mapreduce的Web管理地址

http://192.168.1.201:8088/

1.2 mapreduce的Web管理界面

1.2.1集群信息

1.2.2 节点信息

1.2.3 所有任务

1.2.4 已提交任务

1.2.5 已接受任务

1.2.6 正在运行的任务

1.2.7 已结束的任务

1.2.8 失败的任务

MapReduce程序开发准备工作

2.1 运行环境准备

2.1.1 windows本地winrar解压hadoop-2.6.0.tar.gz

2.1.2 设置HADOOP_HOME环境变量,为刚才的解压目录

2.1.3 把winutils.exe文件放到%HADOOP_HOME%的bin目录中

2.1.4 把hadoop.dll文件放到c:/windows/System32目录下,否则会报错

2.1.5 解压hadoop-2.6.0\share\hadoop\common\sources\hadoop-common-2.6.0-sources.jar文件,在解压后的文件中找到org\apache\hadoop\io\nativeio\NativeIO.java文件,把它复制到对应的eclipse的testHadoop  project中src的文件夹下,NativeIO.java文件还要在原来的包名下(即project工程下,文件路径应为src\org\apache\hadoop\io\nativeio.java)

2.1.6 修改NativeIO.java文件的557行,替换为return true;

2.1.7 用管理员身份启动eclipse,修改错误级别

鼠标右击项目->Properties->Java Compiler->Errors/Warnings,勾选Enable project specific settings,把Deprecated and restricted API下的Forbidden reference的值设置为Warning

2.2本地模式 处理的文件和运算都在本地执行

2.2.1 准备数据

在d盘创建文件佳testhadoop,在testhadoop下创建input,在input下创建文件test.txt,并写入如下内容

good good study

day day up

2.2.2 配置运行参数

2.2.2.1鼠标右击WCRunner类代码空白处->Run As->Run Configurations

2.2.2.2 选择Arguments页

2.2.2.3 在Program arguments中写入运行参数

d:/testhadoop/input d:/testhadoop/output

2.2.3 运行

鼠标右击WCRunner类代码空白处->Run As->Java Application

2.3半本地模式 处理的文件在HDFS,运算在本地进行

2.3.1 准备数据

2.3.1.1 在linux /home/hadoop/testhadoop下创建test文件,内容如下

good good study

day day up

2.3.1.2 在集群上创建文件夹/testhadoop/input

bin/hadoop dfs -mkdir -p /testhadoop/input

2.3.1.2 把test文件上传到/testhadoop/input中

bin/hadoop dfs -put /home/hadoop/testhadoop/test / testhadoop/input

2.3.2 配置运行参数

2.3.2.1鼠标右击WCRunner类代码空白处->Run As->Run Configurations

2.3.2.2 选择Arguments页

2.3.2.3 在Program arguments中写入运行参数

hdfs://master:9000/input hdfs://master:9000/output

2.3.2.4 在VM arguments中写入运行参数

-DHADOOP_USER_NAME=hadoop

2.3.3 运行

鼠标右击WCRunner类代码空白处->Run As->Java Application

2.4集群模式 jar形式运行,在linux中提交

2.4.1 准备数据

2.4.1.1 在linux /home/hadoop/testhadoop下创建test文件,内容如下

good good study

day day up

2.4.1.2 在集群上创建文件夹/testhadoop/input

bin/hadoop dfs -mkdir -p /testhadoop/input

2.4.1.2 把test文件上传到/testhadoop/input中

bin/hadoop dfs -put /home/hadoop/testhadoop/test / testhadoop/input

2.4.2 导出jar包wc.jar

2.4.3 把wc.jar传到linux的/home/hadoop/testhadoop下

2.4.4 运行

bin/hadoop jar ~/testhadoop/wc.jar testMR.WCRunner /testhadoop/input /testhadoop/

output

注意:输出目录必须是不存在的

MapReduce程序开发

3.1 分词统计wordcount

3.1.1 新建testMR包

在src上右击鼠标->new->Package,输入包名testMR

3.1.2 新建WCMapper类,并编写代码

3.1.2.1 在testMR上右击鼠标->new->Class,输入类名WCMapper,不选择 public static void main(String[] args),完成。

3.1.2.2 代码

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {

@Override

protected void map(LongWritable key, Text value,

org.apache.hadoop.mapreduce.Mapper.Context context)

throws IOException, InterruptedException {

String line = value.toString();

String words[] = line.split(" ");

for(String word:words)

context.write(new Text(word), new LongWritable(1));

}

}

3.1.3 新建WCReducer类,并编写代码

3.1.3.1 在testMR上右击鼠标->new->Class,输入类名WCReducer,不选择 public static void main(String[] args),完成。

3.1.3.2 代码

import java.io.IOException;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{

@Override

protected void reduce(Text key, Iterable<LongWritable> values,

Reducer<Text, LongWritable, Text, LongWritable>.Context context)throws IOException, InterruptedException {

long sum=0;

for(LongWritable value:values)

sum+=value.get();

context.write(key, new LongWritable(sum));

}

}

3.1.4 新建WCRunner类,并编写代码

3.1.4.1 在testMR上右击鼠标->new->Class,输入类名WCRunner,选择 public static void main(String[] args),完成。

3.1.4.2 代码

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WCRunner {

public static void main(String[] args) {

Configuration conf=new Configuration();

try{

Job job=Job.getInstance(conf);

job.setJobName("zcjJob");

job.setJarByClass(WCRunner.class);

job.setMapperClass(WCMapper.class);

job.setReducerClass(WCReducer.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(LongWritable.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(LongWritable.class);

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.waitForCompletion(true);

}

catch(Exception e){

e.printStackTrace();

}

}

}

3.2 倒排索引invertindex

3.2.1新建invertindex包

3.2.2 新建map1类,不选择main方法,并编写代码

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.lib.input.FileSplit;

public class map1 extends Mapper<LongWritable, Text, Text, LongWritable> {

@Override

protected void map(LongWritable key, Text value,

org.apache.hadoop.mapreduce.Mapper.Context context)

throws IOException, InterruptedException {

// TODO Auto-generated method stub

FileSplit fileSplit = (FileSplit) context.getInputSplit();

String fileName = fileSplit.getPath().getName();

String line = value.toString();

String words[] = line.split(" ");

for (String word : words) {

context.write(new Text(word + "\t" + fileName), new LongWritable(1));

}

}

}

3.2.3 新建Reduce1类,不选择main方法,并编写代码

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Reducer;

public class Reduce1 extends Reducer<Text, LongWritable, Text, LongWritable>{

@Override

protected void reduce(Text key, Iterable<LongWritable> values,

Reducer<Text, LongWritable, Text, LongWritable>.Context context)

throws IOException, InterruptedException {

// TODO Auto-generated method stub

long sum=0;

for(LongWritable value:values){

sum+=value.get();

}

context.write(key,new LongWritable(sum));

}

}

3.2.4 新建map2类,不选择main方法,并编写代码

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

public class Map2 extends Mapper<LongWritable, Text, Text, Text>{

@Override

protected void map(LongWritable key, Text value,

Mapper<LongWritable, Text, Text, Text>.Context context)

throws IOException, InterruptedException {

// TODO Auto-generated method stub

String line= value.toString();

String[] strs=line.split("\t");

if(strs!=null && strs.length==3){

String word=strs[0];

String filename=strs[1];

String count=strs[2];

context.write(new Text(word), new Text(filename+"---"+count));

}

}

}

3.2.5 新建Reduce2类,不选择main方法,并编写代码

import java.io.IOException;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Reducer;

public class Reduce2 extends Reducer<Text, Text, Text, Text>{

@Override

protected void reduce(Text key, Iterable<Text> values,

Reducer<Text, Text, Text, Text>.Context context)

throws IOException, InterruptedException {

String result="";

for(Text value:values){

if(result.length()>0){

result+=",";

}

result+=value;

}

context.write(key, new Text(result));

}

}

3.2.6 新建InvertIndexRunner类,选择main方法,并编写代码

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class InvertIndexRunner {

public static void main(String[] args) {

Configuration conf=new Configuration();

try{

Job job=Job.getInstance(conf);

job.setJobName("zcj-invertIndex 1");

job.setJarByClass(InvertIndexRunner.class);

job.setMapperClass(map1.class);

job.setReducerClass(Reduce1.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(LongWritable.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(LongWritable.class);

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.waitForCompletion(true);

Job job2=Job.getInstance(conf);

job2.setJobName("zcj-invertIndex 2");

job2.setJarByClass(InvertIndexRunner.class);

job2.setMapperClass(Map2.class);

job2.setReducerClass(Reduce2.class);

job2.setMapOutputKeyClass(Text.class);

job2.setMapOutputValueClass(Text.class);

job2.setOutputKeyClass(Text.class);

job2.setOutputValueClass(Text.class);

FileInputFormat.addInputPath(job2, new Path(args[1]));

FileOutputFormat.setOutputPath(job2, new Path(args[2]));

job2.waitForCompletion(true);

}

catch(Exception e){

e.printStackTrace();

}

}

}

zookeeper篇

一 安装配置

1.1 从windows本地上传zookeeper-3.4.6.tar.gz到app下

2.2 解压zookeeper-3.4.6.tar.gz到app下

cd app

tar –zxvf zookeeper-3.4.6.tar.gz

cd ~

2.3配置zookeeper

2.3.1 复制zoo_sample.cfg,更名为zoo.cfg

2.3.2配置zoo.cfg

tickTime=2000

initLimit=5

syncLimit=2

dataDir=/home/hadoop/zkdata/data

dataLogDir=/home/hadoop/zkdata/logs

clientPort=2181

server.1=192.168.1.200:8881:7771

server.2=192.168.1.201:8881:7771

server.3=192.168.1.202:8881:7771

server.4=192.168.1.203:8881:7771

2.4 创建输出文件夹

2.4.1 创建zkdata文件夹

/home/hadoop/zkdata

2.4.2 创建data文件夹

/home/hadoop/zkdata/data

2.4.3 创建log文件夹

/home/hadoop/zkdata/log

2.5 创建myid文件

2.5.1 在/home/hadoop/zkdata/data下创建myid文件

2.5.2 在myid文件中写入该机器在zoo.cfg中配置的序号

二 时间同步(需要切换到root帐户)

2.1 打开日期/时间属性对话框

系统->管理->日期和时间

2.2 时区设置

2.2.1 选择时区tab页

2.2.2 用鼠标选取,上海亚洲

2.2.3 取消系统时间使用UTC时间选择

2.3 时间设置

2.3.1 在网络上同步日期和时间选择

2.3.2 选择正确的日期

2.3.3 在时分秒输入框中,输入比正确时间早1分分钟的整点时间,等待时间到时所有机器同时操作点击确定

2.4 调整位置

2.4.1 点击右上角日期时间显示区域

2.4.2 点击编辑,选择位置页

2.4.3 填加或者编辑,选择上海中国

2.5 调整时钟显示秒

2.4.1 点击右上角日期时间显示区域

2.4.2 点击编辑,选择位常规

2.4.3 设置时间格式24小时制

2.4.4 面板显示,勾选显示秒

三 启停操作

3.1 zookeeper启动

app/zookeeper-3.4.6/bin/zkServer.sh start

注意:多台机器尽量同时启动,减少时间误差

3.2 查看启动是否正常

3.2.1 jps

QuorumPeerMain

3.2.2 app/zookeeper-3.4.6/bin/zkServer.sh status

stand-alone  Leader   Follower

3.3 zookeeper停止

app/zookeeper-3.4.6/bin/zkServer.sh stop

Hbase篇

一 安装配置

1.1 从windows本地上传hbase-1.0.1.1-bin.tar.gz到app下

2.2 解压hbase-1.0.1.1-bin.tar.gz到app下

cd app

tar – zxvf hbase-1.0.1.1-bin.tar.gz

cd hbase-1.0.1.1-bin.tar.gz/

2.3配置/home/hadoop/app/hbase-1.0.1.1/conf/hbase-env.sh

复制zoo_sample.cfg,更名为zoo.cfg

export JAVA_HOME=/home/hadoop/app/jdk1.8.0_121

export HBASE_CLASSPATH=/home/hadoop/app/hadoop-2.6.0/etc/hadoop

export HBASE_MANAGES_ZK=false

2.3配置/home/hadoop/app/hbase-1.0.1.1/conf/hbase-site.xml

<configuration>

<property>

<name>hbase.zookeeper.quorum</name>

<value>slave01:2181,slave02:2181,slave03:2181</value>

</property>

<property>

<name>hbase.zookeeper.property.dataDir</name>

<value>/home/hadoop/zkdata/data</value>

</property>

<property>

<name>hbase.cluster.distributed</name>

<value>true</value>

</property>

<property>

<name>hbase.rootdir</name>

<value>hdfs://master:9000/hbase</value>

</property>

<property>

<name>hbase.master.info.port</name>

<value>16010</value>

</property>

<property>

<name>hbase.regionserver.port</name>

<value>16201</value>

</property>

<property>

<name>hbase.regionserver.info.port</name>

<value>16301</value>

</property>

</configuration>

2.4 配置backup-masters

创建app/hbase-1.0.1.1/conf/backup-masters

向backup-masters中写入内容备份主节点主机名

2.5 配置regionservers

向regionservers中写入regionserver主机名,每行一个

slave02

slave03

二 启停操作

2.1 启动hbase

~/app/hbase-1.0.1.1/bin/start-hbase.sh

2.2 使用jps命令查看运行状态

2.2.1 master节点

HMaster

2.2.2 bakup-master节点

HMaster

2.2.3 region节点

HRegionServer

2.3停止hbase

~/app/home/hadoop/app/hbase-1.0.1.1/bin/stop-hbase.sh

Shell操作

3.1 shell启动

~app/hbase-1.0.1.1/bin/hbase shell

3.2 shell退出

exit;

3.3 shell常用命令

3.3.1 创建表

create 'users', 'cf1','cf2'

create 'usersx',{NAME=>'cf1',VERSIONS>=3},'cf2'

3.3.2 列出所有表

list

3.3.3 获取表描述信息

dscribe 'users'

3.3.4 写或更新入数据

3.3.4.1 添加纪录

put 'users','xiaoming','cf1:Age','24';

put 'users','xiaoming','cf1:Sex','male';

put 'users','xiaoming','cf2:Address','shi jia zhuang yu hua qu';

3.3.4.2 更新纪录

put 'users','xiaoming','cf1:Age','25';

3.3.4.3 增加版本数据

put 'usersx','xiaoming','cf1:Age' ,'29'

3.3.5 读数据

3.3.5.1 获取某行数据

get 'users','xiaoming'

3.3.5.2 获取某行某列族数据

get 'users','xiaoming','cf1'

3.3.5.3 获某单元格数据

get 'users','xiaoming','cf1:age'

3.3.5.4 获取单元格数据的版本数据,其中N为想要获取的版本个数

get 'usersx','xiaoming',{COLUMN=>'cf1:age',VERSIONS=>N}

3.3.5.5获取单元格数据的时间戳数据

get 'usersx','xiaoming',{COLUMN=>'cf1:age',TIMESTAMP=>1364874937056}

3.3.6 删除某行某列

delete 'users','xiaoming','cf1:age'

3.3.7 删除行

deleteall ‘users’,’xiaoming’

3.3.8 统计表行数

count 'users'

3.3.9 全表扫描

scan 'users'

3.3.10 清空表

truncate 'users'

3.3.11 停用表

disable 'users'

3.3.12 启用表

Enable 'users'

3.3.13删除表

disable 'users'

drop 'users

备注:向前删除需要按ctrl键,否则无效

API操作

4.1 开发用到的jar包

windows本地winrar解压hbase-1.0.1.1-bin.tar.gz

hbase-1.0.1.1\lib\hbase-*.jar

netty-all-4.0.23.Final.jar

htrace-core-3.1.0-incubating.jar

4.2 Hbase增删改查

4.2.1 新建testHbase包

在src上右击鼠标->new->Package,输入包名testHbase

4.2.2 新建HbaseCRUD类,并编写代码

在testHive上右击鼠标->new->Class,输入类名HbaseCRUD,不选择 public static void main(String[] args),完成。

4.2.3 代码

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.CellUtil;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Delete;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Row;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.util.Bytes;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class HbaseCRUD {

private Configuration conf;

private Connection conn;

@Before

public void init()

{

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "slave2:2181,slave3:2181,slave4:2181");

conf.set("hbase.rootdir", "hdfs://master:9000/hbase");

try {

conn = ConnectionFactory.createConnection(conf);

}

catch (IOException e) {

e.printStackTrace();

}

}

@After

public void end() {

try {

conn.close();

}

catch (IOException e) {

e.printStackTrace();

}

}

@Test

public void testPut()

{

try {

Table table=conn.getTable(TableName.valueOf("test"));

Put put=new Put(Bytes.toBytes("zcj"));

put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"), Bytes.toBytes(22));

put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("address"), Bytes.toBytes("TianJin"));

table.put(put);

table.close();

}

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

@Test

public void testGet() {

try {

Table table = conn.getTable(TableName.valueOf("test"));

Get get = new Get(Bytes.toBytes("xiaohong"));

get.setMaxVersions(5);

Result result = table.get(get);

List<Cell> cells = result.getColumnCells(Bytes.toBytes("cf1"), Bytes.toBytes("address"));

for (Cell cell : cells)

System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void testDelete() {

try {

Table table = conn.getTable(TableName.valueOf("test"));

Delete delete = new Delete(Bytes.toBytes("xiaohong"));

delete.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"));

table.delete(delete);

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void testBatch() {

try {

Table table = conn.getTable(TableName.valueOf("test"));

List<Row> actions = new ArrayList<Row>();

actions.add(new Put(Bytes.toBytes("xiaohong1")).addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"), Bytes.toBytes("22")));

actions.add(new Put(Bytes.toBytes("xiaohong2")).addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"), Bytes.toBytes("23")));

actions.add(new Delete(Bytes.toBytes("xiaohong1")));

Object[] results = new Object[actions.size()];

table.batch(actions, results);

for (int i = 0; i < results.length; i++) {

System.out.println("Result[" + i + "]: type = " +

results[i].getClass().getSimpleName() + "; " + results[i]);

}

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void testScan() {

try {

Table table = conn.getTable(TableName.valueOf("test"));

Scan scan =new Scan();

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

while(iter.hasNext()) {

Result result = iter.next();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

resultScanner.close();

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

}

4.2.4 运行

选择要运行的测试单元函数,右击鼠标->run as->JUnit test

4.3 Hbase过滤器

4.3.1 新建testFilter类,并编写代码

在testHive上右击鼠标->new->Class,输入类名testFilter,不选择 public static void main(String[] args),完成。

4.3.2 代码

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.CellUtil;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.filter.BinaryComparator;

import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;

import org.apache.hadoop.hbase.filter.Filter;

import org.apache.hadoop.hbase.filter.FilterList;

import org.apache.hadoop.hbase.filter.PageFilter;

import org.apache.hadoop.hbase.filter.QualifierFilter;

import org.apache.hadoop.hbase.filter.RegexStringComparator;

import org.apache.hadoop.hbase.filter.RowFilter;

import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;

import org.apache.hadoop.hbase.filter.ValueFilter;

import org.apache.hadoop.hbase.util.Bytes;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class testFilter {

private Configuration conf;

private Connection conn;

@Test

public void TestFilterList(){

try {

Table table = conn.getTable(TableName.valueOf("test2"));

Scan scan =new Scan();

List<Filter> filters = new ArrayList<Filter>();

Filter filter1 = new RowFilter(CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("zcj2")));

filters.add(filter1);

Filter filter2 = new RowFilter(CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("zcj5")));

filters.add(filter2);

Filter filter3 = new QualifierFilter(CompareOp.EQUAL,new RegexStringComparator("age"));

filters.add(filter3);

FilterList filterList = new FilterList(filters);

scan.setFilter(filterList);

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

while(iter.hasNext())

{

Result result = iter.next();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

resultScanner.close();

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void TestPageFilter(){

try {

byte[] POSTFIX=new byte[]{0x0};

byte[] row=null;

Table table = conn.getTable(TableName.valueOf("test"));

Scan scan =new Scan();

Filter filter=new PageFilter(1);

while(true){

if(row!=null){

row=Bytes.add(row, POSTFIX);

scan.setStartRow(row);

}

scan.setFilter(filter);

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

int index=0;

while(iter.hasNext()){

Result result=iter.next();

if(!result.isEmpty())

{

row=result.getRow();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

index++;

}

if(index==0)

break;

resultScanner.close();

}

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void TestSingleValueFilter(){

try {

Table table = conn.getTable(TableName.valueOf("test"));

Scan scan =new Scan();

Filter filter=new SingleColumnValueFilter(Bytes.toBytes("cf1"), Bytes.toBytes("address"),CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes("tianjin")));

scan.setFilter(filter);

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

while(iter.hasNext())

{

Result result = iter.next();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

resultScanner.close();

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void TestValueFilter(){

try {

Table table = conn.getTable(TableName.valueOf("test"));

Scan scan =new Scan();

Filter filter=new ValueFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes("tianjin")));

scan.setFilter(filter);

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

while(iter.hasNext()) {

Result result = iter.next();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

resultScanner.close();

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void TestRowFilter(){

try {

Table table = conn.getTable(TableName.valueOf("test"));

Scan scan =new Scan();

Filter filter=new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes("xiaohong")));

scan.setFilter(filter);

ResultScanner resultScanner = table.getScanner(scan);

Iterator<Result> iter = resultScanner.iterator();

while(iter.hasNext()) {

Result result = iter.next();

List<Cell> cells=result.listCells();

for(Cell cell:cells)

System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+"---"+ Bytes.toString(CellUtil.cloneValue(cell)));

}

resultScanner.close();

table.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

@Before

public void init()

{

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "slave2:2181,slave3:2181,slave4:2181");

conf.set("hbase.rootdir", "hdfs://master:9000/hbase");

try {

conn = ConnectionFactory.createConnection(conf);

}

catch (IOException e) {

e.printStackTrace();

}

}

@After

public void end() {

try {

conn.close();

}

catch (IOException e) {

e.printStackTrace();

}

}

}

4.3.3 运行

选择要运行的测试单元函数,右击鼠标->run as->JUnit test

4.4 Hbase MapReduce

4.4.1 新建testHbase包

在src上右击鼠标->new->Package,输入包名testHbase.mr

4.4.2 新建ImportData类,并编写代码

在testHbase.mr上右击鼠标->new->Class,输入类名ImportData,选择 public static void main(String[] args),完成。

4.4.3 代码

import java.io.IOException;

import org.apache.commons.codec.digest.DigestUtils;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.client.Mutation;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;

import org.apache.hadoop.hbase.util.Bytes;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

public class ImportData {

public static void main(String[] args) {

Configuration conf = HBaseConfiguration.create();

try {

Job job = Job.getInstance(conf);

job.setJarByClass(ImportData.class);

job.setMapperClass(ImportDataMapper.class);

job.setOutputKeyClass(ImmutableBytesWritable.class);

job.setOutputValueClass(Mutation.class);

job.setOutputFormatClass(TableOutputFormat.class);

job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, "test3");

FileInputFormat.addInputPath(job, new Path(args[0]));

job.setNumReduceTasks(0);

job.waitForCompletion(true);

}

catch (Exception e) {

e.printStackTrace();

}

}

}

class ImportDataMapper extends Mapper<LongWritable,Text,ImmutableBytesWritable,Mutation>{

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

String line = value.toString();

byte[] rowKey = DigestUtils.md5(line);

Put put = new Put(rowKey);

put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("content"), Bytes.toBytes(line));

context.write(new ImmutableBytesWritable(rowKey), put);

}

}

4.4.4 运行

鼠标右击ImportData类代码空白处,Run As->Java Application

Hive篇

mysql安装(需要切换到root帐户)

1.1 下载并安装mysql

yum install mysql-server mysql mysql-devel

具体步骤:

(1)下载:wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

(2)安装:rpm -ivh mysql-community-release-el7-5.noarch.rpm  -y

(3)  配置:vim /etc/my.cnf

1.2 启动mysql服务

service mysqld start

1.3 查看mysql运行状态

systemctl status mysql.service

1.4 设置mysql管理用户密码

mysqladmin -u root password 'root'

1.5 设置mysql开机启动

chkconfig mysqld on

1.6 启动mysql命令行

mysql -u root -p 'root'

1.7 创建数据库

mysql> create database hive;

1.8 查询数据库是否创建成功

mysql> show databases;

1.9 设置root用户对hive库的访问权限

mysql> GRANT all ON hive.* TO 'root'@'%' IDENTIFIED BY 'root';

1.10刷新mysql的系统权限相关表

mysql> flush privileges;

1.11 退出mysql

mysql> exit;

hive安装配置

2.1 从windows本地上传apache-hive-1.2.1-bin.tar.gz到app下

2.2 解压apache-hive-1.2.1-bin.tar.gz到app下

cd app

tar –zxvf apache-hive-1.2.1-bin.tar.gz

cd ~

2.3 替换文件

jline-2.12.jar 从hive/lib ->hadoop/share/hadoop/yarn/lib

tools.jar 从jdk1.8.0_121/lib -> apache-hive-1.2.1-bin/lib

mysql-connector-java-5.0.8-bin.jar 从本地 -> apache-hive-1.2.1-bin/lib

2.4 配置hive

2.4.1 hive-env.sh

2.4.1.1复制hive-env.sh.template,更名为hive-env.sh

2.4.1.2配置

export HADOOP_HEAPSIZE=1024

HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0

2.4.2 hive-site.xml

2.4.2.1 复制hive-default.xml.template,更名为hive-site.xml

2.4.2.2 配置

<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://192.168.1.201:3306/hive</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>root</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>root</value>

</property>

<property>

<name>datanucleus.autoCreateSchema</name>

<value>true</value>

</property>

<property>

<name>hive.exec.local.scratchdir</name>

<value>/home/hadoop/appdata/hivetmp/iotmp</value>

</property>

<property>

<name>hive.downloaded.resources.dir</name>

<value>/home/hadoop/appdata/hivetmp/iotmp</value>

</property>

<property>

<name>hive.querylog.location</name>

<value>/home/hadoop/appdata/hivetmp/iotmp</value>

</property>

</configuration>

注意:master节点

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql:127.0.0.1:3306/hive</value>

<description>JDBC connect string for a JDBC metastore</description>

</property>

CLI

3.1 cli启动

~app/apache-hive-1.2.1-bin/bin/hive

3.2 cli退出

exit

3.3 cli常用命令

create database test_dw;

show databases;

create table zcjhive (name String,Age int);

show tables;

describe zcjhive;

select * from zcjhive;

insert into zcjhive (name,age) values ('zcj',42);

load data local inpath '/home/hadoop/mydata/hive.txt' into table zcjhive;

insert overwrite local directoy '/home/hadoop/mydata/output_hive' select * from zcjhive;

import export(只能集群操作)

Metastore

启动元数据服务

~app/apache-hive-1.2.1-bin/bin/hive --service metastore

~app/apache-hive-1.2.1-bin/bin/hive --service metastore & (进入后台运行)

HWI安装配置

5.1 hwi文件安装

5.1.1下载hive源码

http://archive.apache.org/dist/下载源码apach-hive-1.2.1-src.tar.gz

5.1.2解压apach-hive-1.2.1-src.tar.gz

tar -zxvf apach-hive-1.2.1-src.tar.gz

5.1.3 切换目录

cd apache-hive-1.2.1-src/hwi

5.1.4 打war包

jar cvM hive-hwi-1.2.1.war -C web/ .

5.1.5 拷贝hive-hwi-1.2.1.war到apache-hive-1.2.1-bin/lib/下

5.2 hwi配置,修改hive-site.xml

<property>

<name>hive.hwi.listen.host</name>

<value>192.168.1.201</value>

</property>

<property>

<name>hive.hwi.listen.port</name>

<value>9999</value>

</property>

<property>

<name>hive.hwi.war.file</name>

<value>/lib/hive-hwi-1.2.1.war</value>

</property>

5.3 启动hwi服务

~app/apache-hive-1.2.1-bin/bin/hive --service hwi

~app/apache-hive-1.2.1-bin/bin/hive --service hwi & (进入后台运行)

5.4 hive web管理

5.4.1 hive的Web管理地址

http://192.168.1.201:9999/hwi/

5.4.2 hive的Web管理界面

5.4.3 查看数据库

5.4.4 创建会话

5.4.4 会话管理

5.4.5 执行语句

提示:hwi result file 在master hadoop用户根下

API操作

6.1 API配置,修改hive-site.xml

<property>

<name>hive.server2.thrift.bind.host</name>

<value>192.168.1.200</value>

</property>

<property>

<name>hive.server2.thrift.port</name>

<value>10000</value>

</property>

<property>

<name>hive.server2.long.polling.timeout</name>

<value>5000</value>

</property>

6.2 启动server2

~app/apache-hive-1.2.1-bin/bin/hive --service hiveserver2

6.3 开发用到的jar包

windows本地winrar解压apache-hive-1.2.1-bin.tar.gz

apache-hive-1.2.1-bin\lib\hive-*.jar

apache-hive-1.2.1-bin\lib\lib*.jar

6.4 编写程序

6.4.1 新建testHive包

在src上右击鼠标->new->Package,输入包名testHive

6.4.2 新建JDBCToHive类,并编写代码

6.4.2.1 在testHive上右击鼠标->new->Class,输入类名JDBCToHive,不选择 public static void main(String[] args),完成。

6.4.2.2 代码

private static Connection conn=JDBCToHive.getConnnection();

private static PreparedStatement ps;

private static ResultSet rs;

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

private static String Url="jdbc:hive2://192.168.1.200:10000/default";

private static Connection conn;

public static Connection getConnnection()

{

try{

Class.forName(driverName);

conn = DriverManager.getConnection(Url,"hadoop","hadoop");

}

catch(ClassNotFoundException e){

e.printStackTrace();

}

catch (SQLException e) {

e.printStackTrace();

}

return conn;

}

public static PreparedStatement prepare(Connection conn, String sql)

{

PreparedStatement ps = null;

try {

ps = conn.prepareStatement(sql);

}

catch (SQLException e) {

e.printStackTrace();

}

return ps;

}

6.4.3 新建QueryHive类,并编写代码

6.4.3.1 在testHive上右击鼠标->new->Class,输入类名QueryHive,不选择 public static void main(String[] args),完成。

6.4.3.2 代码

public static void getAll(String tablename)

{

String sql="select * from "+tablename;

System.out.println(sql);

try {

ps=JDBCToHive.prepare(conn, sql);

rs=ps.executeQuery();

int columns=rs.getMetaData().getColumnCount();

while(rs.next())

{

for(int i=1;i<=columns;i++)

{

System.out.print(rs.getString(i));

System.out.print("\t");

}

System.out.println();

}

}

catch (SQLException e) {

e.printStackTrace();

}

}

6.4.4 新建QueryHiveRun类,并编写代码

6.4.4.1 在testHive上右击鼠标->new->Class,输入类名QueryHiveRun, 选择 public static void main(String[] args),完成。

6.4.4.2 代码

String tablename="zlhtest";

QueryHive.getAll(tablename);

6.4.5 运行程序

鼠标右击QueryHiveRun类代码空白处,Run As->Java Application

Slurm篇

1、安装MUNGE,需要munge-munge-0.5.13.tar.gz munge-0.5.13.tar.xz两个文件

安装解析文件的工具

yum -y install bzip2-devel openssl-devel zlib-devel

yum install -y rpm-build

解压

rpmbuild -tb --clean munge-munge-0.5.13.tar.gz

编译

cd /root/rpmbuild/RPMS/x86_64

安装munge

rpm -ivh munge*.rpm

设置互通秘钥为:helloeveryone,I'ammungekeyonkvmcluster.

echo "helloeveryone,I'ammungekeyonkvmcluster." > /etc/munge/munge.key

修改文件夹属性

chown munge:munge /etc/munge/munge.key

chmod 400 /etc/munge/munge.key

chmod -Rf 700 /etc/munge

chmod -Rf 711 /var/lib/munge

chmod -Rf 700 /var/log/munge

chmod -Rf 755 /var/run/munge

删除其他之前之前的秘钥(若之前也做过这种操作)

ssh slave02 rm -f /etc/munge/munge.key

ssh slave03 rm -f /etc/munge/munge.key

将生成的秘钥复制给其他节点

scp /etc/munge/munge.key root@slave01:/etc/munge/munge.key

scp /etc/munge/munge.key root@slave03:/etc/munge/munge.key

munge的基本操作命令

systemctl enable munge

systemctl disable munge

systemctl status munge

systemctl start munge

systemctl restart munge

systemctl stop munge

munge -n | ssh master unmunge

munge -n | ssh slave01 unmunge

munge -n | ssh slave02 unmunge

5、安装SLURM

安装解析文件的工具

yum -y install readline-devel pam-devel

yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

重新清理文件

rpmbuild -tb --clean slurm-17.02.9.tar.bz2

cd /root/rpmbuild/RPMS/x86_64

安装

rpm -ivh slurm*.rpm

6、配置SLURM

配置slurm用户

useradd slurm

passwd slurm

配置文件

vim /etc/slurm/slurm.conf

ClusterName=bxg_cluster

ControlMachine=master

ControlAddr=192.168.2.2

SlurmUser=slurm

SlurmctldPort=6817

SlurmdPort=6818

AuthType=auth/munge

StateSaveLocation=/var/spool/slurm/ctld

SlurmdSpoolDir=/var/spool/slurm/d

SwitchType=switch/none

MpiDefault=none

SlurmctldPidFile=/var/run/slurmctld.pid

SlurmdPidFile=/var/run/slusrmd.pid

ProctrackType=proctrack/pgid

ReturnToService=0

SlurmctldTimeout=300

SlurmdTimeout=300

InactiveLimit=0

MinJobAge=300

KillWait=30

Waittime=0

SchedulerType=sched/backfill

FastSchedule=1

SlurmctldDebug=3

SlurmctldLogFile=/var/log/slurmctld.log

SlurmdDebug=3

SlurmdLogFile=/var/log/slurmd.log

JobCompType=jobcomp/none

NodeName=master,slave0[1-2] Procs=1 State=UNKNOWN

PartitionName=control Nodes=master Default=NO MaxTime=INFINITE State=UP

PartitionName=compute Nodes=slave0[1-2] Default=YES MaxTime=INFINITE State=UP

:wq

将配置文件复制到其他节点

scp /etc/slurm/slurm.conf root@slave02:/etc/slurm/slurm.conf

scp /etc/slurm/slurm.conf root@slave03:/etc/slurm/slurm.conf

创建指定文件夹

mkdir /var/spool/slurm/d

mkdir /var/spool/slurm/ctld

增加权限

chown -R slurm:slurm /var/spool

主节点命令

systemctl enable slurmctld

systemctl disable slurmctld

systemctl status slurmctld

systemctl start slurmctld

systemctl restart slurmctld

systemctl stop slurmctld

主节点和从节点命令

systemctl enable slurmd

systemctl disable slurmd

systemctl status slurmd

systemctl start slurmd

systemctl restart slurmd

systemctl stop slurmd

7、简单测试SLURM

sinfo

scontrol show slurm reports

scontrol show config

scontrol show partition

scontrol show node

scontrol show jobs

srun hostname

srun -N 2 -l hostname

srun sleep 60 &

squeue -a

scancel <job_id>

NTP时间服务器篇

搭建内网的NTP时间服务器的具体操作步骤

需求:搭建一台时间服务器,使得无外网的服务器可以同步时间。

一、环境

1. [root@master ~]# cat /etc/redhat-release

Red Hat Enterprise Linux Server release 7.0 (Maipo)

3. [root@ master ~]# hostname -I

4. 查看内网ip命令:ifconfig –a

192.168.1.200

5. 查看外网ip命令:curl ifconfig.me

124.236.148.6

二、安装ntp并检查是否安装成功

1.安装ntp包

yum install ntp

2.开机启用NTP服务:

systemctl enable ntpd

3. 启动ntp服务:

systemctl start ntpd

4. 查看ntp服务状态

systemctl status ntpd

三、配置可用时间服务器

配置NTP时间同步文件:# vi /etc/ntp.conf,添加时间源,如:

server  10.100.2.5      # local clock

fudge   10.100.2.5 stratum 10

四、启动ntp服务器

查看时间同步进程:# ntpq –p

查看时间服务器状态:

systemctl status ntpd

手动同步:

ntpdate –u 192.168.1.200

查看当前时间:

date

Python脚本篇

一、python2.x的源码

自动化脚本就是PyCharm开发环境来编写的,使用的语言是python2.x版本,通过pip引入paramiko模块,运行该脚本文件,实现对集群的自动化、一键式管理。

# -*- coding: UTF-8 -*-

# !/bin/python

# 运行程序前,要安装pip和paramiko

# 此程序为Python2.X程序

import subprocess

import os, commands, string, sys, time, paramiko

def out_progress():

for i in range(50):

sys.stdout.write("\033[0;32m%s\033[0m" % ".")

sys.stdout.flush()

time.sleep(0.5)

print("\n")

print("\033[0;32m%s\033[0m" % "开机成功!\n")

def start_all():

os.system("wol f4:4d:30:94:30:ad")

os.system("wol f4:4d:30:94:1c:3d")

os.system("wol f4:4d:30:94:1c:92")

def ssh_conn(_hostname, _port, _username, _password, *args):

# shclient对象

ssh = paramiko.SSHClient()

# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 调用connect方法连接服务器

ssh.connect(hostname=_hostname, port=_port, username=_username, password=_password)

for i in range(len(args)):

stdin, stdout, stderr = ssh.exec_command(args[i])

# 结果放到stdout中,如果有错误将放到stderr中

if "ntpdate" in args[0]:

print("slave0%s节点对时:" % _hostname[-1])

#print(_hostname[-1])

print(stdout.read().decode("utf-8"))

print("成功!")

print(stdout.read().decode("utf-8"))

ssh.close()

def test_process(_commands, *args):

output = commands.getoutput(_commands)

return output

def ssh_conn_return(_hostname, _port, _username, _password, *args):

# shclient对象

ssh = paramiko.SSHClient()

# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 调用connect方法连接服务器

ssh.connect(hostname=_hostname, port=_port, username=_username, password=_password)

for i in range(len(args)):

stdin, stdout, stderr = ssh.exec_command(args[i])

# 结果放到stdout中,如果有错误将放到stderr中

if "zookeeper" in args[0]:

print("slave0%s:" % _hostname[-1])

#       print(_hostname[-1])

print(stdout.read().decode("utf-8"))

print("成功!")

print(stdout.read().decode("utf-8"))

ssh.close()

while True:

print("\033[0;34m%s\033[0m" % "\n请输入您想要的操作代号: ")

print("s. 一键开机!\t\t a. 启动集群!\t\t b. 停止集群!\t\t d. 启动时间服务器")

#print("a. 启动集群!")

print("t. 集群自动对时!\t sz.启动zookeeper \t pz.停止zookeeper \t szs.查看zookeeper状态")

print("c. 一键清屏!\t \t j. 查看当前进程!\t p.一键关机")

print("exit. 退出运行的脚本!")

in_put=raw_input("请输入:")

if in_put=='a':

os.system("~/app/hadoop-2.6.0/sbin/start-all.sh")

print("\n")

print("\033[0;32m%s\033[0m" % "集群启动  成功!")

#print("\n")

elif in_put=='sz':

#查看集群有无启动

#多台机器同时启动

# os.system("app/zookeeper-3.4.6/bin/zkServer.sh start")

# print("\n\033[0;32m%s\033[0m" % "master zookeeper 启动成功!")

ssh_conn_return("192.168.1.201", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh start")

ssh_conn_return("192.168.1.202", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh start")

ssh_conn_return("192.168.1.203", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh start")

elif in_put=='szs':

#停止zookeep

ssh_conn_return("192.168.1.201", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh status")

ssh_conn_return("192.168.1.202", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh status")

ssh_conn_return("192.168.1.203", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh status")

elif in_put=='pz':

# os.system("app/zookeeper-3.4.6/bin/zkServer.sh status")

ssh_conn_return("192.168.1.201", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh stop")

ssh_conn_return("192.168.1.202", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh stop")

ssh_conn_return("192.168.1.203", 22, "hadoop", "hadoop", "app/zookeeper-3.4.6/bin/zkServer.sh stop")

elif in_put=='s':

start_all()

out_progress()

elif in_put=='b':

#判断zookeep有没有停止

os.system("app/hadoop-2.6.0/sbin/stop-all.sh")

print("\033[0;32m%s\033[0m" % "集群停止  成功!")

elif in_put=="c":

os.system("clear")

elif in_put=="d":

ssh_conn("192.168.1.200", 22, "root", "hadoop", "systemctl restart ntpd")

t = test_process("systemctl status  ntpd.service")

if ("SUCCESS" and "running") in t:

print("\n\033[0;32m%s\033[0m" % "master节点的时间服务启动成功")

elif in_put=='j':

#打印salve节点的  jps 信息

print("\n\033[0;32m%s\033[0m" % "当前master进程为:")

os.system("jps")

elif in_put=="p":

ssh_conn("192.168.1.201",22,"root","hadoop","poweroff")

print("slave01正在关机.....")

ssh_conn("192.168.1.202",22,"root","hadoop","poweroff")

print("slave02正在关机.....")

ssh_conn("192.168.1.203",22,"root","hadoop","poweroff")

print("slave03正在关机.....")

time.sleep(7)

print("\033[0;32m%s\033[0m" % "集群所有从节点已经关机!")

elif in_put=="t":

ssh_conn("192.168.1.201",22,"root","hadoop","ntpdate -u 192.168.1.200")

ssh_conn("192.168.1.202",22,"root","hadoop","ntpdate -u 192.168.1.200")

ssh_conn("192.168.1.203",22,"root","hadoop","ntpdate -u 192.168.1.200")

elif in_put=="exit":

break

二、脚本运行示例图

Hadoop、Slurm平台详细安装配置步骤相关推荐

  1. Greenplum【环境搭建 01】CentOS Linux release 7.5 环境单机版详细安装配置步骤+问题解决(含安装包资源)

    安装文件 greenplum-db-6.13.0-rhel7-x86_64.rpm 链接:https://pan.baidu.com/s/1-Wep7oQ4GTQpwdr7Y7sOhw 提取码:emh ...

  2. Jenkins详细安装配置部署--超详细

    Jenkins详细安装配置部署--超详细 一.什么是CI/CD 二.Gitlab内置持续集成 持续集成(CI) 持续交付(CD) 2.1 Gitlab的CI/CD优势 2.2 Gitlab的CI/CD ...

  3. linux redis数据库安装配置,Linux系统中redis的安装配置步骤

    Linux系统中redis的安装配置步骤 发布时间:2020-06-23 10:13:36 来源:亿速云 阅读:87 作者:Leah 这篇文章将为大家详细讲解有关Linux系统中redis的安装配置步 ...

  4. DynaSLAM超详细安装配置运行ubantu20.0.4+opencv2.4.11+tensorflow1.4.0

    DynaSLAM超详细安装配置运行ubantu20.0.4+opencv2.4.11+tensorflow1.4.0 注:我现在ubantu的环境是基于可以运行ORB SLAM 2和ORB SLAM3 ...

  5. node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...

    本篇文章主要介绍了NodeJS.NPM安装配置步骤(windows版本) 以及环境变量详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.windows下的NodeJS安装是比较方便的(v0. ...

  6. IDEA、Eclipse的详细安装配置及Tomcat服务集成介绍

    IDEA.Eclipse的详细安装配置及Tomcat服务集成介绍 说到开发工具,我们大家都知道每一个开发语言对会对应多个比较合适自己的开发工具,好的开发工具可以帮助提高写代码的效果及排错,比如拿jav ...

  7. coreseek php接口,筹建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例...

    搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例 一个文档包含了安装.增量备份.扩展.api调用示例,省去了查找大量文章的时间. 搭建cor ...

  8. oracle p6安装,Primavera P6 Professional 19.12 中文   含详细安装配置教程  修复链接...

    Oracle的Primavera P6产品是最好,最强大,最可靠的项目管理,设计和实施程序之一.该软件是用于管理各种规模和难度的项目和设计的完美解决方案. Primavera P6软件还用于计划和控制 ...

  9. Gradle的详细安装配置及使用教程

    Gradle的详细安装配置及使用教程 Gradle的安装 到Gradle官网,官网地址:https://gradle.org/releases/.下载对应的版本,本文安装的是 4.3.1 版本. 下载 ...

最新文章

  1. 出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良
  2. 智能车竞赛开启了新的一个周期,让我聚焦十六届赛题吧
  3. 完全卸载SQL Server 2008 R2(转)
  4. 【Linux】一步一步学Linux——apt-sortpkgs命令(280)
  5. ES6-16 WeakMap与WeakSet、proxy与reflect
  6. 人一生中最该看清的5个真相
  7. php 顺丰接口实例,顺丰BSP接口PHP开发注意事项
  8. arp协议属于哪一层_网络工程师(3):详解ARP协议
  9. 计算机网络成绩分析单,【计算机网络论文】计算机网络技术课程教考分离解析(共2033字)...
  10. 用例不全,质量如何保证?
  11. 把图像划分为patch以及用图像块重建图像
  12. raptor五个数排序流程图_看了这篇文章,我发现排序算法好简单
  13. “蓝脑”计划:人造大脑的可能性 文化·探索 CCTV_com
  14. js中的null VS undefined
  15. Java面向对象㈡ -- 继承与多态
  16. 网吧的监控系统和服务器如何连接,网吧监控系统安装解决方案
  17. 华中电网项目日志:Rational version 7.0 技术会议纪要
  18. 人类捕杀动物,吃动物就残忍了吗?
  19. 弘辽科技:拼多多发货中途改地址可以吗?怎么改?
  20. Unity基础-灯光

热门文章

  1. python-opencv 图像阈值二值化
  2. 数字图像处理课设图像的锐化_数字图像处理上机之五:图像平滑和锐化
  3. clementine for Mac(多平台音乐管理播放软件)
  4. 计算机应用基础个人教学计划,《计算机应用基础》教学计划
  5. 用计算机玩反恐精英的男孩,玩CS的男人
  6. OpenWRT添加无线USB网卡
  7. Mac下查看tomcat的版本号
  8. KT6368A蓝牙芯片批量生产的注意事项以及蓝牙测试的方法,校准频偏 流水线测试
  9. mount -o remount,rw /mnt/app
  10. codeforces 1311