⑴ 怎样查看hadoop集群每个节点的执行情况,就是查看每个slave结点的执行效率等。
可以看localhost:50030,里面有每个任务的执行情况
50070是HDFS的存储情况,看不了执行效率
⑵ 如何查看hadoop集群是否安装成功(用jps命令
1、用jps命令
(1)master节点
启动集群:
cy@master:~$ start-all.sh
starting namenode, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-namenode-master.out
slave2: starting datanode, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-datanode-slave2.out
slave1: starting datanode, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-datanode-slave1.out
master: starting secondarynamenode, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-secondarynamenode-master.out
starting jobtracker, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-jobtracker-master.out
slave1: starting tasktracker, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-tasktracker-slave1.out
slave2: starting tasktracker, logging to /home/cy/Hadoop/hadoop-1.2.1/libexec/../logs/hadoop-cy-tasktracker-slave2.out
用jps命令查看java进程:
cy@master:~$ jps
6670 NameNode
7141 Jps
7057 JobTracker
(2)slave1节点
用jps命令查看Java进程:
cy@slave1:~$ jps
3218 Jps
2805 DataNode
2995 TaskTracker
(3)slave2节点
用jps命令查看Java进程:
cy@slave2:~$ jps
2913 TaskTracker
2731 DataNode
3147 Jps
如果三台虚拟机用jps命令查询时如上面显示的那样子,就说明hadoop安装和配置成功了。
2、hadoop集群的测试,用hadoop-examples-1.2.1.jar中自带的wordcount程序进行测试,该程序的作用是统计单词的个数。
(1)我们现在桌面上创建一个新的文件test.txt,里面总共有10行,每行都是hello world
(2)在HDFS系统里创建一个input文件夹,使用命令如下:
hadoop fs -mkdir input
或 hadoop fs -mkdir /user/你的用户名/input
(3)把创建好的test.txt上传到HDFS系统的input文件夹下,使用命令如下所示。
hadoop fs -put /home/你的用户名/桌面/test.txt input
或 hadoop fs -put /home/你的用户名/桌面/test.txt /user/你的用户名/input
(4)我们可以查看test.txt是否在HDFS的input文件夹下,如下所示:
hadoop fs -ls input
如果显示如下就说明上传成功:
Found 1 items
-rw-r--r-- 3 cy supergroup 120 2015-05-08 20:26 /user/cy/input/test.txt
(5)执行hadoop-examples-1.2.1.jar中自带的wordcount程序,如下:(提示:在执行下面的命令之前,你要在终端用cd命令进入到/home/cy/Hadoop/hadoop-1.2.1目录)
hadoop jar hadoop-examples-1.2.1.jar wordcount /user/你的用户名/input/test.txt /user/你的用户名/output
如果显示如下结果就说明运行成功:
15/05/08 20:31:29 INFO input.FileInputFormat: Total input paths to process : 1
15/05/08 20:31:29 INFO util.NativeCodeLoader: Loaded the native-hadoop library
15/05/08 20:31:29 WARN snappy.LoadSnappy: Snappy native library not loaded
15/05/08 20:31:30 INFO mapred.JobClient: Running job: job_201505082010_0001
15/05/08 20:31:31 INFO mapred.JobClient: map 0% rece 0%
15/05/08 20:31:35 INFO mapred.JobClient: map 100% rece 0%
15/05/08 20:31:42 INFO mapred.JobClient: map 100% rece 33%
15/05/08 20:31:43 INFO mapred.JobClient: map 100% rece 100%
15/05/08 20:31:43 INFO mapred.JobClient: Job complete: job_201505082010_0001
15/05/08 20:31:43 INFO mapred.JobClient: Counters: 29
15/05/08 20:31:43 INFO mapred.JobClient: Job Counters
15/05/08 20:31:43 INFO mapred.JobClient: Launched rece tasks=1
15/05/08 20:31:43 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=3117
15/05/08 20:31:43 INFO mapred.JobClient: Total time spent by all reces waiting after reserving slots (ms)=0
15/05/08 20:31:43 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
15/05/08 20:31:43 INFO mapred.JobClient: Launched map tasks=1
15/05/08 20:31:43 INFO mapred.JobClient: Data-local map tasks=1
15/05/08 20:31:43 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=8014
15/05/08 20:31:43 INFO mapred.JobClient: File Output Format Counters
15/05/08 20:31:43 INFO mapred.JobClient: Bytes Written=18
15/05/08 20:31:43 INFO mapred.JobClient: FileSystemCounters
15/05/08 20:31:43 INFO mapred.JobClient: FILE_BYTES_READ=30
15/05/08 20:31:43 INFO mapred.JobClient: HDFS_BYTES_READ=226
15/05/08 20:31:43 INFO mapred.JobClient: FILE_BYTES_WRITTEN=116774
15/05/08 20:31:43 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=18
15/05/08 20:31:43 INFO mapred.JobClient: File Input Format Counters
15/05/08 20:31:43 INFO mapred.JobClient: Bytes Read=120
15/05/08 20:31:43 INFO mapred.JobClient: Map-Rece Framework
15/05/08 20:31:43 INFO mapred.JobClient: Map output materialized bytes=30
15/05/08 20:31:43 INFO mapred.JobClient: Map input records=10
15/05/08 20:31:43 INFO mapred.JobClient: Rece shuffle bytes=30
15/05/08 20:31:43 INFO mapred.JobClient: Spilled Records=4
15/05/08 20:31:43 INFO mapred.JobClient: Map output bytes=200
15/05/08 20:31:43 INFO mapred.JobClient: CPU time spent (ms)=610
15/05/08 20:31:43 INFO mapred.JobClient: Total committed heap usage (bytes)=176427008
15/05/08 20:31:43 INFO mapred.JobClient: Combine input records=20
15/05/08 20:31:43 INFO mapred.JobClient: SPLIT_RAW_BYTES=106
15/05/08 20:31:43 INFO mapred.JobClient: Rece input records=2
15/05/08 20:31:43 INFO mapred.JobClient: Rece input groups=2
15/05/08 20:31:43 INFO mapred.JobClient: Combine output records=2
15/05/08 20:31:43 INFO mapred.JobClient: Physical memory (bytes) snapshot=182902784
15/05/08 20:31:43 INFO mapred.JobClient: Rece output records=2
15/05/08 20:31:43 INFO mapred.JobClient: Virtual memory (bytes) snapshot=756301824
15/05/08 20:31:43 INFO mapred.JobClient: Map output records=20
(6)我们可以使用下面的命令还查看运行后的结果:
hadoop fs -ls output
hadoop fs -text /user/你的用户名/output/part-r-00000
如果显示如下就说明hadoop三个节点安装和配置成功,测试也成功了,就可以继续更深入地使用和研究hadoop了
hello 10
world 10
⑶ Hadoop集群以外的机器如何访问Hadoop集群,进行提交文件,下载文件
集群以外的机器如何访问Hadoop集群,并像集群中提交作业和传送数据
(1)首先,在机器上安装nutch或者hadoop
(2)配置两个文件
hadoop-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://gc04vm12:9000</value>
<description> </description>
</property>
<property>
<name>mapred.job.tracker</name>
<value>gc04vm12:9001</value>
<description> </description>
</property>
</configuration>
(3)这样便能执行命令,查看集群状态,向集群提交作业
(4)hdfs中的用户
使用root登陆而hadoop中没有创建root用户时,使用如下命令时,查看到的就不是nutch用户主目录 /user/root了
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 执行此命令时,即是列出/user/root(root用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory. 没有此目录
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls /
Found 3 items
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:55 /usr 这个是什么?
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 主目录(/user/root)中创建x目录,提示以下信息
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="user":nutch:supergroup:rwxr-xr-x
这是因为root用户对/user/目录没有写权限(drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user)
hdfs中的nutch用户是启动hadoop集群的这个用户,当客户机中也存在nutch用户时,登陆后访问hdfs时,进入的是home目录(/user/nutch)。
hdfs中文件和目录的权限类似linux,可以修改其权限,改变其所属组
nutch用户格式化namenode,启动hadoop集群(会用到nutch用户的公钥信息,ssh配置)后,执行命令,
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 执行此命令时,即是列出/user/nutch(nutch用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory.
因为没有/user/nutch目录,所以不能访问,而此时若创建一个文件,如使用以下命令
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 则可以顺利执行,此时它将创建/user/nutch/x目录。
而使用root用户不行,是因为 root用户对/user/目录没有写权限。
那么如何创建一个root用户呢,可以这样做
超级用户nutch在hdfs中创建目录/user/root,即 bin/hadoop dfs -mkdir /user/root
更改/user/root目录所属用户和组, bin/hadoop dfs -chown -R root:root /user/root (若此处没有指定组,则默认root属于supergroup组, bin/hadoop dfs -chown -R root /user/root)
这样就相当于在hdfs中创建了用户root,组root;
用户权限和Linux类似,nutch是超级用户。
例如nutch在root的home目录下创建目录s,则s的权限如下,属于nutch,组是root
drwxr-xr-x - nutch root 0 2010-05-21 04:41 /user/root/s
root用户此时就不能写s目录了
[root@gc04vm14 nutch-1.0]# bin/hadoop dfs -mkdir s/x
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="s":nutch:root:rwxr-xr-x
root用户属于root组,并且执行作业,会提示错误,如下
[root@gc03vm12 nutch-1.0]# bin/nutch crawl /user/nutch/urls -dir data2 -depth 5 -topN 8
提示如下错误
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="tmp":nutch:supergroup:rwxr-xr-x
这是因为root用户对/tmp目录(hdfs目录)没有写权限,因为作业执行时,会在/tmp目录下生成相应的job文件,
/tmp的权限如下:
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
因此非超级用户提交作业时,用户问题是一个很麻烦的问题
注:
hadoop有些命令只能在namenode上执行
⑷ hadoop 怎么查看集群运行情况
使用hadoop dfsadmin -report命令查看集群运行,结果全为0结果如下:
[java]view plain
[[email protected]]$hadoopdfsadmin-report
DEPRECATED:.
Insteasethehdfscommandforit.
ConfiguredCapacity:0(0B)
PresentCapacity:0(0B)
DFSRemaining:0(0B)
DFSUsed:0(0B)
DFSUsed%:NaN%
Underreplicatedblocks:0
Blockswithcorruptreplicas:0
Missingblocks:0
1 stop-dfs.sh
2 start-dfs.sh
3hadoop dfsadmin -report
运行结果如下
[java]view plain
[hadoop@mini1~]$hdfsdfsadmin-report
ConfiguredCapacity:7967756288(7.42GB)
PresentCapacity:5630824448(5.24GB)
DFSRemaining:5630799872(5.24GB)
DFSUsed:24576(24KB)
DFSUsed%:0.00%
Underreplicatedblocks:0
Blockswithcorruptreplicas:0
Missingblocks:0
⑸ 大数据:Hadoop入门
什么是大数据:
(1.)大数据是指在一定时间内无法用常规软件对其内容进行抓取,管理和处理的数据集合,简而言之就是数据量非常大,大到无法用常规工具进行处理,如关系型数据库,数据仓库等。这里“大”是一个什么量级呢?如在阿里巴巴每天处理数据达到20PB(即20971520GB).
2.大数据的特点:
(1.)体量巨大。按目前的发展趋势来看,大数据的体量已经到达PB级甚至EB级。
(2.)大数据的数据类型多样,以非结构化数据为主,如网络杂志,音频,视屏,图片,地理位置信息,交易数据,社交数据等。
(3.)价值密度低。有价值的数据仅占到总数据的一小部分。比如一段视屏中,仅有几秒的信息是有价值的。
(4.)产生和要求处理速度快。这是大数据区与传统数据挖掘最显着的特征。
3.除此之外还有其他处理系统可以处理大数据。
Hadoop (开源)
Spark(开源)
Storm(开源)
MongoDB(开源)
IBM PureDate(商用)
Oracle Exadata(商用)
SAP Hana(商用)
Teradata AsterData(商用)
EMC GreenPlum(商用)
HP Vertica(商用)
注:这里我们只介绍Hadoop。
二:Hadoop体系结构
Hadoop来源:
Hadoop源于Google在2003到2004年公布的关于GFS(Google File System),MapRece和BigTable的三篇论文,创始人Doug Cutting。Hadoop现在是Apache基金会顶级项目,“
Hadoop”一个虚构的名字。由Doug Cutting的孩子为其黄色玩具大象所命名。
Hadoop的核心:
(1.)HDFS和MapRece是Hadoop的两大核心。通过HDFS来实现对分布式储存的底层支持,达到高速并行读写与大容量的储存扩展。
(2.)通过MapRece实现对分布式任务进行处理程序支持,保证高速分区处理数据。
3.Hadoop子项目:
(1.)HDFS:分布式文件系统,整个Hadoop体系的基石。
(2.)MapRece/YARN:并行编程模型。YARN是第二代的MapRece框架,从Hadoop 0.23.01版本后,MapRece被重构,通常也称为MapRece V2,老MapRece也称为 MapRece V1。
(3.)Hive:建立在Hadoop上的数据仓库,提供类似SQL语音的查询方式,查询Hadoop中的数据,
(5.)HBase:全称Hadoop Database,Hadoop的分布式的,面向列的数据库,来源于Google的关于BigTable的论文,主要用于随机访问,实时读写的大数据。
(6.)ZooKeeper:是一个为分布式应用所设计的协调服务,主要为用户提供同步,配置管理,分组和命名等服务,减轻分布式应用程序所承担的协调任务。
还有其它特别多其它项目这里不做一一解释了。
三:安装Hadoop运行环境
用户创建:
(1.)创建Hadoop用户组,输入命令:
groupadd hadoop
(2.)创建hser用户,输入命令:
useradd –p hadoop hser
(3.)设置hser的密码,输入命令:
passwd hser
按提示输入两次密码
(4.)为hser用户添加权限,输入命令:
#修改权限
chmod 777 /etc/sudoers
#编辑sudoers
Gedit /etc/sudoers
#还原默认权限
chmod 440 /etc/sudoers
先修改sudoers 文件权限,并在文本编辑窗口中查找到行“root ALL=(ALL)”,紧跟后面更新加行“hser ALL=(ALL) ALL”,将hser添加到sudoers。添加完成后切记还原默认权限,否则系统将不允许使用sudo命令。
(5.)设置好后重启虚拟机,输入命令:
Sudo reboot
重启后切换到hser用户登录
安装JDK
(1.)下载jdk-7u67-linux-x64.rpm,并进入下载目录。
(2.)运行安装命令:
Sudo rpm –ivh jdk-7u67-linux-x64.rpm
完成后查看安装路径,输入命令:
Rpm –qa jdk –l
记住该路径,
(3.)配置环境变量,输入命令:
Sudo gedit /etc/profile
打开profile文件在文件最下面加入如下内容
export JAVA_HOME=/usr/java/jdk.7.0.67
export CLASSPATH=$ JAVA_HOME/lib:$ CLASSPATH
export PATH=$ JAVA_HOME/bin:$PATH
保存后关闭文件,然后输入命令使环境变量生效:
Source /etc/profile
(4.)验证JDK,输入命令:
Java –version
若出现正确的版本则安装成功。
配置本机SSH免密码登录:
(1.)使用ssh-keygen 生成私钥与公钥文件,输入命令:
ssh-keygen –t rsa
(2.)私钥留在本机,公钥发给其它主机(现在是localhost)。输入命令:
ssh--id localhost
(3.)使用公钥来登录输入命令:
ssh localhost
配置其它主机SSH免密登录
(1.)克隆两次。在VMware左侧栏中选中虚拟机右击,在弹出的快捷键菜单中选中管理---克隆命令。在克隆类型时选中“创建完整克隆”,单击“下一步”,按钮直到完成。
(2.)分别启动并进入三台虚拟机,使用ifconfig查询个主机IP地址。
(3.)修改每台主机的hostname及hosts文件。
步骤1:修改hostname,分别在各主机中输入命令。
Sudo gedit /etc/sysconfig/network
步骤2:修改hosts文件:
sudo gedit /etc/hosts
步骤3:修改三台虚拟机的IP
第一台对应node1虚拟机的IP:192.168.1.130
第二台对应node2虚拟机的IP:192.168.1.131
第三台对应node3虚拟机的IP:192.168.1.132
(4.)由于已经在node1上生成过密钥对,所有现在只要在node1上输入命令:
ssh--id node2
ssh--id node3
这样就可以将node1的公钥发布到node2,node3。
(5.)测试SSH,在node1上输入命令:
ssh node2
#退出登录
exit
ssh node3
exit
四:Hadoop完全分布式安装
1. Hadoop有三种运行方式:
(1.)单机模式:无须配置,Hadoop被视为一个非分布式模式运行的独立Java进程
(2.)伪分布式:只有一个节点的集群,这个节点即是Master(主节点,主服务器)也是Slave(从节点,从服务器),可在此单节点上以不同的java进程模拟分布式中的各类节点
(3.)完全分布式:对于Hadoop,不同的系统会有不同的节点划分方式。
2.安装Hadoop
(1.)获取Hadoop压缩包hadoop-2.6.0.tar.gz,下载后可以使用VMWare Tools通过共享文件夹,或者使用Xftp工具传到node1。进入node1 将压缩包解压到/home/hser目录下,输入命令:
#进入HOME目录即:“/home/hser”
cd ~
tar –zxvf hadoop-2.6.0.tar.gz
(2.)重命名hadoop输入命令:
mv hadoop-2.6.0 hadoop
(3.)配置Hadoop环境变量,输入命令:
Sudo gedit /etc/profile
将以下脚本加到profile内:
#hadoop
export HADOOP_HOME=/home/hser/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
保存关闭,最后输入命令使配置生效
source /etc/profile
注:node2,和node3都要按照以上配置进行配置。
3.配置Hadoop
(1.)hadoop-env.sh文件用于指定JDK路径。输入命令:
[hser@node1 ~]$ cd ~/hadoop/etc/hadoop
[hser@node1 hadoop]$ gedit hadoop-env.sh
然后增加如下内容指定jDK路径。
export JAVA_HOME=/usr/java/jdk1.7.0_67
(2.)打开指定JDK路径,输入命令:
export JAVA_HOME=/usr/java/jdk1.7.0_67
(4.)core-site.xml:该文件是Hadoop全局配置,打开并在
⑹ 如何初始化,启动及停止Hadoop集群
第一步,在Hadoop01机器上启动Zookeeper:
[root@hadoop01 ~]# /root/apps/zookeeper/bin/zkServer.sh start
第二步,在Hadoop02机器上启动Zookeeper:
[root@hadoop02 ~]# /root/apps/zookeeper/bin/zkServer.sh start
第三步,在Hadoop03机器上启动Zookeeper:
[root@hadoop03 ~]# /root/apps/zookeeper/bin/zkServer.sh start
启动Zookeeper之后,可以分别在3台机器上使用如下命令查看Zookeeper的启动状态:
/root/apps/zookeeper/bin/zkServer.sh status
第四步,在Hadoop01机器上启动HDFS:
[root@hadoop01 ~]# /root/apps/hadoop/sbin/start-dfs.sh
第五步,在Hadoop01机器上启动YARN:
[root@hadoop01 ~]# /root/apps/hadoop/sbin/start-yarn.sh
第六步,在Hadoop02机器上单独启动一个ResourceManager:
(注意这里使用的是“yarn-daemon.sh”命令,而不是“hadoop-daemon.sh”,不知道为什么使用“hadoop-daemon.sh”无法启动ResourceManager)
[root@hadoop02 ~]# /root/apps/hadoop/sbin/yarn-daemon.sh start resourcemanager!
⑺ hadoop集群模式部署中查询集群进程的命令是什么
使用java的jps,因为他们都是java进程
⑻ 如何通过脚本监控hadoop集群的状态
使用脚本提交 1.使用spark脚本提交到yarn,首先需要将spark所在的主机和hadoop集群之间hosts相互配置(也就是把spark主机的ip和主机名配置到hadoop所有节点的/etc/hosts里面,再把集群所有节点的ip和主机名配置到spark所在主机的/etc/hosts里面)。 2.然后需要把hadoop目录etc/hadoop下面的*-sit.xml复制到${SPARK_HOME}的conf下面. 3.确保hadoop集群配置了 HADOOP_CONF_DIR or YARN_CONF_DIR 1.yarn-standalone方式提交到yarn 在${SPARK_HOME}下面执行: SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \ ./bin/spark-class org.apache.spark.deploy.yarn.Client \ --jar ./examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \ --class org.apache.spark.examples.SparkPi \ --args yarn-standalone \ --num-workers 3 \ --master-memory 2g \ --worker-memory 2g \ --worker-cores 1 复制代码 2. yarn-client 方式提交到yarn 在${SPARK_HOME}下面执行: SPARK_JAR=./assembly/target/scala...
⑼ 如何确认分布式Hadoop1.2.1集群环境是否运转正常
您好,很高兴为您解答。
1: su - grid
2: pwd
/home/grid
3: 创建input目录,mkdir input ---> 然后进入input 目录 cd input
4: 通过输出重定向的方式,新增两个txt文件
echo "Hi,China">Text1.txt
echo "Hi,Hadoop">Text2.txt
5: 查看txt文件,确认内容是否OK
cat Text1.txt
Hi,China
6:查看Hadoop HDFS里是否有东西
cd ..
cd hadoop-1.2.1
bin/hadoop fs -ls
返回: ls: Cannot access .: No such file or directory
7: 把input目录下的文件拷贝到hadoop in目录下
bin/hadoop fs -put ../put ./in
提示错误:
put: org.apache.hadoop.hdfs.server .namenode.SafeModeException: Cannot create directory /user/grid/in. Name node is in safe mode.
很显然,提示我们目前Hadoop处于安全模式下,处于安全模式下,我们是不能做任何操作的,不能拷贝文件,所以需要接触安全模式:
bin/hadoop dfsadmin -safemode leave ,继续以上操作就哦了。
8:确认文件是否拷贝进去.
bin/hadoop fs -ls
返回: 以上两个文件。
9:可以查看以上文件内容,确认是否OK.
bin/hadoop fs -cat ./in/Text1.txt
返回:Hi,China
10:执行example jar 进行统计分析。
bin/hadoop jar hadoop-examples-1.2.1.jar wordcount in out
11:查看执行输出文件。
bin/hadoop fs -cat ./out/part-r-00000
返回:
Hadoop 1
Hi 2
China 1
如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】
希望我的回答对您有所帮助,望采纳!
~ O(∩_∩)O~