tonglin0325的个人主页

Spark学习笔记——安装和WordCount

**1.**去清华的镜像站点下载文件spark-2.1.0-bin-without-hadoop.tgz,不要下spark-2.1.0-bin-hadoop2.7.tgz

2.把文件解压到/usr/local目录下,解压之后的效果,Hadoop和Spark都在Hadoop用户

下面的操作都在Hadoop用户下

1
2
3
drwxrwxrwx 13 hadoop hadoop 4096 4月<!--more-->
&nbsp;&nbsp; 4 11:50 spark-2.1.0-bin-without-hadoop/

 添加Hadoop用户和用户组

1
2
3
4
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hadoop
$ sudo adduser hadoop sudo

 然后修改文件夹的用户,用户组以及权限

1
2
3
sudo chown -R hduser:hadoop spark-2.1.0-bin-without-hadoop
sudo chmod 777 hadoop/

 Hadoop文件夹如果权限不对的话,也需要修改

**3.**在/etc/profile下添加路径

1
2
3
export SPARK_HOME=/usr/local/spark-2.1.0-bin-without-hadoop
export PATH=${SPARK_HOME}/bin:$PATH

**4.**还需要修改Spark的配置文件spark-env.sh

1
2
3
cd /usr/local/spark-2.1.0-bin-without-hadoop
cp ./conf/spark-env.sh.template ./conf/spark-env.sh

添加如下

1
2
export SPARK_DIST_CLASSPATH=$(/home/lintong/software/apache/hadoop-2.9.1/bin/hadoop classpath)

 (以上可以参考厦门大学林子雨老师的教程——Spark2.1.0入门:Spark的安装和使用),有些教程坑无数

**5.**在~/coding/coding/Scala/word-count路径下准备一个文本文件,比如test.segmented文件

**6.**在该目录下,在终端运行 spark-shell

创建一个RDD

1
2
scala> val textFile = sc.textFile("file:///home/common/coding/coding/Scala/word-count/test.segmented")

保存RDD成文件

1
2
textFile.saveAsTextFile("file:///home/common/coding/coding/Scala/word-count/writeback")

 这时候会发现在文件夹目录下多了writeback目录,目录下是这么几个文件

 现在,我们建立hdfs文件夹,来把 test.segmented 文件放进我们的hdfs文件夹中

首先,启动Hadoop的HDFS组件,因为没有用到MapReduce组件,所以没有必要启动MapReducen或者YARN

1
2
3
cd /usr/local/hadoop
./sbin/start-dfs.sh

 在HDFS文件系统中,建立文件夹

1
2
./bin/hdfs dfs -mkdir -p /user/hadoop

使用命令查看一下HDFS文件系统中的目录和文件

在Hadoop文件夹下运行命令

1
2
3
./bin/hdfs dfs -ls .       #或者
./bin/hdfs dfs -ls /user/hadoop

 或者直接

1
2
3
hadoop fs -ls /user/hadoop    #或者
hadoop fs -ls .

 把刚刚的 test.segmented** 文件上传到分布式文件系统HDFS**中(放到hadoop用户目录下)

1
2
hadoop fs -put /home/common/coding/coding/Java/WordCount/input/test.segmented .

 再次查看一下

1
2
3
4
5
hadoop@master:~$ hadoop fs -ls /user/hadoop
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2017-04-03 16:18 /user/hadoop/QuasiMonteCarlo_1491207499210_758373570
-rw-r--r-- 1 hadoop supergroup 59 2017-04-03 16:43 /user/hadoop/test.segmented

如果需要删除

1
2
hadoop fs -rm /user/hadoop/test.segmented

查看一个文件的大小

1
2
hadoop fs -du -h /logs/xxxx

现在**回到 **spark-shell 窗口,编写代码从HDFS文件系统加载 test.segmented 文件

并打印文件中的第一行内容

1
2
3
4
5
6
scala> val textFile = sc.textFile("hdfs://master:9000/user/hadoop/test.segmented")
textFile: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/user/hadoop/test.segmented MapPartitionsRDD[1] at textFile at <console>:24

scala> textFile.first()
res0: String = aa bb aa

 如果是单机的话,其中下面两条语句和上面第一条语句是一样的,但是如果是Hadoop伪分布式或者分布式的话,就不行

1
2
val textFile = sc.textFile("/user/hadoop/test.segmented")

 再次把textFile写回到HDFS文件系统中

1
2
textFile.saveAsTextFile("hdfs://master:9000/user/hadoop/writeback")

再次查看

1
2
3
4
5
6
hadoop@master:~$ hadoop fs -ls /user/hadoop
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2017-04-03 16:18 /user/hadoop/QuasiMonteCarlo_1491207499210_758373570
-rw-r--r-- 1 hadoop supergroup 59 2017-04-03 16:43 /user/hadoop/test.segmented
drwxr-xr-x - hadoop supergroup 0 2017-04-03 17:10 /user/hadoop/writeback

如果进入writeback文件夹中查看的话,可以看到里面的文件的内容和test.segmented中的是一样的

1
2
3
4
5
6
hadoop@master:~$ hadoop fs -ls /user/hadoop/writeback
Found 3 items
-rw-r--r-- 3 hadoop supergroup 0 2017-04-03 17:10 /user/hadoop/writeback/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 36 2017-04-03 17:10 /user/hadoop/writeback/part-00000
-rw-r--r-- 3 hadoop supergroup 24 2017-04-03 17:10 /user/hadoop/writeback/part-00001

1
2
3
4
5
6
hadoop@master:~$ hadoop fs -cat /user/hadoop/writeback/part-00000
aa bb aa
bb aa aa
cc bb ee
dd ee cc

1
2
3
4
5
6
7
8
9
10
hadoop@master:~$ hadoop fs -cat /user/hadoop/writeback/part-00001
aa
cc
ee
ff
ff
gg
hh
aa

 

现在进入WordCount阶段,再次进入 Spark-shell

1
2
3
4
val textFile = sc.textFile("hdfs://master:9000/user/hadoop/test.segmented")
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.collect()

 输出

1
2
res6: Array[(String, Int)] = Array((ee,3), (aa,6), (gg,1), (dd,1), (hh,1), (ff,2), (bb,3), (cc,3))

 

 在spark-shell下面运行成功之后,就需要试着在idea里面建立一个工程来运行这段代码

在idea下面建立一个Scala的工程,构建的方式选择是sbt

 

由于本机的Scala的版本是2.11.8

所以在project structure里面设置成2.11.8

接着在build.sbt里面写

1
2
3
4
5
6
7
8
name := "word-count"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"

 注意里面的scalaVersion如果是2.11.X的话,sbt就会去拉spark-core_2.11-2.1.0的包

可以去公司的私服nexus里面去看看有没有这个包

然后在WordCount.scala文件中写入我们的代码

注意如果是setMaster(“local”)的话,需要在/etc/hosts中设置127.0.1.1,然后取消192.168.0.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
/**
* Created by common on 17-4-3.
*/


object WordCount {
def main(args: Array[String]) {
val inputFile = "file:///home/common/coding/coding/Scala/word-count/test.segmented"
val conf = new SparkConf().setAppName("WordCount").setMaster("local")    #创建一个SparkConf对象来配置应用<br />    #集群URL:告诉Spark连接到哪个集群,local是单机单线程,无需连接到集群,应用名:在集群管理器的用户界面方便找到应用
val sc = new SparkContext(conf)        #然后基于这SparkConf创建一个SparkContext对象
val textFile = sc.textFile(inputFile)    #读取输入的数据
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)  #切分成单词,转换成键值对并计数
wordCount.foreach(println)
}
}

然后在sbt中refresh,进行拉包,拉包的过程是无比缓慢的

拉好了之后运行的结果

和在 spark-shell中运行的结果是一致的

 

在林子雨老师的教程中,Spark2.1.0入门:第一个Spark应用程序:WordCount

最后是将整个应用程序打包成JAR,然后通过 spark-submit 提交到 Spark 中运行

做法是在idea的终端中,对代码进行打包

1
2
3
4
5
6
7
8
common@master:~/coding/coding/Scala/word-count$ sbt package
[info] Loading project definition from /home/common/coding/coding/Scala/word-count/project
[info] Set current project to word-count (in build file:/home/common/coding/coding/Scala/word-count/)
[info] Compiling 1 Scala source to /home/common/coding/coding/Scala/word-count/target/scala-2.11/classes...
[info] Packaging /home/common/coding/coding/Scala/word-count/target/scala-2.11/word-count_2.11-1.0.jar ...
[info] Done packaging.
[success] Total time: 6 s, completed 2017-4-4 18:02:13

 生成的jar包位置在

1
2
/home/common/coding/coding/Scala/word-count/target/scala-2.11

 最后通过 spark-submit 运行程序,将jar包通过这个命令提交到 Spark 中运行

1
2
common@master:~/coding/coding/Scala/word-count$ spark-submit --class "WordCount"  /home/common/coding/coding/Scala/word-count/target/scala-2.11/word-count_2.11-1.0.jar

 运行结果

 

在执行spark任务的时候,如果遇到

1
2
3
报如下错误:
Exception in thread "main" java.lang.Exception: When running with master 'yarn-client' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment

在spark的配置文件 conf/spark-env.sh 中添加

1
2
3
4
export HADOOP_HOME=/home/lintong/software/apache/hadoop-2.9.1
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
PATH=$PATH:$HIVE_HOME/bin:$HADOOP_HOME/bin

 

spark集群安装参考:spark 集群搭建 详细步骤

主要是配置slave文件和spark-env文件

集群内容spark-env文件,其中xxx是spark web ui的端口

1
2
3
4
5
6
7
8
9
10
11
12
export SPARK_DIST_CLASSPATH=$(/usr/bin/hadoop classpath)

#export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export SCALA_HOME=/home/dl/packages/scala-2.11.8

export SPARK_MASTER_WEBUI_PORT=xxxx

export HADOOP_HOME=/opt/cloudera/parcels/CDH-5.12.0-1.cdh5.12.0.p0.29/lib/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=/opt/cloudera/parcels/CDH-5.12.0-1.cdh5.12.0.p0.29/lib/hive
PATH=$PATH:$HIVE_HOME/bin:$HADOOP_HOME/bin

 

spark-shell查看当前spark的配置

1
2
3
scala> spark.sql("set").filter("key rlike 'metastore|jdo'").rdd.take(100).foreach(println(_))
[spark.sql.hive.metastore.sharedPrefixes,com.amazonaws.services.dynamodbv2]

Scala学习笔记——安装

安装scala,不要使用sudo apt-get install scala来安装

1.从下面网址来下载Scala文件

1
2
http://www.scala-lang.org/download/2.11.8.html

2.下载下的 scala-2.11.8.tgz 文件解压,然后把文件mv到/usr/local目录下

3.在/etc/profile目录下加上,不要忘记了source

1
2
3
export SCALA_HOME=/usr/local/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH

全文 >>

Maven常用命令

Apache官方仓库

1
2
https://repository.apache.org/

Maven中央仓库 

1
2
http://mvnrepository.com/

Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

1
http://www.trinea.cn/android/maven/

Maven常用命令

1
2
http://www.cnblogs.com/kingfy/p/5665218.html

  

1. 创建Maven的普通java项目:

全文 >>

MySQL学习笔记——innoDB存储结构

1.MySQL的存储路径

1
2
3
4
5
6
7
8
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+----------------------+
| Variable_name | Value |
+---------------+----------------------+
| datadir | /var/lib/mysql/data/ |
+---------------+----------------------+
1 row in set (0.01 sec)

查看datadir目录下的所有文件夹

1
2
3
4
5
6
sh-4.2$ ls -l | grep '^d'
drwxr-x--- 2 mysql mysql 4096 Aug 24 12:36 default
drwxr-x--- 2 mysql mysql 4096 Jan 31 2024 mysql
drwxr-x--- 2 mysql mysql 4096 Jan 31 2024 performance_schema
drwxr-x--- 2 mysql mysql 12288 Jan 31 2024 sys

这和MySQL的database是对应的

其中default是创建的database,目录下会包含opt,frm和ibd文件

db.opt,用来存储当前数据库的默认字符集和字符校验规则。

frm(Form)文件存储表定义。

ibd(InnoDB Data)存储数据和索引文件。

1
2
3
4
5
sh-4.2$ pwd
/var/lib/mysql/data/default
sh-4.2$ ls
db.opt singer.frm singer.ibd song.frm song.ibd song_singer.frm song_singer.ibd t_user.frm t_user.ibd test.frm test.ibd user.frm user.ibd

information_schema 是每个MySQL实例中的一个数据库,存储MySQL服务器维护的所有其他数据库的信息。INFORMATION_SCHEMA数据库包含几个只读的表。它们实际上是视图,而不是基表,因此没有与它们关联的文件,而且你不能在它们上设置触发器。此外,没有使用该名称的数据库目录。

mysql 数据库为系统数据库。它包含存储MySQL服务器运行时所需信息的表。参考:https://dev.mysql.com/doc/refman/5.7/en/system-schema.html

performance_schema 是一个用于在底层监控MySQL服务器执行的特性。参考:https://dev.mysql.com/doc/refman/5.7/en/performance-schema-quick-start.html

sys schema,这是一组帮助dba和开发人员解释由Performance schema收集的数据的对象。Sys schema对象可用于典型的调优和诊断用例。参考:https://dev.mysql.com/doc/refman/5.7/en/sys-schema.html

参考:MySQL系统库作用:performance_schema,sys,information_schema,mysql

其他文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sh-4.2$ ls -l | grep -v '^d'
total 41032
-rw-r----- 1 mysql mysql 56 Jan 31 2024 auto.cnf
-rw-r----- 1 mysql mysql 2 Aug 15 15:05 bc130f3f763a.pid
-rw------- 1 mysql mysql 1680 Jan 31 2024 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 31 2024 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 31 2024 client-cert.pem
-rw------- 1 mysql mysql 1680 Jan 31 2024 client-key.pem
-rw-r----- 1 mysql mysql 477 Aug 15 15:05 ib_buffer_pool
-rw-r----- 1 mysql mysql 8388608 Aug 24 15:25 ib_logfile0
-rw-r----- 1 mysql mysql 8388608 Aug 24 15:05 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Aug 24 15:25 ibdata1
-rw-r----- 1 mysql mysql 12582912 Aug 24 15:06 ibtmp1
-rw-r--r-- 1 mysql mysql 6 Jan 31 2024 mysql_upgrade_info
-rw------- 1 mysql mysql 1676 Jan 31 2024 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Jan 31 2024 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Jan 31 2024 server-cert.pem
-rw------- 1 mysql mysql 1676 Jan 31 2024 server-key.pem

在 MySQL 的 InnoDB 存储引擎中,这些文件(ib_buffer_poolib_logfile0ib_logfile1ibdata1ibtmp1)代表了数据库运行时的不同数据结构和存储机制。它们各自有不同的用途,用于管理和存储 InnoDB 的数据和日志。

ib_buffer_pool 文件用于持久化存储 InnoDB 缓冲池(Buffer Pool)中的热数据页的状态。当 MySQL 服务器重启时,通过此文件恢复缓冲池的内容,减少重启后重新填充缓冲池所需的时间。

ib_logfile0**ib_logfile1** 这两个文件是 InnoDB 的 **重做日志(Redo Logs)** 文件,记录了数据库事务的更改信息(插入、更新、删除等)。这些日志文件用于在崩溃恢复过程中重新应用未写入数据文件的更改。<br />

ibdata1 是 InnoDB 系统表空间的默认文件。它用于存储多个 InnoDB 表的数据和索引,以及全局表元数据(如数据字典、回滚段等)。

表数据即可以存储在系统表空间ibdata1中,也可以存储在独立表空间中ibd,这个由参数 innodb_file_per_table 来控制,MySQL5.7及以上这个默认值为1,所以MySQL每张表都是一个独立的ibd文件。

1
2
3
4
5
6
7
8
mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)

ibtmp1 是 InnoDB 的 临时表空间文件,专门用于存储临时表和临时数据。

2.MySQL innoDB的存储结构

1.innoDB架构

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

2.表空间(Tablespace)

表空间是 InnoDB 用于存储表数据和索引数据的物理存储区域。可以把表空间理解为一块大的存储区域,其中可以存放多个表和索引。

表空间由多个文件组成,这些文件可能是系统表空间(如 ibdata1)、独立表空间(每个表对应一个 .ibd 文件)、通用表空间(用户定义的多个表空间文件)、临时表空间(专门用于存储临时表和临时数据等,如ibtmp1)、Undo 表空间(也叫做回滚表空间,是 InnoDB 存储引擎中用于存储事务的 undo logs(回滚日志) 的一种特殊类型的表空间)。

3.段,区,页,行

参考:MySQL Storage Structure

1.页(page)

每个表空间(tablespace)页(page)组成。MySQL实例中的每个表空间都有相同的页面大小。默认情况下,所有表空间的页面大小都是16KB。在创建MySQL实例时,可以通过指定innodb_page_size选项将页面大小减小到8KB或4KB。您还可以将页面大小增加到32KB或64KB。磁盘和内存之间的数据传输是逐页进行的,innodb_page_size表示InnoDB在任何时候在磁盘(数据文件)和内存(Buffer Pool)之间传输数据的大小。

每个表中的数据被划分为多个页(page)。组成每个表的页(page)被安排在一个称为b树索引的树状数据结构中。表数据/聚簇索引(Table Data)辅助索引(Secondary Index)都使用这种类型的结构。表示整个表的b树索引称为聚簇索引,它是根据主键列组织的。聚簇索引数据结构的节点包含行(row)中所有列(字段)的值。辅助索引结构的节点包含索引列和主键列的值。

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

B+ 树中包含数据页(Data Page)索引页(Index Page)

索引页位于 B+ 树的非叶子节点中,主要存储索引键和指向子节点的指针。

数据页位于 B+ 树的叶子节点中,存储实际的数据记录。

Page的结构如下图,其中User Records是一个单向链表,而

参考:MySQL Storage Structure

2.区(extent)

这些页被分组为大小为1MB的区段(extents),其中最大的页大小为16KB(64个连续的16KB页,或128个8KB页,或256个4KB页)。对于一个32KB的页面,区段大小是2MB。对于64KB的页面,区段大小为4MB。

B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。所以在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区(extent)为单位分配。每个区的大小为 1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序 I/O 了。

参考:MySQL 一行记录是怎么存储的?

3.段(segment)

表空间是由各个段(segment)组成的,段是由多个区(extent)组成的。段一般分为数据段、索引段和回滚段等。

  • 索引段(Non-Leaf Node Segment):存放 B+ 树的非叶子节点的区的集合;
  • 数据段(Leaf Node Segment):存放 B+ 树的叶子节点的区的集合;
  • 回滚段(Rollback Segment):存放的是回滚数据的区的集合,MVCC 利用了回滚段实现了多版本查询数据。回滚段作为undo log的一部分,undo log主要用于事务回滚和MVCC(多并发版本控制)。

参考:MySQL 一行记录是怎么存储的?

表空间中的“文件”在InnoDB中称为段(segment)。(这些段不同于回滚段,后者实际上包含许多表空间段。)

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-file-space.html

4.行(row)

InnoDB存储引擎支持四种行格式:REDUNDANT, COMPACT, DYNAMIC 和 COMPRESSED。

MySQL5.7默认的row format是dynamic

1
2
3
4
5
6
7
8
mysql> SHOW VARIABLES LIKE 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.00 sec)

变长(Variable-length)列不符合列值存储在b树索引节点中的规则。变长列太长而不能放在b树页上,它们存储在单独分配的磁盘页上,称为溢出页(overflow page)。这样的列称为页外列。页外列的值存储在溢出页的单链表中,每个列都有自己的一个或多个溢出页的列表。根据列的长度,可变长列的所有值或其前缀都存储在B-tree中,以避免浪费存储空间和另行读取一页。

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

4.Buffer Pool

Buffer Pool(缓冲池)是主内存中的一个区域,InnoDB在访问表和索引数据时将在这里缓存数据。缓冲池允许频繁使用的数据直接从内存中访问,这加快了处理速度。在专用服务器上,高达80%的物理内存通常分配给缓冲池。

为了提高大容量读操作的效率,缓冲池被划分为可以容纳多行数据的页。为提高缓存管理的效率,缓冲池实现为页(Page)的链表。很少使用的数据使用最近最少使用(least recently used, LRU)算法的变体从缓存中老化。在需要空间向缓冲池添加新页时,会将最近最少使用的页清除,并将新页添加到列表的中间。

Buffer Pool的作用:

  • 当读取数据时,如果数据存在于 Buffer Pool 中,客户端就会直接读取 Buffer Pool 中的数据,否则再去磁盘中读取。
  • 当修改数据时,如果数据存在于 Buffer Pool 中,那直接修改 Buffer Pool 中数据所在的页,然后将其页设置为脏页(该页的内存数据和磁盘上的数据已经不一致),为了减少磁盘I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。

参考:MySQL 日志:undo log、redo log、binlog 有什么用?

3.InnoDB和MyISAM存储引擎区别

1.InnoDB和MyISAM的区别

参考:深入理解MySQL索引原理和实现——为什么索引可以加速查询?

存储引擎 InnoDB MyISAM
索引类型 InnoDB 主键是聚簇索引,二级索引是非聚簇索引 MyISAM 是非聚簇索引
支持事务 InnoDB 支持事务 MyISAM 不支持事务
InnoDB 支持表锁,但默认使用行锁 MyISAM 支持表锁,不支持行锁
支持全文索引 InnoDB(5.6以后) 支持全文索引 MyISAM 支持全文索引
并发性能 InnoDB 适用于大量的插入、删除和更新操作,尤其是高并发的写操作场景,因为它支持行级锁和多版本并发控制(MVCC) MyISAM 由于其表锁机制,非常适合只读操作的大量 select 查询。
外键约束 InnoDB 支持外键约束 MyISAM 不支持外键约束

全文 >>

Hadoop学习笔记——WordCount

1.在IDEA下新建工程,选择from Mevan

GroupId:WordCount

ArtifactId:com.hadoop.1st

Project name:WordCount

2.pom.xml文件

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
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>WordCount</groupId>
<artifactId>com.hadoop.1st</artifactId>
<version>1.0-SNAPSHOT</version>

<repositories>
<repository>
<id>apache</id>
<url>http://maven.apache.org</url>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
<outputDirectory>./lib</outputDirectory>
</configuration>

</plugin>
</plugins>
</build>
</project>

全文 >>

Ubuntu下从外网上北邮人BT

1.使用VPN+ipv6(测试于2017-01,该方法已经不可用)

首先你需要有北邮的VPN账号和密码,只要是北邮的学生都有

账号和密码不懂的请查看 VPN账号密码说明

接下来登录https://sslvpn.bupt.edu.cn,输入账号和密码

已经登录好了

但是还是不能上BYR BT,是因为没有把ipv4转成ipv6,在Ubuntu下进行转换很简单,

只需要安装miredo,

输入命令

1
2
sudo apt-get install miredo

全文 >>

Python自然语言处理学习——jieba分词

jieba——“结巴”中文分词sunjunyi开发的一款Python中文分词组件,可以在Github上查看jieba项目

要使用jieba中文分词,首先需要安装jieba中文分词,作者给出了如下的安装方法

1.全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba

2.半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install

3.手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录

全文 >>