Spark+hadoop+mllib及相关概念与操作笔记
Spark+hadoop+mllib及相关概念与操作笔记
作者: |
lw |
版本: |
0.1 |
时间: |
2016-07-18 |
1、调研相关注意事项
a) 理解调研
调研的意义在于了解当前情况,挖掘潜在的问题,解决存在的疑问,并得到相应的方案。
b) 调研流程
首先明确和梳理现有的疑问是什么,要通过调研解决什么问题,然后再去做调研,发现问题,再解决问题。
c) 调研成果
最终需要得到结论与方案,以及详尽的论证理由,让别人信服。
d) 书写格式
版本与作者以及时间可以以表格的形式,整齐明了。
结论简洁明了,论证理由详尽写在后面。
2、Linux常见命令
a) Locate 参数
Locate 可能查找不到最新添加的文件,因为它从数据库中找,有的时候没有更新就找不到。
locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。
b) 查看系统版本
Uname -a:显示电脑及操作系统的相关信息
cat /proc/version:说明正在运行的内核版本
cat /etc/issue:显示的是发行版本的信息
lsb_release -a:(适用于所有的linux,包括Redhat、SuSE、Debian等发行版,但是在debian下要安装lsb)
3、Linux环境变量的设置
Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量。
a) 系统级:
/etc/profile:用于交互的Login shell,交互式shell的环境变量。执行bashrc此文件为系统的每个用户设置环境信息,当第一个用户登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:非交互式shell的环境变量。为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。有些linux版本中的/etc目录下已经没有了bashrc文件。
/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
b) 用户级(这些文件处于家目录下)
~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。
~/.bash_profile 、~./bash_login:如果有则不读取.profile( ~/.bash_profile or ~./bash_login - If one of these file exist, bash executes it rather then "~/.profile" when it is started as a login shell. (Bash will prefer "~/.bash_profile" to "~/.bash_login"). However, these files won't influence a graphical session by default.)
~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。
想对所有的用户生效,那就需要设置系统级的环境变量。反之,需要修改用户级的文件(最好是修改.profile文件,理由上面已经讲了)。
c) 生效
Source ~/.profile
4、Hadoop基本命令
Hadoop文件系统命令:hadoop fs -linux命令 参数
Eg: [root@master ~]# hadoop fs -ls /
Eg: [root@master ~]# hadoop fs -cat /lwtest/lw.txt
其中fs是fileSystem,然后 - 后面接一般的linux指令就行,即hadoop文件系统的操作和linux文件系统的操作基本上一致,这样不用浪费时间去记很多命令了。
5、相关概念
Hbase:分布式、面向列的开源数据库
Yarn:Hadoop资源管理器,可以为上层应用提供统一的资源管理和调度,提高资源利用率及方便数据共享
6、Spark集群
a) 命令:clush -a -b jps 显示当前运行的服务进程
b) Spark集群部署方式
参考:
http://www.cnblogs.com/liuyifeng/p/5690627.html
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7115
MR:离线计算框架
Storm:实时计算框架
Spark:内存计算框架
i. Standalone
分别在集群的每台机器安装Spark,再启动相应的master和slave
ii. Spark On Mesos
iii. Spark On Yarn
使用Spark客户端向yarn提交任务运行。
部署方式:
1.将spark部署包放到yarn集群某个节点上面
2.yarn客户端读取yarn集群配置文件,在此过程中,spark的master和slave节点不需要启动
Ps:Yarn(淘宝团队) Mesos(豆瓣)
c) Hadoop web控制台端口
nameNodeIP:端口
Eg:
10.3.9.135:8088 Hadoop资源管理
10.3.9.135:50070 HDFS文件管理,节点信息
http://10.3.9.135:50070/explorer.html#/ 可以查看文件
参见:
http://www.cnblogs.com/laov/p/3433994.html
http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html
帮助理解:
图:Hadoop分布图
图;Hadoop HDFS文件浏览
图:Hadoop常用端口
d) Spark例子运行
./bin/run-example SparkPi 10
./bin/spark-shell --master local[2]
The --master option specifies the master URL for a distributed cluster, or local to run locally with one thread, or local[N] to run locally with N threads. You should start by using local for testing. For a full list of options, run Spark shell with the --help option.
这--master选项指定master url 为一个分布式集群还是本地单线程的,或者local[N]本地N线程的。你应该开始使用本地测试,运行Spark shell --help选项。
e) Mllib例子运行
./bin/run-example mllib.JavaKMeans mllibTestData/kmeans_data.txt 3 100
mllib.JavaKMeans为相应的机器学习程序,是mllib文件夹下的JavaKMeans,后面三个是数据集 及相应参数。这里是K均值算法,后面3表示K的大小,100表示迭代次数。
f) Job提交
参考:http://spark.apache.org/docs/latest/submitting-applications.html
# 本地8线程运行应用
# Run application locally on 8 cores
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
Eg:./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ./lib/spark-examples-1.6.1-hadoop2.7.1.jar 10
# 单集群
# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# Run on a Spark standalone cluster in cluster deploy mode with supervise
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
#在Spark on Yarn的集群上提交应用 (目前的集群)
#Run on a YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
Eg:
[root@master spark-1.6.1]#
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./lib/spark-examples-1.6.1-hadoop2.7.1.jar \
10
其中SparkPi是通过蒙特卡罗思想就Pi的算法,10为其参数,大概指的是在单位为10的一个正方形里,正方形里包含一个半径为5的圆,然后生成随机数,均匀分布,数点落在圆里的数及全部的点数,通过面积的比例等于随机数分布的比例来求得Pi.
--deploy-mode cluster 在Yarn集群中需要指定。
g) 结果查看
参考:
http://www.360doc.com/content/14/0810/12/7853380_400765442.shtml
http://www.iteblog.com/archives/1028
System.out.println("Pi is roughly " + 4.0 * count / n);
在yarn上运行,程序默认输出直接输出到logs里面。
Yarn logs -applicationId xxx 可以查看运行结束的Application日志
Eg:
yarn logs -applicationId application_1467954918322_0037
输出:
…省略…
LogType:stdout
Log Upload Time:星期一 七月 25 11:18:59 +0800 2016
LogLength:23
Log Contents:
Pi is roughly 3.141328
End of LogType:stdout
…省略…
当然可以将结果输出到文本里面,代码:
counts.saveAsTextFile("/home/wyp/result");
或者:
counts.saveAsHadoopFile("/home/wyp/result",
Text.class,
IntWritable.class,
TextOutputFormat.class);
将结果存储到HDFS上的/home/wyp/result文件夹里,第一种输出格式是(key,value),第二种输出格式为key value.
我们可以根据自己的需要定义一个自己的输出格式,而且我们在输出的时候如果文件比较大,还可以指定输出文件的压缩方式。
h) 日志
hdfs dfs -ls /tmp/logs/root/logs/tmp/logs/root/logs/application_1467954918322_0059
Hadoop下spark应用日志存在/tmp/logs/root/logs/tmp/logs/root/logs/下面。每个应用id对应一个目录,里面有在不同节点上跑的日志的相应记录。同Yarn logs -applicationId xxx 所看到的信息。
7、Maven与eclipse
a) 安装Maven
http://dead-knight.iteye.com/blog/1841658
- 安装maven,并设置环境变量(网上有的是)
- 查看配置是否完成。mvn -v 出现版本信息,表示配置成功
- 设置仓库位置
默认的maven仓库位置为:C:\Users\Administrator\.m2(其中Administrator为当前账号)
仓库是用来存Maven运行时的一此插件的。比说archetyper的插件。
b) Eclicpse安装maven插件
Maven插件下载:http://pan.baidu.com/s/1i5weBZZ
解压后,把links、myplugins文件夹放到eclipse安装目录下,如下图所示:
并且修改links下的maven.link文件。指向myplugins目录即可。我的配置为:
path=F:/android/adt-bundle-eclipse/eclipse/myplugins/maven
重启eclipse
选择window->preferences->maven,如下图所示:
继续选择“User Settings”,配置maven的setting文件,如下图所示:
好,此时maven插件安装完毕。
c) 查看maven的console
d) 注意事项
Maven-archetype-quickstart与maven-archetype-profiles结构是一样的,即profiles即为quickstart.
e) 错误处理
i. Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
解决方式:
- 从http://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.1/maven-archetype-quickstart-1.1.jar下载最新版maven-archetype-quickstart-1.1.jar
- 命令行到下载目录下执行mvn install:install-file -DgroupId=org.apache.maven.archetypes -DartifactId=maven-archetype-quickstart -Dversion=1.1 -Dpackaging=jar -Dfile=maven-archetype-quickstart-1.1.jar
出现BUILD SUCCESS则表示安装成功了,就可以通过eclispe建quickstart结构的工程了。如下图所示:
f) Pom.xml红叉
http://www.cnblogs.com/mymelody/p/5616685.html
- dependency格式不对,或者jar包没有,使得对应的包没有下载下来
- eclipse没有自己下载,出现missing情况
解决方法:
- 找到我们的本地maven仓库目录比如我的D:\java\mymaven
- 搜索出该目录下的*lastUpdated.properties文件并删除,如下图所示,可以通过模糊搜索匹配出这样的文件
- Maven 更新当前项目,maven就会继续下载缺失的依赖jar包,直至缺失jar包下载完成,上述问题就解决了。
g) 远程仓库
参考:http://www.cnblogs.com/dingyingsi/p/3856456.html
仓库:
http://repo2.maven.org/maven2/
Other:
https://repository.jboss.org/nexus/content/repositories/releases/
http://repository.jboss.org/nexus/content/groups/public/
8、遇到错误
9、数据接入
http://blog.csdn.net/woshiwanxin102213/article/details/17584043
http://www.csdn.net/article/2015-02-13/2823955?ref=myread
Hive:是建立在Hadoop上的数据仓库基础构架。所有Hive数据都存储在Hadoop兼容的文件系统中(例:Amazon S3、HDFS)中。Hive在加载数据过程中不会对数据进行任何修改,只是将数据移动到HDFS中Hive设定目录下,因此,Hive不支持对数据的改写和添加。
HBase:分布式面向列的开源数据库。不同于一般的关系数据库,它适用于非结构化存储数据库。
JDBC:关系型数据库方访问API,可以访问多种数据库
Spark SQL:摆脱了对Hive的依赖,兼容Hive,可以从RDD、PARQUET文件、JSON文件中获取数据。
http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool
http://www.csdn.net/article/2015-04-03/2824407
http://www.cnblogs.com/gaopeng527/p/4315808.html
内部:
http://developer.51cto.com/art/201603/507668.htm
RDD:(Resilient Distributed Datasets)弹性分布式数据集
DataFrame:是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格,被用于SQLContext相关操作。
DataSet:Dataset可以认为是DataFrame的一个特例,主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row。
a) Spark sql连接mysql
- 下载mysql-connector-java-5.1.39-bin.jar http://www.itcast.cn/news/20151229/16012088060.shtml
10、HBase
a) Hbase shell
./hbase shell 进入 hbase shell.
http://www.cnblogs.com/heyCoding/archive/2012/11/09/2762334.html
scan ‘CityWeather’ , {VERSION => 10}
注意VERSION与VERSIONS的区别,一个是指定版本,一个是列出几个版本。
11、算法运行及结果
a) linear regression(线性回归)
i. JavaHdfsLR <file> <iters>
javaHdfsLR<文件><迭代次数>
本地:
./bin/spark-submit --class org.apache.spark.examples.JavaHdfsLR --master local ./lib/spark-examples-1.6.1-hadoop2.7.1.jar mllibTestData/lr_data.txt 1
集群:
./bin/spark-submit --class org.apache.spark.examples.JavaHdfsLR --master yarn --deploy-mode cluster ./lib/spark-examples-1.6.1-hadoop2.7.1.jar mllibTestData/lr_data.txt 1
结果:
LogType:stdout
Log Upload Time:星期一 七月 25 16:46:12 +0800 2016
LogLength:442
Log Contents:
Initial w: [0.4551273600657362, 0.36644694351969087, -0.38256108933468047, -0.4458430198517267, 0.33109790358914726, 0.8067445293443565, -0.2624341731773887, -0.44850386111659524, -0.07269284838169332, 0.5658035575800715]
On iteration 1
Final w: [246.25860765580322, 270.70869288178557, 371.354007739464, 357.4478152969409, 261.9494718512335, 210.01734831542458, 366.7061915626602, 381.34754796597383, 335.20416843810943, 240.24079035615807]
End of LogType:stdout
ii. JavaLR <input_dir> <step_size> <niters>
JavaLR<输入文件><步长大小><迭代次数>
./bin/spark-submit --class org.apache.spark.examples.mllib.JavaLR --master yarn --deploy-mode cluster ./lib/spark-examples-1.6.1-hadoop2.7.1.jar mllibTestData/lr-data/random.data 1 10
结果:
LogType:stdout
Log Upload Time:星期一 七月 25 17:03:14 +0800 2016
LogLength:47
Log Contents:
Final w: [0.6262094779767464,0.535113798652265]End of LogType:stdout