王某某的笔记

记录我的编程之路

官方网站:
http://hbase.apache.org/

文档:
http://hbase.apache.org/book.html

版本信息

CentOS Linux release 7.2.1511 (Core)
Hadoop 2.7.2
java version “1.7.0_80”
hbase 1.2.4

注意事项

  1. 检查防火墙
  2. 检查SSH免密码登录
  3. 检查/etc/hosts
  4. 检查各个服务器的JDK
  5. 还应该注意各个服务器时间同步

部署结构

Node Name Master ZooKeeper RegionServer
wwh213 yes yes no
wwh214 backup yes yes
wwh215 no yes yes

/etc/hosts 配置

1
2
3
4
5
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.213 wwh213
192.168.1.214 wwh214
192.168.1.215 wwh215

修改limit限制

HBase 会在同一时间打开大量的文件句柄和进程,超过 Linux 的默认限制,导致可能会出现如下错误:

1
2
2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Exception increateBlockOutputStream java.io.EOFException
2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Abandoning block blk_-6935524980745310745_1391901

修改之前先查看一下:

1
2
3
$ ulimit -n -u
open files (-n) 1024
max user processes (-u) 7274

以root用户编辑文件:/etc/security/limits.conf

在末尾加上:

1
2
hadoop  -       nofile  32768
hadoop - nproc 32000

退出shell重新进入后生效

切换到hadoop用户

再次查看:

1
2
3
$ ulimit -n -u
open files (-n) 32768
max user processes (-u) 32000

安装

下载解压

选择一个合适的目录

1
2
3
wget http://apache.fayea.com/hbase/1.2.4/hbase-1.2.4-bin.tar.gz

tar -zxvf hbase-1.2.4-bin.tar.gz

配置

conf/hbase-env.sh

对于HBase 0.98.5和更高版本,需要在启动HBase之前设置JAVA_HOME环境变量  

export JAVA_HOME=/usr/java/jdk1.7.0_80

假定集群的每个节点使用相同的配置。如果不是这样,您需要为每个节点单独设置JAVA_HOME。

这个环境变量设置不是必须的

告诉HBase是否应该管理自己的Zookeeper实例

1
export HBASE_MANAGES_ZK=false

自带的 Zookeeper 如不用,可删除

设置PID文件存储路径,缺省是在/tmp 下

1
export HBASE_PID_DIR=/data/hbase/tmp/pids

使用JDK8 ,需要在HBase的配置文件中hbase-env.sh,注释掉两行

1
2
3
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

conf/hbase-site.xml

这是HBase的主配置文件
缺省配置:http://hbase.apache.org/book.html#hbase_default_configurations

配置本地临时目录,缺省值是’/tmp’

1
2
3
4
<property>
<name>hbase.tmp.dir</name>
<value>/data/hbase/tmp</value>
</property>

指定分布式运行

1
2
3
4
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

配置hbase目录指到HDFS

1
2
3
4
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.1.213:9900/hbase</value>
</property>

注意:
$HBASE_HOME/conf/hbase-site.xml 的 hbase.rootdir的主机和端口号与$HADOOP_HOME/conf/core-site.xml 的 fs.default.name的主机和端口号一致

配置Zookeeper

1
2
3
4
5
<property>
<name>hbase.zookeeper.quorum</name>
<value>wwh213,wwh214,wwh215</value>
</property>

conf/regionservers

配置RegionServer,删除之前的 ==localhost== ,增加主机名或者IP。

1
2
wwh214
wwh215
配置 backup master

创建一个新的文件conf/backup-masters,并添加一个主机名。

1
2
3
echo 'wwh214' > backup-masters

wwh214
复制hbase到其他节点

集群中的节点都需要相同的配置信息

1
2
3
scp -r hbase-1.2.4 wwh214:/data/hbase/

scp -r hbase-1.2.4 wwh215:/data/hbase/

启动

确保Zookeeper是启动状态的
随便找一台有hbase的节点,启动即可

1
bin/start-hbase.sh

输出信息:

1
2
3
4
starting master, logging to /data/hbase/hbase-1.2.4/bin/../logs/hbase-hadoop-master-wwh213.out
wwh215: starting regionserver, logging to /data/hbase/hbase-1.2.4/bin/../logs/hbase-hadoop-regionserver-wwh215.out
wwh214: starting regionserver, logging to /data/hbase/hbase-1.2.4/bin/../logs/hbase-hadoop-regionserver-wwh214.out
wwh214: starting master, logging to /data/hbase/hbase-1.2.4/bin/../logs/hbase-hadoop-master-wwh214.out

检查

  1. 检查Java进程

    1
    2
    3
    4
    5
    $ JPS  

    xxxxx HMaster
    xxxxx HRegionServer

  2. 检查HDFS中的HBase目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ bin/hadoop fs -ls /hbase
    Found 7 items
    drwxr-xr-x - hadoop supergroup 0 2016-11-09 16:00 /hbase/.tmp
    drwxr-xr-x - hadoop supergroup 0 2016-11-09 16:00 /hbase/MasterProcWALs
    drwxr-xr-x - hadoop supergroup 0 2016-11-09 16:00 /hbase/WALs
    drwxr-xr-x - hadoop supergroup 0 2016-11-09 16:00 /hbase/data
    -rw-r--r-- 3 hadoop supergroup 42 2016-11-09 15:59 /hbase/hbase.id
    -rw-r--r-- 3 hadoop supergroup 7 2016-11-09 15:59 /hbase/hbase.version
    drwxr-xr-x - hadoop supergroup 0 2016-11-09 15:59 /hbase/oldWALs
  3. 使用 HBase Shell

    1
    2
    3
    4
    $ bin/hbase shell
    .....
    .....
    hbase(main):001:0>

Web UI

HBase的Web界面,现在的端口为16010,原来是60010.
http://192.168.1.213:16010

1
2
$ ./bin/hbase shell
hbase(main):001:0>

输入help 显示帮助信息

1. 创建表

使用 create 命令创建表,指定表名和列族名称

1
2
3
4
hbase(main):001:0> create 'test', 'cf'
0 row(s) in 0.4170 seconds

=> Hbase::Table - test

2. 查看表

使用 list 查看表

1
2
3
4
5
6
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0180 seconds

=> ["test"]

3. 放数据到表中

使用 put 命令

1
2
3
4
5
6
7
8
hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0850 seconds

hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0110 seconds

hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0100 seconds

4. 扫描表中的数据

使用 scan 命令

1
2
3
4
5
6
hbase(main):006:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1421762485768, value=value1
row2 column=cf:b, timestamp=1421762491785, value=value2
row3 column=cf:c, timestamp=1421762496210, value=value3
3 row(s) in 0.0230 seconds

使用 limit 限制返回结果

1
scan 'test' ,{'LIMIT' => 5}

5. 获取单行数据

使用 get 命令

1
2
3
4
hbase(main):007:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1421762485768, value=value1
1 row(s) in 0.0350 seconds

6. 禁用表

如果要删除表或更改其设置,以及在某些其他情况下,需要先使用 disable 命令禁用表。你可以使用 enable 命令重新启用它。

1
2
3
4
5
hbase(main):008:0> disable 'test'
0 row(s) in 1.1820 seconds

hbase(main):009:0> enable 'test'
0 row(s) in 0.1770 seconds

7. 删除表

使用 drop 命令

1
2
hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds

高级操作

扫描

指定起始行 和 终止行,并指定返回的列

1
2
3
4
5
6
7
8
9



scan 'downloads', {STARTROW => 'nare7pqnmojs2pg.onion' , ENDROW=> 'nare7pqnmojs2pg.onionz',COLUMN=>['cf1:url']}


scan 'downloads', {STARTROW => 'nare7' , ENDROW=> 'nare7z',COLUMN=>['cf1:url']}


官方文档

Apache Hadoop 2.7.2 文档

http://hadoop.apache.org/docs/stable/index.html

中文文档

比较老的,应该对照最新的文档看

命令手册

https://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html

Hadoop Shell命令

https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

Hadoop命令


这些是从比较老的文档中复制的!


所有的hadoop命令均由bin/hadoop脚本引发。不指定参数运行hadoop脚本会打印所有命令的描述。

用法:hadoop [–config confdir] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS]

Hadoop有一个选项解析框架用于解析一般的选项和运行类。

命令选项 描述
–config confdir 覆盖缺省配置目录。缺省是${HADOOP_HOME}/conf。
GENERIC_OPTIONS 多个命令都支持的通用选项。
COMMAND 命令选项S 各种各样的命令和它们的选项会在下面提到。这些命令被分为 用户命令 管理命令两组。

常规选项
下面的选项被 dfsadmin, fs, fsck和 job支持。 应用程序要实现 Tool来支持 常规选项。

常规选项 描述
-conf 指定应用程序的配置文件。
-D <property=value> 为指定property指定值value。
-fs <local | namenode:port> 指定namenode。
-jt <local | jobtracker:port> 指定job tracker。只适用于job。
-files <逗号分隔的文件列表> 指定要拷贝到map reduce集群的文件的逗号分隔的列表。 只适用于job。
-libjars <逗号分隔的jar列表> 指定要包含到classpath中的jar文件的逗号分隔的列表。 只适用于job。
-archives <逗号分隔的archive列表> 指定要被解压到计算节点上的档案文件的逗号分割的列表。 只适用于job。

命令主要分为两类:


用户命令 说明
archive 创建一个hadoop档案文件
distcp 递归地拷贝文件或目录
fs 运行一个常规的文件系统客户端
fsck 运行HDFS文件系统检查工具
jar 运行jar文件。用户可以把他们的Map Reduce代码捆绑到jar文件中,使用这个命令执行
job 用于和Map Reduce作业交互和命令
pipes 运行pipes作业
version 打印版本信息
CLASSNAME hadoop脚本可用于调调用任何类

管理命令 说明
balancer 运行集群平衡工具。管理员可以简单的按Ctrl-C来停止平衡过程
daemonlog 获取或设置每个守护进程的日志级别
datanode 运行一个HDFS的datanode
dfsadmin 运行一个HDFS的dfsadmin客户端
jobtracker 运行MapReduce job Tracker节点
namenode 运行namenode。有关升级,回滚,升级
secondarynamenode 运行HDFS的secondary namenode
tasktracker 运行MapReduce的task Tracker节点

Hadoop Shell命令

调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。 所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是namenode:namenodeport)。大多数FS Shell命令的行为和对应的Unix Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到stderr,其他信息输出到stdout。


下面这些是结合新旧文档写的!并且经过测试

Hadoop 2.7.2 中推荐使用hdfs dfs

查看命令

1
bin/hdfs dfs -help

查看命令详情

1
bin/hdfs dfs -help command-name 

mkdir

使用方法:

hadoop fs -mkdir

接收路径的URI作为参数,并创建目录。

参数:

-p 创建沿路径的各级父目录

示例:

1
2
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir
1
2
./hadoop fs -mkdir /wwh
./hadoop fs -mkdir -p /user/hadoop/dir1

ls

使用方法:

hadoop fs -ls [-d] [-h] [-R]

列出文件和目录。

参数:

-d: 只列目录
-h: 格式化大小为人类可读的形式
-R: 递归子目录

示例:

1
hadoop fs -ls /user/hadoop/file1
1
2
3
4
5
[root@wwh213 bin]# ./hadoop fs -ls /
Found 3 items
drwxr-xr-x - root supergroup 0 2016-09-19 20:42 /user
drwxr-xr-x - root supergroup 0 2016-09-19 20:42 /wwh
-rw-r--r-- 2 root supergroup 818 2016-09-19 20:43 /测试文件.txt

put

使用方法:

hadoop fs -put

从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。

示例:

1
2
3
4
5
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
从标准输入中读取输入。
1
2
3
4
./hadoop fs -put /tmp/测试文件.txt /

./hadoop fs -put - /input.txt
# CTRL+D 结束输入

cat

使用方法:

hadoop fs -cat URI [URI …]

将路径指定文件的内容输出到stdout。

示例:

1
2
hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
1
./hadoop fs -cat /input.txt

get

使用方法:

hadoop fs -get [-ignorecrc] [-crc]

复制文件到本地文件系统

参数:

-ignorecrc 可以复制CRC校验失败的文件
-crc 选择可以复制文件和 CRC信息

示例:

1
2
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile
1
2
[root@wwh213 bin]# ./hadoop fs -get /测试文件.txt /home
[root@wwh213 bin]#

df

使用方法:

hadoop fs -df [-h] URI [URI …]

显示空闲空间

参数:

-h 将大小格式化成人类可读的形式

示例:

1
hadoop dfs -df /user/hadoop/dir1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#不再推荐的
./hadoop dfs -df /
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Filesystem Size Used Available Use%
hdfs://192.168.1.213:9900 14298382336 32768 7656443904 0%

#推荐的形式
./hdfs dfs -df
Filesystem Size Used Available Use%
hdfs://192.168.1.213:9900 14298382336 32768 7658508288 0%

#-h选项
./hdfs dfs -df -h
Filesystem Size Used Available Use%
hdfs://192.168.1.213:9900 13.3 G 32 K 7.1 G 0%

du

使用方法:

hadoop fs -du [-s] [-h] URI [URI …]

显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。

参数:

-s 显示总大小
-h 格式化大小为人类可读的形式

示例:

1
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://nn.example.com/user/hadoop/dir1
1
2
3
4
5
./hadoop fs -du /
192 /input.txt
0 /user
275 /wwh
818 /测试文件.txt

Hadoop WebHDFS

WebHDFS REST API

https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

直接用这个地址可以通过web浏览文件

http://192.168.1.213:50070/explorer.html#/


Hadoop API

java API

通过java API 对文件进行操作

Apache Hadoop Main 2.7.2 API
https://hadoop.apache.org/docs/r2.7.2/api/index.html

  1. 创建一个简单的Maven工程
  2. 将JDK版本改到1.7
    1
    2
    3
    4
    5
    6
    7
    8
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
    <source>1.7</source>
    <target>1.7</target>
    </configuration>
    </plugin>
  3. 添加Hadoop-client依赖
    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.2</version>
    </dependency>
  4. 查看文件
    1
    2
    3
    4
    5
    6
    7
    8
    String uri = "hdfs://192.168.1.213:9900/"; // hdfs 地址
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(uri), conf);
    Path path = new Path("/");
    FileStatus[] fileStatus = fs.listStatus(path);
    for (FileStatus file : fileStatus) {
    ...
    }
  5. 读写文件

    权限问题解决:

    • 修改 hdfs-core.xml 中的 dfs.permissions 配置项为false
    • 通过hadoop shell 命令修改目录权限为 777
    • 在客户端配置环境变量 HADOOP_USER_NAME=root
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    String uri = "hdfs://192.168.1.213:9900/"; // hdfs 地址
    String writeFile = "/hello.txt";
    // 设置一个环境变量
    System.setProperty("HADOOP_USER_NAME", "root");

    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(uri), conf);
    Path path = new Path(writeFile);

    FSDataOutputStream fsdos = fs.create(path);
    ...写内容...
    fsdos.close();

    FSDataInputStream fsdis = fs.open(path);
    ...读内容...
    fsdis.close();

配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,需要去Apache的官网中找对应版本的默认配置文件。YARN是新一代的MapReduce,又叫:MapReduce 2.0 (MRv2)。

官网地址

https://hadoop.apache.org/docs/
里面有各个版本的文档

2.72版本默认配置

core

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/core-default.xml

hdfs

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

mapreduce

http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

yarn

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

常用的端口配置

网上复制的,没有经过验证

HDFS端口

参数 描述 默认 配置文件 例子值
fs.default.name namenode RPC交互端口 8020 core-site.xml hdfs://master:8020/
dfs.http.address NameNode web管理端口 50070 hdfs-site.xml 0.0.0.0:50070
dfs.datanode.address datanode 控制端口 50010 hdfs-site.xml 0.0.0.0:50010
dfs.datanode.ipc.address datanode的RPC服务器地址和端口 50020 hdfs-site.xml 0.0.0.0:50020
dfs.datanode.http.address datanode的HTTP服务器和端口 50075 hdfs-site.xml 0.0.0.0:50075

MR端口

参数 描述 默认 配置文件 例子值
mapred.job.tracker job tracker交互端口 8021 mapred-site.xml hdfs://master:8021/
mapred.job.tracker.http.address job tracker的web管理端口 50030 mapred-site.xml 0.0.0.0:50030
mapred.task.tracker.http.address task tracker的HTTP端口 50060 mapred-site.xml 0.0.0.0:50060

其他端口

参数 描述 默认 配置文件 例子值
dfs.secondary.http.address secondary NameNode web管理端口 50090 hdfs-site.xml

集群目录配置

参数 描述 默认 配置文件 例子值
dfs.name.dir name node的元数据,以,号隔开,hdfs会把元数据冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 {hadoop.tmp.dir}/dfs/name hdfs-site.xm /hadoop/hdfs/name
dfs.name.edits.dir node node的事务文件存储的目录,以,号隔开,hdfs会把事务文件冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 ${dfs.name.dir} hdfs-site.xm ${dfs.name.dir}
fs.checkpoint.dir secondary NameNode的元数据以,号隔开,hdfs会把元数据冗余复制到这些目录,一般这些目录是不同的块设备,不存在的目录会被忽略掉 ${hadoop.tmp.dir}/dfs/namesecondary core-site.xml /hadoop/hdfs/namesecondary
fs.checkpoint.edits.dir secondary NameNode的事务文件存储的目录,以,号隔开,hdfs会把事务文件冗余复制到这些目录 ${fs.checkpoint.dir} core-site.xml ${fs.checkpoint.dir}
hadoop.tmp.dir 临时目录,其他临时目录的父目录 /tmp/hadoop-${user.name} core-site.xml /hadoop/tmp/hadoop-${user.name}
dfs.data.dir data node的数据目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉 ${hadoop.tmp.dir}/dfs/data hdfs-site.xm /hadoop/hdfs/data1/data,
/hadoop/hdfs/data2/data
mapred.local.dir MapReduce产生的中间数据存放目录,以,号隔开,hdfs会把数据存在这些目录下,一般这些目录是不同的块设备,不存在的目录会被忽略掉 ${hadoop.tmp.dir}/mapred/local mapred-site.xml /hadoop/hdfs/data1/mapred/local,
/hadoop/hdfs/data2/mapred/local
mapred.system.dir MapReduce的控制文件 ${hadoop.tmp.dir}/mapred/system mapred-site.xml /hadoop/hdfs/data1/system

其他配置

参数 描述 默认 配置文件 例子值
dfs.support.append 支持文件append,主要是支持hbase false hdfs-site.xml true
dfs.replication 文件复制的副本数,如果创建时不指定这个参数,就使用这个默认值作为复制的副本数 3 hdfs-site.xml 2

官网地址:
http://hadoop.apache.org/

各个版本文档地址:
http://hadoop.apache.org/docs/

1、环境

版本信息
CentOS Linux release 7.2.1511 (Core)
Hadoop 2.7.2
java version “1.7.0_80”

/etc/hosts

1
2
3
192.168.1.213    wwh213
192.168.1.214 wwh214
192.168.1.215 wwh215

确保各个主机都能正确解析主机名和IP

注意:/etc/hosts 中配置节点与IP时需要注意,不要配置如:“127.0.0.1 master” 这样的,会导致无法绑定正确的IP

集群结构

1
2
3
Master    192.168.1.213    wwh213  
Slave1 192.168.1.214 wwh214
Slave2 192.168.1.215 wwh215

2、创建hadoop用户

1
2
3
4
5
#创建hadoop用户
adduser hadoop

#修改密码
passwd hadoop

以下操作都在hadoop用户下进行,注意目录权限。

3、SSH免密码登录

无密码登陆是指通过证书认证的方式进行登陆,使用公私钥认证的方式来进行ssh登录。
公私钥认证方式简单的解释:首先在客户端上创建一对公私钥
公钥文件:/.ssh/id_rsa.pub
私钥文件:
/.ssh/id_rsa
然后把公钥添加到服务器上的(~/.ssh/authorized_keys)文件里面,自己保留好私钥。
登录时客户端会向服务器请求使用密匙进行安全验证并发送公钥到服务端,服务端会对比公钥如果匹配成功服务端会生成一个随机数然后用该公钥加密再发给客户端,客户端通过私钥解密后发给服务端进行确认。

受信任的远程主机公钥会保存到 ~/.ssh/known_hosts文件中

Hadoop需要通过SSH登录到各个节点进行操作,每台服务器都生成公钥,再合并到authorized_keys

***==注意==:authorized_keys的权限要是600*

  1. CentOS默认没有启动ssh无密登录,去掉/etc/ssh/sshd_config其中两行的注释,每台服务器都要设置
    1
    2
    RSAAuthentication yes
    PubkeyAuthentication yes
  2. 输入命令,ssh-keygen -t rsa,生成key,都不输入密码,一直回车,就会在~/.ssh文件夹生成

    id_rsa 私钥
    id_rsa.pub 公钥

在每台服务器都生成一次

  1. 合并全部的公钥到一个authorized_keys文件,在Master服务器,进入~/.ssh目录,通过SSH命令合并

    1
    2
    3
    4
    5
    6
    7
    #cat id_rsa.pub>> authorized_keys
    #使公钥添加到known_hosts中
    ssh hadoop@wwh213 cat ~/.ssh/id_rsa.pub>> authorized_keys

    ssh hadoop@wwh214 cat ~/.ssh/id_rsa.pub>> authorized_keys

    ssh hadoop@wwh215 cat ~/.ssh/id_rsa.pub>> authorized_keys
  2. 把Master服务器的authorized_keysknown_hosts复制到Slave服务器的~/.ssh目录

    1
    2
    3
    scp authorized_keys known_hosts hadoop@wwh214:~/.ssh/

    scp authorized_keys known_hosts hadoop@wwh215:~/.ssh/
  3. 完成之后 ssh wwh214、ssh wwh215就不需要输入密码了

4、安装JDK

Hadoop 2.7已经不再支持JDK6了,需要JDK7+

之前已经安装过JDK了,下面是一个例子

  1. 下载“jdk-7u80-linux-x64.gz”,放到/data/java目录下
  2. 解压缩
    1
    tar -zxvf jdk-7u79-linux-x64.gz  
  3. 编辑/etc/profile,加上:
    1
    2
    export JAVA_HOME=/data/java/jdk1.7.0_80
    export PATH=$PATH:$JAVA_HOME/bin
  4. 使配置生效,输入命令:
    1
    source /etc/profile
  5. 进行测试
    1
    java -version

或者直接下载 jdk-7u-linux-x64.rpm 以root用户进行安装,将安装到/usr/java 目录中

5、安装Hadoop 2.7.2

只需要在Master服务器解压配置好,再复制到Slave服务器

配置hadoop,主要是配置core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml 几个配置文件,默认这些配置文件都是空的,由于版本差异很难知道这些配置文件有哪些配置可以生效,需要去Apache的官网中找对应版本的默认配置文件。

官网文档地址:

http://hadoop.apache.org/docs/r2.7.2/


  1. 下载 hadoop-2.7.2.tar.gz ,放到/data/hadoop目录下

    1
    2
    3
    wget http://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz

    wget http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
  2. 解压

    1
    tar -xzvf hadoop-2.7.2.tar.gz
  3. 在/data/hadoop目录下创建数据存放的文件夹

    1
    2
    3
    4
    mkdir tmp
    mkdir hdfs
    mkdir hdfs/data
    mkdir hdfs/name
  4. 配置JAVA_HOME
    修改/data/hadoop/hadoop-2.7.2/etc/hadoop目录下hadoop-env.sh、yarn-env.sh的JAVA_HOME

    1
    export JAVA_HOME=/data/java/jdk1.7.0_80

    如果环境变量配置好了也可以不用配置,默认是:export JAVA_HOME=${JAVA_HOME}
    看启动时的提示

  5. 配置/data/hadoop/hadoop-2.7.2/etc/hadoop目录下的core-site.xml
    官方默认的配置文件
    http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/core-default.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.1.213:9000</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/data/hadoop/tmp</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <!-- 缺省值是4096 -->
    <value>131072</value>
    </property>
    </configuration>
  6. 配置/data/hadoop/hadoop-2.7.2/etc/hadoop目录下的hdfs-site.xml
    官方默认的配置文件
    http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <configuration>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/data/hadoop/hdfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/data/hadoop/hdfs/data</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <!-- 缺省值是3 -->
    <value>2</value>
    </property>

    <!-- 关闭权限检查 -->
    <property>
    <name>dfs.permissions.enabled</name>
    <!-- 缺省值是true -->
    <value>false</value>
    </property>

    </configuration>
  7. 配置/data/hadoop/hadoop-2.7.2/etc/hadoop目录下的mapred-site.xml
    官方默认的配置文件
    http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>

    <property>
    <name>mapreduce.jobhistory.address</name>
    <!-- 缺省值是:0.0.0.0:10020 -->
    <value>192.168.1.213:10020</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <!-- 缺省值是:0.0.0.0:19888 -->
    <value>192.168.1.213:19888</value>
    </property>
    </configuration>
  8. 配置/data/hadoop/hadoop-2.7.2/etc/hadoop目录下的yarn-site.xml
    官方默认的配置文件
    http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

    YARN:新一代的MapReduce。 MapReduce 2.0 (MRv2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <!-- 缺省值是:0.0.0.0 -->
    <value>192.168.1.213</value>
    </property>
    </configuration>
  9. 配置/data/hadoop/hadoop-2.7.2/etc/hadoop目录下的slaves,删除默认的localhost,增加2个从节点
    如果配置主节点的IP的话就是既当 NameNode 又当 DataNode

    1
    2
    3
    192.168.1.213
    192.168.1.214
    192.168.1.215
  10. 将配置好的Hadoop复制到各个节点对应位置上,通过scp传送

    1
    2
    scp -r /data/hadoop wwh214:/data/
    scp -r /data/hadoop wwh215:/data/

6、启动 Hadoop

在Master服务器启动hadoop,从节点会自动启动,进入/data/hadoop/hadoop-2.7.2目录

(1)初始化,输入命令

1
bin/hdfs namenode -format

(2)全部启动

1
sbin/start-all.sh

也可以分开启动

1
2
sbin/start-dfs.sh
sbin/start-yarn.sh

(3)停止的话,输入命令

1
sbin/stop-all.sh

也可以分开停止

1
2
sbin/stop-dfs.sh
sbin/stop-yarn.sh

(4)输入命令,jps,可以看到相关信息

Web访问

要先开放端口或者直接关闭防火墙

1
systemctl stop firewalld.service  
All Applications

http://192.168.1.213:8088/

HDFS

http://192.168.1.213:50070/

Map/Reduce

http://192.168.1.213:50030/

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是一个用于项目构建的工具,通过它便捷的管理项目的生命周期。即项目的jar包依赖,开发,测试,发布打包。

安装

以下是以Linux为例,Windows下配置也基本相同。

1. 下载

1
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

2. 解压

1
tar -zxvf apache-maven-3.3.9-bin.tar.gz 

如需使用软连接

1
ln -s apache-maven-3.3.9 maven

3. 修改配置文件

本地仓库默认是用户目录下的.m2\repository,用户级的配置文件settings.xml也放在这里。

全局配置修改:

1
vi conf/settings.xml
1
2
#设置本地资源库位置
<localRepository>/home/maven/.m2/repository</localRepository>

4. 配置环境变量

添加环境变量

1
vi /etc/profile
1
2
export M2_HOME=/home/maven/maven
export PATH=$PATH:$M2_HOME/bin

使环境变量生效

1
source /etc/profile

5. 验证是否安装成功

在其他目录执行
1
mvn -version

常用命令

  1. mvn archetype:create :创建 Maven 项目
  2. mvn compile :编译源代码
  3. mvn test-compile :编译测试代码
  4. mvn test : 运行应用程序中的单元测试
  5. mvn site : 生成项目相关信息的网站
  6. mvn clean :清除目标目录中的生成结果
  7. mvn package : 依据项目生成 jar 文件
  8. mvn install :在本地 Repository 中安装 jar
  9. mvn eclipse:eclipse :生成 Eclipse 项目文件
  10. mvn idea:idea : 生成idea项目
  11. mvn jar:jar : 只打jar包
  12. mvn eclipse:clean : 清除eclipse的一些系统设置
  13. mvn jetty:run : 运行项目于jetty上
  14. mvn -DskipTests=true : 忽略测试文档编译

关于仓库

本地仓库

本地仓库默认是用户目录下的.m2\repository,用户可以通过settings.xml设置

远程仓库

maven的远程仓库有多种存在形式,中央仓库,其他远程仓库,镜像,私服

1. 中央仓库

中央仓库是默认的远程仓库,如果不做任何特殊配置那么将会从中央仓库下载依赖,这在
$M2_HOME/lib/maven-model-builder-3.0.4.jar里的org/apache/maven/model/pom-4.0.0.xml里做了指定,如下:

1
2
3
4
5
6
7
8
9
10
11
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2. 镜像

镜像是将的maven依赖请求转发至相应服务器,配置如下:

1
2
3
4
5
6
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>

这里即是将仓库id为repositoryId的所有请求转发至http://my.repository.com/repo/path镜像服务器
镜像更为常用的作法是结合私服,如下配置:

1
2
3
4
5
6
<mirror>
<id>mirrorId</id>
<mirrorOf>*</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>

这里即是将对所有仓库的请求转发至私服http://my.repository.com/repo/path

3. 私服

私服一般采用nexus部署


添加其他远程仓库

添加一个其他的远程库只需在项目的pom.xml文件中添加以下配置即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
<layout>default</layout>
</repository>
</repositories>
  • snapshots false表示关闭jboss远程仓库的snapshots版本下载
  • releases true表示打开jboss远程仓库的release版本下载

远程服务器的验证

远程服务器的验证,只需在settings.xml添加如下代码即可

1
2
3
4
5
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>

注意:id要与配置的远程服务器id对应比如 jboss

从window平台迁移到linux平台

导出

windows 平台导出到 linux 的时候不能使用powershell,需要用CMD导出dump文件  
否则会出现:`svnadmin: E140001: XXX`错误
1
2
3
#svnadmin dump 原先的repos的目录路径(/repository/directory) > dumpfile

svnadmin dump /opt/svn/xxx/ > /var/tmp/dump-xxx.svn

创建

在目标机器上创建同名的资源库
1
2
3
4
5
svnadmin create xx1

svnadmin create software

svnadmin create xx2

导入

1
2
3
4
5
svnadmin load xx1 < /data/svn-backup/repository-xx1-0826.svn

svnadmin load software < /data/svn-backup/repository-software-0826.svn

svnadmin load xx2 < /data/svn-backup/repository-xx2-0826.svn

SVN重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
svn help relocate
relocate: 重新定位工作副本,指向不同的版本库根 URL。
用法: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]
2. relocate TO-URL [PATH]

改写工作副本 URL 元数据,以反映仅版本库根 URL 的改变。这用于仅版本库根
URL 改变(例如方案或主机名称),但是工作副本内容仍旧与版本库对应的情况。

1. FROM-PREFIX 和 TO-PREFIX 分别对应工作副本的旧 URL 与新 URL 开始子串
(如果你喜欢,可以指定完整的 URL)。请使用 'svn info' 来确定当前工作
副本的 URL。

2. TO-URL 是用于 PATH 的(完整的)新版本库 URL。

例如:
svn relocate http:// svn:// project1 project2
svn relocate http://www.example.com/repo/project \
svn://svn.example.com/repo/project

有效选项:
--ignore-externals : 忽略外部项目

全局选项:
--username ARG : 指定用户名称 ARG
--password ARG : 指定密码 ARG
--no-auth-cache : 不要缓存用户认证令牌
--non-interactive : 不要交互提示
--trust-server-cert : 不提示的接受未知的证书颁发机构发行的 SSL 服务器证书(只用于选项 “--non-interactive”)
--config-dir ARG : 从目录 ARG 读取用户配置文件
--config-option ARG : 以下属格式设置用户配置选项:
FILE:SECTION:OPTION=[VALUE]
例如:
servers:global:http-library=serf

查看信息:

1
svn info
1
2
3
4
5
6
7
8
9
10
11
路径: .
工作副本根目录: /home/svn/xx1-parent
URL: https://192.168.1.99/svn/xx1/trunk/xx1-parent
版本库根: https://192.168.1.99/svn/xx1
版本库 UUID: 6b1cbf4a-421d-7440-86c9-1259917cfc4a
版本: 966
节点种类: 目录
调度: 正常
最后修改的作者: wwh
最后修改的版本: 966
最后修改的时间: 2016-08-25 18:10:15 +0800 (四, 2016-08-25)

命令

1
2
#svn relocate 【之前svn路径】【新的svn路径】
xx1-parent]# svn relocate https://192.168.1.99/svn/xx1/trunk/xx1-parent svn://192.168.1.210/xx1/trunk/xx1-parent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
svn relocate https://192.168.1.99/svn/xx1/trunk/xx1-parent svn://192.168.1.210/xx1/trunk/xx1-parent

认证领域: <svn://192.168.1.210:3690> 6b1cbf4a-421d-7440-86c9-1259917cfc4a
“root”的密码:
认证领域: <svn://192.168.1.210:3690> 6b1cbf4a-421d-7440-86c9-1259917cfc4a
用户名: wang.wenhua
“wang.wenhua”的密码:

-----------------------------------------------------------------------
注意! 你的密码,对于认证域:

<svn://192.168.1.210:3690> 6b1cbf4a-421d-7440-86c9-1259917cfc4a

只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes

eclipse中

切换到SVN 视图,右键资源库,选择重定位 –> 输入新的URL

如果不能重定位,可在资源管理器的目录上使用SVN客户端重定位
在项目上右键 –> team –> 断开连接 (不删除SVN元信息)
在SVN视图中创建新的资源库,指向新的地址
然后再在项目上右键 –> team –> share project(eclipse会识别目录中SVN信息)

TortoiseSVN客户端:

在工作复本的根目录上右键 –> TortoiseSVN –> 重新定位(Relocate),然后修改URL

查看:

1
rpm -qa subversion

列出:

1
yum list | grep subversion

安装:

1
yum install subversion

查看安装版本

1
svnserve --version

创建SVN版本库目录

1
mkdir -p /var/svn/svnrepos

创建版本库

1
svnadmin create /var/svn/svnrepos

执行了这个命令之后会在/var/svn/svnrepos目录下生成一些文件

进入conf目录(该svn版本库配置文件)

1
cd conf
authz  文件是权限控制文件  
passwd  是帐号密码文件  
svnserve.conf SVN服务配置文件  

以上文件, 左侧不能留空格, 否则会出错!

设置帐号密码

1
vi passwd

在[users]块中添加用户和密码,格式:帐号=密码,如:hello=123

1
2
3
4
5
[users]
# harry = harryssecret
# sally = sallyssecret
hello=123
用户名=密码

设置权限

1
vi authz

指定单个用户:

1
2
[/]  
hello=rw

意思是hello用户对所有的目录有读写权限

指定用户组:

1
2
3
4
5
6
[groups]
admin=admin,admin2,admin3
user=user1,user2,user3
[/]
@admin=rw #admin组内的用户有obj的读写权限
@user=rw #user组内的用户有obj的读写权限

修改svnserve.conf文件

1
vi svnserve.conf

打开下面的几个注释:

anon-access = none  #匿名用无法访问  
auth-access = write  #授权用户可写  
password-db = passwd  #使用哪个文件作为账号文件  
authz-db = authz  #使用哪个文件作为权限文件  
realm = /var/svn/svnrepos  #认证空间名,版本库所在目录  

启动svn版本库

1
2
3
4
svnserve -d -r /var/svn/svnrepos

#改变端口
svnserve -d -r /opt/svn/repos --listen-port 3391

-d [–daemon] 后台运行
-r [–root] 服务的根目录。可以具体指定到一个Repository的所在目录,仅提供一个Repository的访问;而如果要同时访问多个Repository,则-r选项需要指向多个Repository所在的父目录。

地址为: svn://your server address (如果指定端口需要添加端口 :端口号)

停止SVN

1
2
3
4
5
6
ps -aux | grep svnserve

kill -9 ID号


killall svnserve

Arduino Color Sensor TCS3002D

颜色传感器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#define led 7 //led
#define S0 6 //物体表面的反射光越强,TCS3002D内置振荡器产生的方波频率越高,
#define S1 5 //S0和S1的组合决定输出信号频率比例因子,比例因子为2%
//比率因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
#define S2 4 //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
#define S3 3
#define OUT 2

int g_count = 0; // count the frequecy
int g_array[3]; // store the RGB value
float g_SF[3]; // save the RGB Scale factor


//初始化
void TSC_Init()
{
pinMode(led, OUTPUT);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);

//比例
//S0 L S1 H 2%
//S0 H S1 L 20%
//S0 H S1 H 100%
changScaling(0);
}

//选择颜色过滤
//滤波类型
//S2 L S3 L 红色
//S2 L S3 H 蓝色
//S2 H S3 L 无
//S2 H S3 H 绿色
void TSC_FilterColor(int Level01, int Level02)
{
if (Level01 != 0)
Level01 = HIGH;

if (Level02 != 0)
Level02 = HIGH;

digitalWrite(S2, Level01);
digitalWrite(S3, Level02);
}

//频率加一
void TSC_Count() {
g_count ++ ;
}

//读取频率
int readFrequecy(int type)
{
switch (type)
{
case 0:
Serial.print("->Frequency RED = ");
g_count = 0;
TSC_FilterColor(LOW, LOW);//Filter without Red
delay(1000);
//保存起来
g_array[0] = g_count;
Serial.println(g_array[0]);
return g_array[0];
case 1:
Serial.print("->Frequency GREEN = ");
g_count = 0;
TSC_FilterColor(HIGH, HIGH);//Filter without Green
delay(1000);
//保存起来
g_array[1] = g_count;
Serial.println(g_array[1]);
return g_array[1];
case 2:
Serial.print("->Frequency BLUE = ");
g_count = 0;
TSC_FilterColor(LOW, HIGH);
delay(1000);
//保存起来
g_array[2] = g_count;
Serial.println(g_array[2]);
return g_array[2];
default:
Serial.println("----- No Filter -----");
g_count = 0;
TSC_FilterColor(HIGH, LOW); //Clear(no filter)
return 0;
}
}

//读取红绿蓝三个频率
void readAllFrequecy() {
readFrequecy(0);
readFrequecy(1);
readFrequecy(2);
readFrequecy(3);
}

//改变比例
void changScaling(int type) {
if (type == 1) {
Serial.println("Change Scaling 20%");
//设置为20%
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
} else if (type == 2 ) {
Serial.println("Change Scaling 100%");
//设置为100
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
} else {
Serial.println("Change Scaling 2%");
//设置为2%
digitalWrite(S0, LOW);
digitalWrite(S1, HIGH);
}
}


//白平衡校验
void whiteBlance() {
readAllFrequecy();

g_SF[0] = 255.0 / g_array[0]; //R Scale factor
g_SF[1] = 255.0 / g_array[1] ; //G Scale factor
g_SF[2] = 255.0 / g_array[2] ; //B Scale factor

Serial.print("RED Scale factor :");
Serial.println(g_SF[0]);
Serial.print("GREEN Scale factor :");
Serial.println(g_SF[1]);
Serial.print("BLUE Scale factor :");
Serial.println(g_SF[2]);
}

//读取颜色
void readColor() {
readAllFrequecy();
Serial.print("the color : ");
for (int i = 0; i < 3; i++) {
int v = int(g_array[i] * g_SF[i]);
Serial.print(v > 255 ? 255 : v);
if (i < 2)
Serial.print(" , ");
}
Serial.println("");
}

/**
获取红色
*/
void getRed() {
int v = readFrequecy(0);
readFrequecy(3);
int red = int(v * g_SF[0]);
Serial.print("the color : ");
Serial.print(red > 255 ? 255 : red);
Serial.println(" , 0 , 0");
}

/**
获取绿色
*/
void getGreen() {
int v = readFrequecy(1);
readFrequecy(3);
int green = int(v * g_SF[1]);
Serial.print("the color : 0 , ");
Serial.print(green > 255 ? 255 : green);
Serial.println(" , 0");
}

/**
获取蓝色
*/
void getBlue() {
int v = readFrequecy(2);
readFrequecy(3);
int blue = int(v * g_SF[2]);
Serial.print("the color : 0 , 0 , ");
Serial.print(blue > 255 ? 255 : blue);
Serial.println("");
}

void( *resetFunc) (void) = 0;

void setup()
{
TSC_Init();
Serial.begin(9600);

attachInterrupt(0, TSC_Count, RISING);

for (int i = 0; i < 3; i++) {
g_SF[i] = 1;
}
}

void loop()
{
//通过串口控制
while (Serial.available() > 0) {
int v = Serial.parseInt();
Serial.read();
Serial.print("read value = ");
Serial.println(v);

//根据读到的值进行操作
switch (v) {
case 0:
//进行白平衡
whiteBlance();
break;
case 1:
//读取颜色
readColor();
break;
case 2:
//只取红色
getRed();
break;
case 3:
//只取绿色
getGreen();
break;
case 4:
//只取蓝色
getBlue();
break;
case 11://关灯
Serial.println("led low");
digitalWrite(led, LOW);
break;
case 12: //开灯
Serial.println("led high");
digitalWrite(led, HIGH);
break;
case 30:// 2% 的比例
changScaling(0);
break;
case 31: // 20% 的比例
changScaling(1);
break;
case 32: // 100% 的比例
changScaling(2);
break;
default:
Serial.println("unknown command");
}
}

}
0%