local[N]代表在本地终端运行, 同时使用N个线程, N尽量使用机器CPU核心数量
pyspark --master local[N]
Pyspark方法
方法 | 说明 |
---|---|
sc.master | 查看运行模式 |
sc.textFile(‘file:/usr/readme.txt’) | 读取本地文件, 路径加file, 告诉系统要读取HDFS文件 |
sc.textFile.count() | 显示行数 |
sc.textFile(‘hdfs://naster:9000/a/LICENSE.txt’) | 读取HDFS文件, 路径加hdfs://naster:9000 |
****************************************************************** | ****************************************************************** |
sc.parallelize(List(3, 1, 2, 2, 5)) | 创建intRDD, 转换 运算 |
intRDD.collect() | 转换为List, 动作 运算 |
intRDD.map(函数) | 映射, 转换 运算 |
strRDD.filter(函数) | 过滤映射, 转换 运算 |
intRDD.distinct() | 去重 + 排序 |
strRDD.randomSplit([0.4, 0.6]) | 以随机数的方式按照4:6分成两个RDD |
intRDD.groupBy(函数) | 转换 运算, 需要sorted 动作 运算 |
intRDD1.union(intRDD2).collect() | 并集运算, 类似python list的extend方法 |
intRDD1.intersection(intRDD2).collect() | 交集运算, 类似python set的& |
intRDD1.subtract(intRDD2).collect() | 差集运算, 类似python set的- |
intRDD1.cartesian(intRDD2).collect() | 笛卡尔乘积, 数组每个元素和另外一个数组中元素extend |
intRDD.first() | 动作 运算,取出第一项元素 |
intRDD1.take(4) | 动作 运算, 取出前四项元素 |
intRDD1.takeOrdered(3) | 动作 运算, 从小到大排序, 取出前三个 |
intRDD1.takeOrdered(3, lambda x: -x) | 动作 运算, 从大到小排序, 取出前三个 |
intRDD1.stats() | 统计 |
intRDD1.min() | 最小 |
intRDD1.max() | 最大 |
intRDD1.stdev() | 标准差 |
intRDD1.count() | 计数 |
intRDD1.sum() | 总和 |
intRDD1.mean() | 平均 |
RDD.zipWithIndex() | 将字符串进行编号 |
****************************************************************** | ****************************************************************** |
Key-Value基本转换 运算 | kvRDD1 = sc.parallelize([[1,2], [3,4]]) 每个数组中第一个元素是key |
kvRDD1.keys().collect() | 列出全部key值 |
kvRDD1.values().collect() | 列出全部values值 |
kvRDD1.filter(lambda x: x[0] < 5) | 筛选, 筛选出key < 5 |
kvRDD1.mapValues(lambda x: x * x).collect() | 每个values做平方运算 |
kvRDD1.sortByKey(ascending=True).collect() | 按照key值从小到大排序, 默认是True |
kvRDD1.reduceByKey(lambda x,y:x+y).collect() | MapReduce运算 |
kvRDD1.join(kvRDD2).collect() | join运算, 将两个RDD按照相同的key值 join起来 |
kvRDD1.leftjoin(kvRDD2).collect() | join运算, 将两个RDD按照相同的key值 join起来, 匹配不上, 置为None |
kvRDD1.rightOuterJoin(kvRDD2).collect() | join运算, 将两个RDD按照相同的key值 join起来, 与leftjoin相反 |
kvRDD1.subtractByKey(kvRDD2).collect() | 删除相同key值 的数据 |
kvrdd1.countByKey() | 计算RDD中每一个Key的数量 |
kvrdd1.collectAsMap() | 根据key-value创建字典, value取key的数量最大值 |
kvrdd1.lookup(num) | 根据key查找对应的value |
****************************************************************** | ****************************************************************** |
sc.broadcast(转换之后的字典) | 创建广播变量, 创建后不能被修改 |
RDD.map(lambda x: 广播变量.value[x]).collect | 类似map 映射, 但会存储在内存中, 可节省内存和时间 |
sc.accumulator(初始值(double或int类型)) | 创建累加器,使用.add自增, 在foreach中不能读取累加器的值, 循环外可以使用 |
****************************************************************** | ****************************************************************** |
RDD.persist(存储等级) | 指定存储等级, 默认MEMORY_ONLY 存储在内存中 |
RDD.unpersist() | 取消持久化 |
RDD.is_cached | 是否持久化 |
在Hadoop YARN上运行pyspark
HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop pyspark --master yarn --deploy-mode client
构建Spark独立集群运行环境
- 复制模板文件来创建spark-env.sh
cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh
- 设置spark-env.sh
sudo vim /usr/local/spark/conf/spark-env.sh
- 添加下面
export SPARK_MASTER_IP=master
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=512m
export SPARK_WORKER_INSTANCES=4
连接至data1, data2, data3
ssh data1
,ssh data2
,ssh data3
- 创建spark目录
sudo mkdir /usr/local/spark
- 更改所有者为hduser
sudo chown hduser:hduser /usr/local/spark
- 注销
exit
- 使用scp将master的spark程序复制到data1, data2, data3
- data1
sudo scp -r /usr/local/spark hduser@data1:/usr/local
- data2
sudo scp -r /usr/local/spark hduser@data2:/usr/local
- data3
sudo scp -r /usr/local/spark hduser@data3:/usr/local
- data1
编辑slaves文件
- Spark独立集群都有哪些服务器
sudo vim /usr/local/spark/conf/slaves
- 填写下面信息
data1
data2
data3
在Spark独立集群上运行pyspark
- 启动Spark独立集群
/usr/local/spark/sbin/start-all.sh
- 也可分别运行
/usr/local/spark/sbin/start-master.sh
/usr/local/spark/sbin/start-slaves.sh
- 结束
/usr/local/spark/sbin/stop-all.sh
- 也可分别运行
- 在Spark独立集群运行pyspark程序
pyspark --master spark://master:7077 --num-executors 1 --total-executor-cores 3 --executor-memory 512m
在data1, data2,data3安装Anconda
在Ipython中运行Python Spark程序
- 下载Anaconda2
- 安装Anaconda2
bash Anaconda2-5.3.1-Linux-x86_64.sh -b
- 添加环境变量
sudo vim ~/.bashrc
- 添加下面的东西
export PATH=/home/hduser/anaconda2/bin:$PATH
export ANACONDA_PATH=/home/hduser/anaconda2
export PYSPARK_DRIVER_PYTHON=$ANACONDA_PATH/bin/ipython
export PYSPARK_PYTHON=$ANACONDA_PATH/bin/python
- 使环境变量生效
source ~/.bashrc
- 查看环境变量是否生效
python --version
- 创建Ipython Spark工作目录
mkdir -p ~/pythonwork/ipythonbook cd ~/pythonwork/ipythonbook
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark --master local[*]
- 远程访问jupyter
- 275行 263行 256行 200行
在ipython中使用yarn模式运行
- 切换目录
cd ~/pythonbook/ipythonbook
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook" HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop MASTER=yarn-client pyspark
- 书上的命令不太一样
在ipython中使用Spark独立集群模式运行
- 启动独立集群
/usr/local/spark/sbin/start-all.sh
- 切换目录
cd ~/pythonbook/ipythonbook
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook" HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop MASTER=spark://master:7077 pyspark --num-executors 1 --total-executor-cores 2 --executor-memory 512m
Pysprak机器学习算法
协同过滤式推荐算法
优点 | 缺点 |
---|---|
可以达到个性化推荐 | 冷启动问题(没有历史数据就无法分析) |
不需要内容分析 | 新用户问题: 新用户没有评分, 就不知道他的喜好 |
可以发现用户新的兴趣点 | |
自动化程度高 |
from pyspark.mllib.recommendation import ALS # 协同过滤式算法
from pyspark.mllib.recommendation import Rating # 貌似没用