0%

在安卓手机安装使用 hadoop 遇到的问题

由于新的 termux 在安卓 10 安装不了 Java ,所以在 termux 里安装了 fedora 系统。还有问题,更换了 debian 系统。

准备

  • 在 debian 中使用 apt 安装 java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    useradd hadoop  # 新建用户并给予密码
    passwd hadoop
    # apt install sudo # 可先项
    # vi /etc/sudoers
    # echo "hadoop ALL=(ALL) ALL" >> /etc/sudoers
    alias pk="apt install -y"
    pk openjdk-11-jdk
    pk ssh pdsh # ssh 登陆用
    su - hadoop
    # 配置变量
    vi ~/.bashrc # ~/.zshenv or ~/.zshrc or ~/.profile.d 备选安装 zsh
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64
    export PATH=$JAVA_HOME/bin:$PATH
    :wq
  • 或直接下载 openjdk 版的 java
    JAVA_HOME 是解压后的根目录

配置 ssh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# pk ssh pdsh
export PDSH_RCMD_TYPE=ssh # 配置变量,不配置会出现问题
pdsh -q -w localhost | grep Rcmd # 查看是否 ssh 默认的好像是 rsh ,上面一个命令用来修改

# 配置免密码登陆 ssh ,密钥登陆
ssh-keygen
echo ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# ssh-copy-id
# sed -i 's/^Port/Port 8222/' /etc/ssh/sshd_config
vi /etc/ssh/sshd_config # 修改 sshd 端口 因为手机里不能用 22 端口,也避免与 termux 的 8022 冲突
Port 8222
PubkeyAuthentication yes
:wq

# root 用户启动 sshd
/usr/sbin/sshd # ***容易出问题的地方

# 测试免密码登陆
ssh localhost -p 8222
# pkill sshd

配置 /root/.bashrc 自动启动 sshd

1
[[ -n $SSH_CONNECTION ]] && /usr/sbin/sshd

下载 hadoop 源码并解压

hadoop download

想要安全的话最好校验一下安装包

一些命令问题

1
2
3
4
5
which  jps  # in java home bin
jps # 查看启动了哪些服务,是 namenode 等等
cd $HADOOP_HOME
find . -name "*.cmd" | xargs rm # 删除 window 版的 cmd 避免敲命令的麻烦
bin/hdfs namenode -format # 容易出错点,必须格式化 hadoop 文件系统

git 管理,避免修改错误

1
2
3
4
5
pk git  # 安装 git 版本管理 HADOOP_HOME/etc 文件夹的内容
cd etc
git init && git add . && git commit -m "init" # 需要配置 email name
git commit -m "init" # 再次提交首次修改
cd -

如果要安装多个版本的 hadoop ,需要修改 core-site.xml 的缓存位置

vi etc/hadoop/core-site.xml # 9000 端口容易出问题,可以把端口设置为 9001

1
2
3
4
5
6
7
8
9
...
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9001</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-3.3.0</value>
</property>

修改 hadoop 中的 sshd 端口

1
2
vi etc/hadoop/hadoop-env.sh 
export HADOOP_SSH_OPTS="-p 8222"

下面这些命令可能会在 /tmp 产生文件 *_hadoop jetty- *.pid 当发生错误删除掉这些

1
2
3
4
5
6
7
8
# 启动后 可以用浏览器访问 http://localhost:9870 
sbin/start_dfs.sh # 启动 hdfs hadoop distu file system 分布式文件系统
jps # 查看状态
sbin/stop_dfs.sh # stop

# 浏览器 http://localhost:8088
sbin/start_yarn.sh
sbin/stop_yarn.sh

hdfs 命令

1
bin/hdfs dfs -ls  # - 后面的似乎与 linux 系统命令一样

分布式部署,集群

copy HADOOP_HOME 到其它机器
copy 配置文件
ssh-copy-id

修改 /etc/hosts 对应机器名

参考

w3cschool
hadoop

原文地址:https://toyourheart163.github.io/2021/03/29/hadoop-begining-problem/ 思否镜像

可替换, 中途退换货
自动驾驶(部分)
机器人
xray
防水火、地震、暴力

  • 医疗
    急救包
    器官捐赠
    病人运送
  • 快餐
  • 快递
    生鲜水果

Unix 编程艺术

通信协议就像聊天传输信息一样

1
2
3
4
5
me >>>> you
me <===> you
me >>> mime >> you
me <==> mime <==> you
...
  • 按距离分类
  • 传输过程中需要保密吗?
    • 加密、解密方法
    • 混淆
  • 信息压缩
  • 信息文本编码,读取的方法
    • 文本
      • 中英文
      • 排版方式
    • 二进制
  • 传输频率
    • 多长传一次
  • 信息完整
    • 讲重点
    • 是否动了手脚
      • 经手者
  • 是否到达
    • 被抢劫了?

Shell 有时比 python 还优雅

go help

1
2
go help gopath
go env | grep GOPROXY

golang 配置 enviroment config

go env 查看配置

  • GOPATH 用来查找依赖的包,下载的或者自己的
  • GOROOT go 系统安装的东西的位置
  • GOBIN 命令行位置 与 PATH 配合
  • GOPROXY 镜像
1
2
go env -w GOBIN=$PATH:$PWD/bin  # 设置
go env -u GOBIN # -u unset 删除此配置
1
2
3
4
5
6
7
# ~/.zshrc  or ~/.bashrc or ~/.profile
# 将 GOPATH 设置为新的 window 目录
export GOPATH=$PWD
# 如果设置了 GOPATH=$PWD 当前目录就不能用 go.mod
# go.mod 是模块的意思,就像 python 中的 requirements.txt 包含了包管理需要的包
# go get {url} 时会下载 go.mod 中的包
# go mod vender 用 vender 替换 src 位置 因为以前没有官方包管理工具
go.mod
1
2
3
module github.com/mikele/hello

go 1.14

从 github 下载模块

1
go get https://github.com/toyourheart163/ohmygost

编写自己的模块

google golang module

1
2
3
cd src/github.com/toyourheart163/ohmygost
mkdir music && cd music
vi music.go

编写模块内容

1
2
3
4
module music

func Songs() {}
func Albums() {}

引用模块

1
2
3
4
5
6
7
8
9
10
package main

import (
_ 'github.com/toyourheart163/ohmygost'
)

func main() {
music.Songs()
music.Albums()
}

google 发家的工具

方法

获取信息方法、反爬方法

  1. 获取信息
    • html、css、js、svg
    • json
    • 图片
    • 音频
    • 视频
    • 其他文档
  2. 解析信息
    • 文本
      • xpath
      • css
      • re
      • nltk 自然语言处理,机器学习
    • 图像
      • PIL
      • opencv
      • OCR 光学识别
      • 机器学习
    • 语音
      • google 的语音识别
    • 视频
      • opencv
      • ffmpeg
      • 机器学习
  3. 存储信息
    • 文件
      • html
      • json
      • csv
    • 数据库,数据仓库
      • 关系数据库
        • Mysql、Postgesql
      • 非关系数据库
        • MongoDB
  4. 展示信息
    • 前端展示
      • 可视化
  5. 工具箱
    • Scrapy
    • Pyspider
    • 浏览器插件
    • 其他软件

反爬方法

  • robot.txt
  • nginx 过滤请求头 python
  • 具体请求头过滤
  • ip 过滤
    • geoip
  • 字体
  • 行为验证码
    • 滑动
    • 转动
    • 点触
    • 文字
    • 诗词
    • 计算结果
    • 图像识别
    • 九宫图
  • 风险防控
  • 设备绑定
  • 短信,帐号绑定
  • 带有效时间的,签名
  • 加密证书
  • 混淆
  • 使用极验第三代
  • 使用 google captcha
  • 浏览器指纹
  • 识别无头浏览器
  • 使用 graphql 如 twitter 使用的那样
  • Ajax
  • 假数据
  • 频率限制
  • 分页限制
  • 法律警告
  • GFW

绕过方法

可能需要法律咨询

  • 忽略 robot.txt
  • 频率限制
  • google cache or other cache
  • 改 header 随机 user-agent
    • 尝试改为手机版
    • mitmproxy 修改 response header
  • 改 ip
    • 爬取代理网站的代理. 不稳定
    • 4G 手机切换飞行模式
    • 购买拨号 ip
    • tor 代理
    • scrapyhub 的代理 crawlera
    • heroku 代理 maintenance on/off 改 ip
  • 获取字体文件,一一对应
  • 使用 Chrome 控制台
  • 图像识别
    • 九宫图 => 像素对比
    • OCR
    • 模拟人工轨迹
    • 使用人工
    • 机器识别,神经网络训练
  • 跟网站管理员申请访问权限

二进制转中文

1
2
response = requests.get(url="https://google.com")
response.content.decode('utf-8') # 二进制转中文

urllib 使用

1
2
3
4
5
6
from urllib.parse import unquote, quote, urlencode

quote(url)
unquote(url)
person = {'name': 'li'}
urlencode(person)

如果会 python 了再去看 c 语言教程,那么可以略过很多地方

C 语言基础总结

最简单的 c 程序, 没有输出. 用一个称手的兵器(编辑器)配上语法检查的, 输入

1
2
int main() {
}

需要输出的

main.c
1
2
3
4
5
#include <stdio.h>  // 增加输入输出包

int main() {
printf("OK"); // 语句后面加 `;`
}

编译与执行

1
2
3
4
5
6
7
8
gcc main.c  # 或者 cc main.c  # 编译 
./a.out # 执行, 需要有权限的话就 `chmod a+x a.out` 增加执行权
gcc main.c && ./a.out # 编译执行一起来
gcc -o hello main.c hello.c # 多文件编译
# 如果想修改完后自动执行怎么办?我做了个命令行工具,如果你用 python,安装
pip install seeing
# 自动执行
seeing -f main.c

注释

1
2
/* 多行注释 */
// 单行注释, 跟 javascript 一样

综合

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
#include <stdio.h>

#define char nothin[20] "to your heart" // 全局变量,宏

int main() {
int a; // 先定义类型
a = 666; // 后赋值
printf("%d", a); // 格式化打印

float b = 537.767; // 定义为浮点型,同时赋值
printf("%.2f", b);

char c[20] = "akfjdsl;a"; // 记得字符要用双引号
puts(c); // puts 可以自动换行,但是不能格式化

// 指针,是指在内存中的地址变量
int *p; // 定义指针变量名
int in[2] = {3, 9};
p = in; // 指向in
printf("%p %p %p\n", p, &in, &in[0]); // 指针地址是数组头的地址

char *cc;
char ccc[5] = "bingo";
cc = ccc;
printf("%p %p\n", cc, &(ccc[0]));

int i;
int list[SIZE] = {1,3,5,8,9};
for (i=0; i<SIZE; i++) {
printf("%d ", list[i]);
}
i = 0;
while (i<SIZE) {
printf("%d ", list[i]);
i++;
}
}

struct union

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Person {
char *name;
int age
};

struct person p1;
p1.name = "lisa";
p1.age = 18;

union u_tag {
int ival;
float fval;
char *sval;
} u;

内存管理

1
2
// 不要申请超大内存空间
char s[1024*1024*1024]; //

文件操作

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
/*
FILE *me;
me = fopen("file.txt", "r");
fgetc
fputc
fgets
fputs
fread
fwrite // 二进制时用?
fclose(me);
*/
FILE *me;
char *filename = "file.txt";
me = fopen(filename, "w");
fprintf(me, "ABCJFDKSIE");
fputc('\n', me);
fclose(me);
me = fopen(filename, "r");
char res = EOF;
while ((res = fgetc(me)) != EOF) {
printf("%c", res);
}

rewind(me); // 指针移到文件最前面
char str[1024];
fgets(str, 9, me);
printf("\n%s\n", str);
fclose(me);

系统自带库的使用

1
2
3
4
5
6
7
8
#include <string.h>  // 字符串相关
#include <ctype.h> // 判断单个字符类型
#include <math.h>

/*
strlen
isascii
*/

第三方库

看了3本基础书都没有

拓展阅读

  1. Ben Klemens:21st Century C——C Tips from the New School@2012

pip install debug

1
2
3
4
5
6
➜   py setup.py sdist && py setup.py install
usage: setup.py [-h] [-f FILENAME] [-s seconds] [-c cmd]
setup.py: error: unrecognized arguments: sdist
➜ py setup.py install
usage: setup.py [-h] [-f FILENAME] [-s seconds] [-c cmd]
setup.py: error: unrecognized arguments: install

原因是文件 init.py 中的 argparse 的命令拦截了setup.py

解决方案

1
2
3
# 把 parser.add_argument 放在函数中
def main():
parser.add_argument('-f', '--filename', required=False)

get a bug

1
2
3
4
5
6
7
8
9
10
11
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': (
'rest_framework.pagination.PageNumberPagination',),
...

---
bug
---
self._paginator = self.pagination_class()
TypeError: 'list' object is not callable
[25/Apr/2020 03:21:51] "GET /api/v1/projects/ HTTP/1.1" 500 16449

fix bug

1
2
 'rest_framework.pagination.PageNumberPagination',),
^^^

Why i get this bug

I use pylint to check the codes, settings module is too long in a line more than 79 bit. so i cut down.

people A

  1. push new repo to github

  2. go to https://github.com/{username}/{repo}/settings/access

    example toyourheart163/seeing

  3. invite a collaborator

  4. fill a username and select

people B

  1. check email.
  2. access.
  3. git clone {url}

如何完善自己的知识结构

什么是“知识点”?

  所谓的“知识点”,通常表示某个【有价值】的信息。

知识点的类型

知识点有很多种类型,常见的有如下几种:
【概念性】的知识点——用来表示某种“定义”
【指导性】的知识点——用来表示某种“方法”
【陈述性】的知识点——用来表示某种“事实”

如何应对“知识爆炸”?

  这个词汇很多人都听说过。如今是信息时代,每个学科的知识总量都以非常快的速度膨胀。这对人的脑力是巨大的挑战。即便是在你主攻的一个非常细的细分领域,你也不可能记住所有的知识点。咋办捏?
  刚才列举了三类常见的知识点:描述概念、描述方法、描述事实。头两类的比例很低,但通常都很重要。所以这两类你需要记忆。第三类的比例很大(很可能占总量的 99% 以上),这时候你需要做一些取舍——只记住核心的知识点,舍弃边缘的知识点。
  肯定有同学会问:如何区分哪些是核心的,哪些是边缘的?这又是一个很大的话题,以后抽空单独写一篇介绍。
  还有的同学会问:不记住边缘的知识点,万一今后要用,咋办?
  其实很简单。如今的搜索引擎技术很发达,维基百科也很成熟,还有很多专业的文献检索工具。只要你善于利用计算机和互联网,等到【需要的时候】再临时去查,不难搞定。关于这方面的技巧,可以参考之前的系列博文《如何挖掘网络资源》。