#
一,什么是mysql分表,分区
什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法
什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例
二,mysql分表和分区有什么区别呢
1,实现方式上
a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。
- [root@BlackGhost test]# ls |grep user
- alluser.MRG
- alluser.frm
- user1.MYD
- user1.MYI
- user1.frm
- user2.MYD
- user2.MYI
- user2.frm
[root@BlackGhost test]# ls |grep user alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm
简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西
- [root@BlackGhost test]# cat alluser.MRG |more
- user1
- user2
- #INSERT_METHOD=LAST
[root@BlackGhost test]# cat alluser.MRG |more user1 user2 #INSERT_METHOD=LAST
从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。
b),分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。
- [root@BlackGhost test]# ls |grep aa
- aa#P#p1.MYD
- aa#P#p1.MYI
- aa#P#p3.MYD
- aa#P#p3.MYI
- aa.frm
- aa.par
[root@BlackGhost test]# ls |grep aa aa#P#p1.MYD aa#P#p1.MYI aa#P#p3.MYD aa#P#p3.MYI aa.frm aa.par
从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。
2,数据处理上
a),分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子:
select * from alluser where id='12'表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。
b),分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。
3,提高性能上
a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。
b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。
4),实现的难易度上
a),分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。
b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。
三,mysql分表和分区有什么联系呢
1,都能提高mysql的性高,在高并发状态下都有一个良好的表面。
2,分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
Apache Ambari是对Hadoop进行监控、管理和生命周期管理的开源项目。它也是一个为Hortonworks数据平台选择管理组建的项目。Ambari向Hadoop MapReduce、HDFS、 HBase、Pig, Hive、HCatalog以及Zookeeper提供服务。最近准备装ambari,在网上找了许久,没找到比较系统的ambari安装过程,于是,就根据官网进行了安装,下面是我推荐的正确的较完善的安装方式,希望对大家有所帮助。
一、准备工作
1、系统:我的系统是CentOS6.2,x86_64,本次集群采用两个节点。管理节点:192.168.10.121;客户端节点:192.168.10.122
2、系统最好配置能上网,这样方便后面的操作,否则需要配置yum仓库,比较麻烦。
3、集群中ambari-serveer(管理节点)到客户端配置无密码登录。
4、集群同步时间
5、SELinux,iptables都处于关闭状态。
6、ambari版本:1.2.0
二、安装步骤
A、配置好集群环境
############ 配置无密码登录 #################
[root@ccloud121 ~]# ssh-keygen -t dsa
[root@ccloud121 ~]# cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys
[root@ccloud121 ~]# scp /root/.ssh/id_dsa.pub 192.168.10.122:/root/
[root@ccloud121 ~]# ssh 192.168.10.122
[root@ccloud122 ~]# cat /root/.ssh/id_dsa.pub >> /root/.ssh/authorized_keys
############# NTP 时间同步 #################
[root@ccloud121 ~]# ntpdate time.windows.com
[root@ccloud121 ~]# ssh ccloud122 ntpdate time.windows.com
########### SELinux & iptables 关闭 ###########
[root@ccloud121 ~]# setenforce 0
[root@ccloud121 ~]# ssh ccloud122 setenforce 0
[root@ccloud121 ~]# chkconfig iptables off
[root@ccloud121 ~]# service iptables stop
[root@ccloud121 ~]# ssh ccloud122 chkconfig iptables off
[root@ccloud121 ~]# ssh ccloud122 service iptables stop
B、管理节点上安装ambari-server
1、下载repo文件
[root@ccloud121 ~]# wget http://public-repo-1.hortonworks.com/AMBARI-1.x/repos/centos6/ambari.repo
[root@ccloud121 ~]# cp ambari.repo /etc/yum.repos.d
这样,ambari-server的yum仓库就做好了。
2、安装epel仓库
[root@ccloud121 ~]# yum install epel-release # 查看仓库列表,应该有HDP,EPEL [root@ccloud121 ~]# yum repolist
3、通过yum安装amabari bits,这同时也会安装PostgreSQL
[root@ccloud121 ~]# yum install ambari-server
这个步骤要等一会,它需要上网下载,大概39M左右。
4、运行ambari-server setup,安装ambari-server,它会自动安装配置PostgreSQL,同时要求输入用户名和密码,如果按n,它用默认的用户名/密码值:ambari-server/bigdata。接着就开始下载安装JDK。安装完成后,ambari-server就可以启动了。
三、集群启动
1、直接接通过ambari-server start和amabari-server stop即可启动和关闭ambari-serveer。
2、启动成功后,在浏览器输入http://192.168.10.121:8080
界面如下图所示:

登录名和密码都是admin。
这样就可以登录到管理控制台。

下面将介绍大数据领域支持Java的主流开源工具:

1. HDFS
HDFS是Hadoop应用程序中主要的分布式储存系统, HDFS集群包含了一个NameNode(主节点),这个节点负责管理所有文件系统的元数据及存储了真实数据的DataNode(数据节点,可以有很多)。HDFS针对海量数据所设计,所以相比传统文件系统在大批量小文件上的优化,HDFS优化的则是对小批量大型文件的访问和存储。

2. MapReduce
Hadoop MapReduce是一个软件框架,用以轻松编写处理海量(TB级)数据的并行应用程序,以可靠和容错的方式连接大型集群中上万个节点(商用硬件)。

3. HBase
Apache HBase是Hadoop数据库,一个分布式、可扩展的大数据存储。它提供了大数据集上随机和实时的读/写访问,并针对了商用服务器集群上的大型表格做出优化——上百亿行,上千万列。其核心是Google Bigtable论文的开源实现,分布式列式存储。就像Bigtable利用GFS(Google File System)提供的分布式数据存储一样,它是Apache Hadoop在HDFS基础上提供的一个类Bigatable。

4. Cassandra
Apache Cassandra是一个高性能、可线性扩展、高有效性数据库,可以运行在商用硬件或云基础设施上打造完美的任务关键性数据平台。在横跨数据中心的复制中,Cassandra同类最佳,为用户提供更低的延时以及更可靠的灾难备份。通过log-structured update、反规范化和物化视图的强支持以及强大的内置缓存,Cassandra的数据模型提供了方便的二级索引(column indexe)。

5. Hive
Apache Hive是Hadoop的一个数据仓库系统,促进了数据的综述(将结构化的数据文件映射为一张数据库表)、即席查询以及存储在Hadoop兼容系统中的大型数据集分析。Hive提供完整的SQL查询功能——HiveQL语言,同时当使用这个语言表达一个逻辑变得低效和繁琐时,HiveQL还允许传统的Map/Reduce程序员使用自己定制的Mapper和Reducer。

6. Pig
Apache Pig是一个用于大型数据集分析的平台,它包含了一个用于数据分析应用的高级语言以及评估这些应用的基础设施。Pig应用的闪光特性在于它们的结构经得起大量的并行,也就是说让它们支撑起非常大的数据集。Pig的基础设施层包含了产生Map-Reduce任务的编译器。Pig的语言层当前包含了一个原生语言——Pig Latin,开发的初衷是易于编程和保证可扩展性。

7. Chukwa
Apache Chukwa是个开源的数据收集系统,用以监视大型分布系统。建立于HDFS和Map/Reduce框架之上,继承了Hadoop的可扩展性和稳定性。Chukwa同样包含了一个灵活和强大的工具包,用以显示、监视和分析结果,以保证数据的使用达到最佳效果。

8. Ambari
Apache Ambari是一个基于web的工具,用于配置、管理和监视Apache Hadoop集群,支持Hadoop HDFS,、Hadoop MapReduce、Hive、HCatalog,、HBase、ZooKeeper、Oozie、Pig和Sqoop。Ambari同样还提供了集群状况仪表盘,比如heatmaps和查看MapReduce、Pig、Hive应用程序的能力,以友好的用户界面对它们的性能特性进行诊断。

9. ZooKeeper
Apache ZooKeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、命名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

10. Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库中数据导入Hadoop的HDFS中,也可以将HDFS中数据导入关系型数据库中。

11. Oozie
Apache Oozie是一个可扩展、可靠及可扩充的工作流调度系统,用以管理Hadoop作业。Oozie Workflow作业是活动的Directed Acyclical Graphs(DAGs)。Oozie Coordinator作业是由周期性的Oozie Workflow作业触发,周期一般决定于时间(频率)和数据可用性。Oozie与余下的Hadoop堆栈结合使用,开箱即用的支持多种类型Hadoop作业(比如:Java map-reduce、Streaming map-reduce、Pig、 Hive、Sqoop和Distcp)以及其它系统作业(比如Java程序和Shell脚本)。

12. Mahout
Apache Mahout是个可扩展的机器学习和数据挖掘库,当前Mahout支持主要的4个用例:
- 推荐挖掘:搜集用户动作并以此给用户推荐可能喜欢的事物。
- 聚集:收集文件并进行相关文件分组。
- 分类:从现有的分类文档中学习,寻找文档中的相似特征,并为无标签的文档进行正确的归类。
- 频繁项集挖掘:将一组项分组,并识别哪些个别项会经常一起出现。

13. HCatalog
Apache HCatalog是Hadoop建立数据的映射表和存储管理服务,它包括:
- 提供一个共享模式和数据类型机制。
- 提供一个抽象表,这样用户就不需要关注数据存储的方式和地址。
- 为类似Pig、MapReduce及Hive这些数据处理工具提供互操作性。
Centos集群服务器,公网ip
服务器地址
master: mypetsbj.xicp.net:13283
slave1 : mypetsbj.xicp.net:13282
slave2 : mypetsbj.xicp.net:13286
服务器开机时间
08:00 到 23:59
opt/hadoop
用户名/密码hadoop/wzp
摘要: 处理流程:
假设有一份要传输的文档
使用某一指定算法将此文档内容进行计算,得出一字符串,称为“摘要”
使用私钥将此摘要进行加密,得出一字符串,称为“签名”
将私钥对应的公钥、摘要和签名一同发给对方
对方用公钥对签名进行解密,得出一字符串,与摘要对比,看是否符合,如符合,则证明对方身份确认...
阅读全文
WINDOWS版:
@ECHO OFF
REM @ECHO STARTUP App
REM @ECHO 设置环境变量,循环当前目录下的lib目录下所有jar文件,并设置CLASSPATH
FOR %%F IN (lib\*.jar) DO call :addcp %%F
goto extlibe
:addcp
SET CLASSPATH=%CLASSPATH%;%1
goto :eof
:extlibe
REM @ECHO 当前目录下的bin目录为class文件存放目录,设置bin目录到CLASSPATH中
SET CLASSPATH=%CLASSPATH%;bin\
REM @ECHO 显示CLASSPATH
REM SET CLASSPATH
REM @ECHO 运行应用程序
REM JAVA com.paul.socket.charge.client.ClientJFrame
start javaw com.paul.socket.charge.client.ClientJFrame
LINUX版:
#!/bin/sh
classpath=".:../classes/:../lib/*"
hdfs_input=hadoop/input
hdfs_output=hadoop/output0
mainclass=main.WordFinderMain
classesfolder=/job/classes
java -cp $classpath $mainclass $hdfs_input $hdfs_output $classesfolder
执行脚本:
PIGGYBANK_PATH=$PIG_HOME/contrib/piggybank/java/piggybank.jar
INPUT=pig/input/test-pig-full.txt
OUTPUT=pig/output/test-pig-output-$(date +%Y%m%d%H%M%S)
PIGSCRIPT=analyst_status_logs.pig
#analyst_500_404_month.pig
#analyst_500_404_day.pig
#analyst_404_percentage.pig
#analyst_500_percentage.pig
#analyst_unique_path.pig
#analyst_user_logs.pig
#analyst_status_logs.pig
pig -p PIGGYBANK_PATH=$PIGGYBANK_PATH -p INPUT=$INPUT -p OUTPUT=$OUTPUT $PIGSCRIPT
要分析的数据源,LOG 文件
46.20.45.18 - - [25/Dec/2012:23:00:25 +0100] "GET / HTTP/1.0" 302 - "-" "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)" "-" "-" 46.20.45.18 "" 11011AEC9542DB0983093A100E8733F8 0
46.20.45.18 - - [25/Dec/2012:23:00:25 +0100] "GET /sign-in.jspx HTTP/1.0" 200 3926 "-" "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)" "-" "-" 46.20.45.18 "" 11011AEC9542DB0983093A100E8733F8 0
69.59.28.19 - - [25/Dec/2012:23:01:25 +0100] "GET / HTTP/1.0" 302 - "-" "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)" "-" "-" 69.59.28.19 "" 36D80DE7FE52A2D89A8F53A012307B0A 15
PIG脚本:
--注册JAR包,因为要用到DateExtractor
register '$PIGGYBANK_PATH';
--声明一个短函数名
DEFINE DATE_EXTRACT_MM
org.apache.pig.piggybank.evaluation.util.apachelogparser.DateExtractor('yyyy-MM');
DEFINE DATE_EXTRACT_DD
org.apache.pig.piggybank.evaluation.util.apachelogparser.DateExtractor('yyyy-MM-dd');
-- pig/input/test-pig-full.txt
--把数据从变量所指的文件加载到PIG中,并定义数据列名,此时的数据集为数组(a,b,c)
raw_logs = load '$INPUT' USING org.apache.pig.piggybank.storage.MyRegExLoader('^(\\S+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] "(\\S+) (\\S+) (HTTP[^"]+)" (\\S+) (\\S+) "([^"]*)" "([^"]*)" "(\\S+)" "(\\S+)" (\\S+) "(.*)" (\\S+) (\\S+)')
as (remoteAddr: chararray,
n2: chararray,
n3: chararray,
time: chararray,
method: chararray,
path:chararray,
protocol:chararray,
status: int,
bytes_string: chararray,
referrer: chararray,
browser: chararray,
n10:chararray,
remoteLogname: chararray,
remoteAddr12: chararray,
path2: chararray,
sessionid: chararray,
n15: chararray
);
--过滤数据
filter_logs = FILTER raw_logs BY not (browser matches '.*pingdom.*');
--item_logs = FOREACH raw_logs GENERATE browser;
--percent 500 logs
--重定义数据项,数据集只取2项status,month
reitem_percent_500_logs = FOREACH filter_logs GENERATE status,DATE_EXTRACT_MM(time) as month;
--分组数据集,此时的数据结构为MAP(a{(aa,bb,cc),(dd,ee,ff)},b{(bb,cc,dd),(ff,gg,hh)})
group_month_percent_500_logs = GROUP reitem_percent_500_logs BY (month);
--重定义分组数据集数据项,进行分组统计,此时要联合分组数据集和原数据集统计
final_month_500_logs = FOREACH group_month_percent_500_logs
{
--对原数据集做count,因为是在foreachj里做count的,即使是对原数据集,也会自动会加month==group的条件
--从这里可以看出对于group里的数据集,完全没用到
--这时是以每一行为单位的,统计MAP中的KEY-a对应的数组在原数据集中的个数
total = COUNT(reitem_percent_500_logs);
--对原数据集做filter,因为是在foreachj里做count的,即使是对原数据集,也会自动会加month==group的条件
--重新过滤一下原数据集,得到status==500,month==group的数据集
t = filter reitem_percent_500_logs by status== 500; --create a bag which contains only T values
--重定义数据项,取group,统计结果
generate flatten(group) as col1, 100*(double)COUNT(t)/(double)total;
}
STORE final_month_500_logs into '$OUTPUT' using PigStorage(',');
I am using JAXB and I have a large set of data which i have to marshal into a xml.Since marshalling the whole thing into xml in a single step will be using most of the memory , i want to split it into parts and write to the xml file incremently
For example if my generated output xml should be like this:
<Employees>
<employee>......</employee>
<employee>.....</employee>
<employee>.....</employee>
<employee>.....</employee>
..
...
..
</Employees>
I would like to write the <employee> sections separately into a file instead of writing the whole thing together.I am retrieving the employee details from the database and converting to xml.There are almost 8 lakh records.So marshalling the whole thing in single step will use up my memory.How can i do it?????
Use Stax API (XMLStreamWriter) as the underlying XML processing thing;
write <Employees> tag using that, and then pass XMLStreamWriter to
JAXB Marshaller, marshall employee by employee.
This is the pattern I use; similarly works well with unmarshalling.
Not sure if this is in FAQ or not, but it probably should be.
http://wiki.apache.org/pig/ParameterSubstitution
%pig -param input=/user/paul/sample.txt -param output=/user/paul/output/
PIG中获取
records = LOAD $input;